Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.35 KB | None | 0 0
  1. // Can be used as generic method to retrieve NavArgs? in the BaseViewModel
  2. // usage val viewModel by navArgsReflection()
  3.  
  4. class NavArgsReflectionLazy<Args : NavArgs?>(
  5. private val navArgsClass: KClass<out Fragment>,
  6. private val arguments: () -> Bundle?
  7. ) :
  8. ReadOnlyProperty<Any?, Args?> {
  9.  
  10. private var navArgs: NavArgsLazy<*>? = null
  11.  
  12. override fun getValue(thisRef: Any?, property: KProperty<*>): Args? {
  13. if (navArgs == null) {
  14. val localArguments = arguments.invoke() ?: return null
  15.  
  16.  
  17. val className = "${navArgsClass.java.canonicalName}Args"
  18.  
  19. // Let's check if Args class actually exists
  20. val navArgsClass = requireNotNull(getArgNavClass(className)) {
  21. "Arguments where passed to a fragment, but corresponding argument class $className does not exist. Arguments: $arguments"
  22. }
  23.  
  24. navArgs = NavArgsLazy(navArgsClass) { localArguments }
  25. }
  26.  
  27. @Suppress("UNCHECKED_CAST")
  28. return navArgs?.value as Args
  29. }
  30.  
  31. private fun getArgNavClass(className: String): KClass<NavArgs>? = try {
  32. @Suppress("UNCHECKED_CAST")
  33. Class.forName(className).kotlin as KClass<NavArgs>
  34. } catch (e: ClassNotFoundException) {
  35. null
  36. }
  37. }
  38.  
  39. @MainThread
  40. fun Fragment.navArgsReflection() = NavArgsReflectionLazy<NavArgs>(this::class) { arguments }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement