Android MVVM。传递具有Context作为依赖项的对象

我有一个<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="wrapper"> <div class="content"> Lorem ipsum dolor sit amet,consetetur sadipscing elitr,sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet,no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet,consectetuer adipiscing elit,sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam,quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet,sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam,quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,At accusam aliquyam diam diam dolore dolores duo eirmod eos erat,et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren,kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet,consetetur </div> <div class="show-more-wrapper"> <button>Show more</button> </div> </div>,它接受​​模型作为构造函数参数之一。 viewmodelMainmodel(我需要它来注册context)。

broadcastReceiver

我知道class MainViewModel(private val test: MyTestReiverHandler) : ViewModel() { } class MyTestReiverHandler(context: Context) { init { val intentFilter = IntentFIlter() intentFiler.addaction("android.net.conn.CONNECTIVITY_CHANGE") context.registerReceiver(receiver,intentFiler) } fun doSomething() { // do something.... } } 不应引用viewmodel's。那么这种方法是正确的吗? 还是应该将所有需要context的东西(例如位置接收器,广播接收器……)都以contextview级别进行处理?然后作为结果传递给activity

编辑

我还将添加另一个我有viewmodel的示例,该示例具有可以请求某种权限的活动。我想对我的所有Permissionmanager使用该管理器,在我的viewmodels中使用某种以activity作为参数的管理器是一个好主意吗?我知道直接将viewmodelscontextactivity传递给我的views是不好的。但是在我的viewmodel

中包含其他具有contextactivity(例如Permissionmanager)的对象是否很好?
viewModel
supportjj 回答:Android MVVM。传递具有Context作为依赖项的对象

您可以从 AndroidViewModel(应用程序:应用程序)(而不是ViewModel)扩展您的 MainViewModel 。 现在您可以使用 MainViewModel ,就像befor和 application 实例可用于注册 broadcastReceiver

class MainViewModel(application: Application) : AndroidViewModel(application) {

}

活动/片段

val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

这是正确和容易的。

  

所有需要上下文的东西,例如位置接收器,广播接收器……都应该在活动级别中进行处理吗?

不是所有人。我曾经在跟踪用户位置的应用程序上工作。由于该应用需要长时间跟踪用户位置,并且其他操作同时进行。我决定在另一个线程中执行此操作,并让ViewModel分别广播结果。存储库还需要上下文来构建Room数据库。 ViewModel需要上下文来实例化存储库。这就是为什么我们在 ViewModel 上使用 AndroidViewModel 的原因。如果您愿意,可以实施依赖注入来避免这种依赖问题

,

即使您的useCase并不完全清楚,我想如果您的用户触发了某些事件,您也需要调用此类的函数。 在这种情况下,我建议以下几点:

<data>

    <variable
        name="receiverHandler"
        type="your.package.MyTestReiverHandler" />

    <variable
            name="viewModel"
            type="your.package.MainViewModel"/>
</data>

这将允许您将此ReceiverHandler传递到viewModel的函数中

<View
     android:onClick="@{viewModel.doSomething(receiverHandler)}" />

创建绑定时,可以实例化ReceiverHandler并将其注入。 构建此布局文件后,将<variable ../>的fieldName用于绑定。

override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {
    val binding = DataBindingUtil.inflate<MainFragmentBinding>(inflater,R.layout.fragment_main,container,false)
    binding.viewModel = viewModel
    binding.lifecycleOwner = this
    binding.receiverHandler = MyTestReiverHandler(container?.context?.applicationContext!!)

如果您需要通过观察viewModel的属性来调用函数,则不需要将其注入到viewModel中,因此我对用户交互的假设。

  

注意:仅当您要调用此特定类的函数时,layout.xml中<import ..>层次结构中的任何<data .. />才是必需的。

本文链接:https://www.f2er.com/3048122.html

大家都在问