如何通过 viewModel 获得 viewModel? (片段-ktx)

我使用的是针对活动和它的所有片段的单一视图模型。

所以初始化 viewmodel,如果必须在所有片段的 onActivityCreated中编写这个设置代码

    override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(activity!!).get(NoteViewModel::class.java)
}

我正在浏览 Android KTX 扩展页面: (请参阅此网页)

我发现我可以像这样初始化视图模型:

    // Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()


// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()

因此,我在我的分级(应用程序)中添加了依赖项下面的内容:

    //ktx android
implementation 'androidx.core:core-ktx:1.0.2'
implementation 'androidx.fragment:fragment-ktx:1.0.0'
implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"

但是当我尝试在我的应用程序中使用 viewModels/activityViewModels时,他们的参考文献没有找到。

我想帮助如何使用这些扩展的一些基本的例子,我试图搜索的例子没有找到任何。

96001 次浏览

试试看

implementation 'androidx.fragment:fragment-ktx:1.1.0-beta02'

2021年最新情况

这已经不是测试版了。在编写本文时,它可以与最新的稳定版本一起工作。您还需要将其导入到碎片的 Kotlin 文件中。

implementation 'androidx.fragment:fragment-ktx:1.3.2'
import androidx.fragment.app.activityViewModels

你可以使用最新的 alpha 版本:

dependencies {
implementation 'androidx.fragment:fragment-ktx:1.2.0-alpha01'
}

在版本 1.1.0-alpha03中添加了扩展函数 viewModel (...)。因此,为了在应用程序中使用它,您必须实现与1.1.0-alpah03或更高版本匹配的片段 -ktx。

我刚刚发现这个问题,所以我使用了 1.1.0-rc01版本,因为我不想使用 alpha/beta 版本。

最后我们得到了稳定的版本。

在转到 implementation 'androidx.fragment:fragment-ktx:1.1.0'之后,我面临着另一个问题。

编译器错误:

无法将使用 JVM 目标1.8构建的字节码内联到 使用 JVM target 1.6构建

Build.gradle (模块: app)

compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}


kotlinOptions {
jvmTarget = "1.8"
}

参考文献

在应用了以上所有方法之后,问题就解决了。

如果你来这里是为了解决 Koin 的问题:

注意,你可以使用 Koin 来实现这个功能:

private val viewModel by viewModel<NoteViewModel>()

将使用进口

import org.koin.android.viewmodel.ext.android.viewModel

从依赖中解脱出来:

当你阅读本文时,implementation "org.koin:koin-android-viewmodel:+"//change + to w/e 是最新的

您可以实现

implementation 'androidx.fragment:fragment-ktx:1.1.0'

实际上,KTX 包中的 BY viewModel 实现如下所示,您也可以自己实现一个扩展函数

@MainThread
inline fun <reified VM : ViewModel> ComponentActivity.viewModels(
noinline factoryProducer: (() -> ViewModelProvider.Factory)? = null
): Lazy<VM> {
val factoryPromise = factoryProducer ?: {
val application = application ?: throw IllegalArgumentException(
"ViewModel can be accessed only when Activity is attached"
)
ViewModelProvider.AndroidViewModelFactory.getInstance(application)
}


return ViewModelLazy(VM::class, { viewModelStore }, factoryPromise)
}

试试这个,我喜欢。

implementation "androidx.fragment:fragment-ktx:1.2.5"

注意: 这也适用于 Jetpack Compose

给你复制依赖项

目前,从属关系如下:

dependencies {
val activity_version = "1.2.3"


// Java language implementation
implementation("androidx.activity:activity:$activity_version")
// Kotlin
implementation("androidx.activity:activity-ktx:$activity_version")
}

对于 google 用户 : 你的活动应该继承 AppCompatActivity,而不是活动

我认为如果你想使用 kotlin 代表团作为视图模型,你需要对你的活动有这种依赖性

//ViewModels delegation extentensions for activity
implementation 'androidx.activity:activity-ktx:1.3.1'

您可以像下面这样实现 fragment-ktx库来修复它

def fragment_version = "1.4.0"


implementation("androidx.fragment:fragment-ktx:$fragment_version")

查看更多信息并检查最新版本 给你

更新日期2022年4月29日


你应该用这个:

dependencies {
implementation "androidx.fragment:fragment-ktx:1.4.1"
}

更多资料:

Https://developer.android.com/topic/libraries/architecture/viewmodel#implement

Https://developer.android.com/kotlin/ktx#fragment