【问题标题】:How to move the Koin ViewModel injection to the Base fragment?如何将 Koin ViewModel 注入移动到 Base 片段?
【发布时间】:2021-08-28 20:45:40
【问题描述】:

我使用 Koin 进行依赖注入,同时也使用 ViewModel 注入。我有 几个 Fragments对应的 ViewModel

class Fragment1 : BaseFragment(R.layout.fragment1) { 
   private val viewModel: Fragment1ViewModel by inject()  
      
   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewModel.testVM1()
    }
}  
  
class Fragment2 : BaseFragment(R.layout.fragment2) { 
   private val viewModel: Fragment2ViewModel by inject()  
      
   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewModel.testVM2()
    }
}  

对于所有片段,我使用 BaseFragment

class BaseFragment(@LayoutRes private val layoutId: Int) : Fragment() {   

   override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View = inflater.inflate(layoutId, container, false)
}   

我的目标是将 ViewModel 注入 BaseFragment 并在子 Fragment 中使用该变量。

我把代码改成如下:

class BaseFragment<T: ViewModel>(@LayoutRes private val layoutId: Int) : Fragment() {   
   val viewModel: TypeToken<T> by inject() 

   override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View = inflater.inflate(layoutId, container, false)
}   

class Fragment1 : BaseFragment<Fragment1ViewModel>(R.layout.fragment1) {

   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewModel.testVM1() // Unresolved reference: testVM1()
    }
}  

class Fragment2 : BaseFragment<Fragment2ViewModel>(R.layout.fragment2) { 

   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewModel.testVM2() // Unresolved reference: testVM2()
    }
}   

但在这种情况下,我在调用子片段中的方法时收到错误 Unresolved reference: testVM1()/testVM2()

问题:如何更改代码以使其正常工作?谢谢

【问题讨论】:

    标签: android viewmodel koin


    【解决方案1】:

    查看我的实现。 这是一个基础片段:

    abstract class BaseFragment<VM: ViewModel, VB: ViewBinding> : Fragment() {
    
    protected abstract val viewModel: VM
    protected lateinit var viewBinding: VB
    private var _view: View? = null //cached view
    
    protected abstract fun inflateViewBinding(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): VB
    protected abstract fun bindViewBinding(view: View): VB
    
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        setHasOptionsMenu(true)
    
        if(_view == null) {
            viewBinding = inflateViewBinding(inflater, container, savedInstanceState)
            _view = viewBinding.root
        } else {
            viewBinding = bindViewBinding(_view!!)
        }
        return _view
    }
    

    }

    并且,将它实现到任何其他片段,如下所示:

    class SplashFragment : BaseFragment<AuthViewModel, FragmentSplashBinding>() {
    
    override val viewModel: AuthViewModel by viewModel()
    
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
    
    
        viewModel.someMethod()
    
        return super.onCreateView(inflater, container, savedInstanceState)
    } ....
    

    【讨论】:

    • 感谢您的回复,但我可以将by viewModel() 移动到BaseFragment 并将by viewModel() 与泛型一起使用吗?因为我只想使用来自BaseFragmentviewModel 变量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多