带 Hilt 的活动片段通信

Posted

技术标签:

【中文标题】带 Hilt 的活动片段通信【英文标题】:Activity-Fragment Communication w/ Hilt 【发布时间】:2021-09-27 15:08:53 【问题描述】:

我有一个只有一个 Activity 但有很多 Fragment 的应用。我正在使用ViewModel 进行活动片段通信。最近,我在使用 Hilt,但现在在我的 Activity 和 Fragment 之间进行通信时遇到了问题。

我的视图模型

@HiltViewModel
class AppViewModel @Inject internal constructor(
): ViewModel() 

    private var _data = MutableLiveData<String>()
    val data: LiveData<String>
        get() = _data
    fun insertData(dataStr: String) 
        _data.value = dataStr
    

我的主要活动

@androidEntryPoint
class MainActivity : AppCompatActivity() 

    private val mViewModel: AppViewModel by viewModels()
    private var dataString: String? = null

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)

        mViewModel.data.observe(this, 
            dataString = it
        )
    

我的一个片段

@AndroidEntryPoint
class ReportFragment : Fragment() 

    private val reportViewModel: ReportViewModel by viewModels()
    private val appViewModel: AppViewModel by viewModels()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View  
        ...
        appViewModel.insertData("Hello")
        ...
    

当我运行应用程序时,由于data,我得到了null。有什么办法可以解决这个问题?

【问题讨论】:

使用activityViewModels&lt;AppViewModel&gt; 获取共享视图模型。现在您有两个视图模型实例。 【参考方案1】:

不确定这是否是确切的问题,但是您可以使用 by activityViewModels&lt;AppViewModel&gt; 而不是 by viewModelsfragment 中获得 ViewModel

编辑:

另外,我刚刚注意到您正在使用internal 构造函数。尝试只使用一次inject constructor,如果它为您解决了问题,请告诉我:)

【讨论】:

嗨!谢谢!我测试了 w/ 和 w/o 内部,但两者都有效。什么是最佳做法,您能解释一下吗? 请在这里找到internal修饰符的完整解释:) kotlinlang.org/docs/visibility-modifiers.html#constructors

以上是关于带 Hilt 的活动片段通信的主要内容,如果未能解决你的问题,请参考以下文章

在片段和活动之间进行通信 - 最佳实践

无法通过接口获取与片段通信的活动

如何使用接口在片段和活动之间进行通信?

如何在嵌套片段内的两个子片段之间进行通信

与另一个片段通信的片段接口

片段通信问题(尝试调用虚方法)