【问题标题】:Activity-Fragment Communication w/ Hilt带 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; 获取共享视图模型。现在您有两个视图模型实例。

标签: android kotlin android-fragments android-activity dagger-hilt


【解决方案1】:

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

编辑:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
相关资源
最近更新 更多