首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以注入活动的视图模型并在对话框片段中使用它吗

我可以注入活动的视图模型并在对话框片段中使用它吗
EN

Stack Overflow用户
提问于 2019-08-29 20:14:10
回答 1查看 1.1K关注 0票数 0

我正在尝试注入activity的视图模型,我想在对话框片段中使用它,如何用Kodein注入它?并使用我之前在其他活动或片段中注入的视图模型。

我尝试过medium的教程这里是教程

https://proandroiddev.com/android-viewmodel-dependency-injection-with-kodein-249f80f083c9

我试图从活动的视图模型访问注入结果,但是当我尝试从对话框片段访问viewModel中的某个对象时,该值为空,与活动的viewModel不同

代码语言:javascript
运行
复制
// This is from Activity
private val viewModelFactory: TriplogisticViewModelFactory by instance()
    private val viewModel: TriplogisticViewModel by lazy {
        ViewModelProviders
            .of(this@ContactDetailBottomSheetDialogFragment, viewModelFactory)
            .get(TriplogisticViewModel::class.java)
}
代码语言:javascript
运行
复制
Log.e("VIEWMODEL_ACTIVITY", viewModel.mode.get().toString) // result is SENDER_MODE

我希望当我访问对话框片段的viewModel中的某个对象时,我会得到与activity的viewModel相同的值

代码语言:javascript
运行
复制
// This is from Dialog Fragment
private val viewModelFactory: TriplogisticViewModelFactory by instance()
    private val viewModel: TriplogisticViewModel by lazy {
        ViewModelProviders
            .of(this@ContactDetailBottomSheetDialogFragment, viewModelFactory)
            .get(TriplogisticViewModel::class.java)
}

我想要与activity的viewModel对象相同的结果,但我得到的结果为空

代码语言:javascript
运行
复制
Log.e("VIEWMODEL_FRAGMENT", viewModel.mode.get().toString) // result is null
EN

回答 1

Stack Overflow用户

发布于 2019-08-29 20:45:16

您必须使用shared ViewModel。使用activity owner实例化ViewModel。看起来像这样:

代码语言:javascript
运行
复制
class SharedViewModel : ViewModel() {
    val selected = MutableLiveData<Item>()

    fun select(item: Item) {
        selected.value = item
    }
}

class MasterFragment : Fragment() {

    private lateinit var itemSelector: Selector

    private lateinit var model: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        model = activity?.run {
            ViewModelProviders.of(this)[SharedViewModel::class.java]
        } ?: throw Exception("Invalid Activity")
        itemSelector.setOnClickListener { item ->
            // Update the UI
        }
    }
}

class DetailFragment : Fragment() {

    private lateinit var model: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        model = activity?.run {
            ViewModelProviders.of(this)[SharedViewModel::class.java]
        } ?: throw Exception("Invalid Activity")
        model.selected.observe(this, Observer<Item> { item ->
            // Update the UI
        })
    }
}

有关详细信息,请单击here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57709982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档