带 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<AppViewModel>
获取共享视图模型。现在您有两个视图模型实例。
【参考方案1】:
不确定这是否是确切的问题,但是您可以使用 by activityViewModels<AppViewModel>
而不是 by viewModels
在 fragment
中获得 ViewModel
编辑:
另外,我刚刚注意到您正在使用internal
构造函数。尝试只使用一次inject constructor
,如果它为您解决了问题,请告诉我:)
【讨论】:
嗨!谢谢!我测试了 w/ 和 w/o 内部,但两者都有效。什么是最佳做法,您能解释一下吗? 请在这里找到internal
修饰符的完整解释:) kotlinlang.org/docs/visibility-modifiers.html#constructors以上是关于带 Hilt 的活动片段通信的主要内容,如果未能解决你的问题,请参考以下文章