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

时间:2019-06-25 06:52:12

标签: android androidx android-jetpack kotlin-android-extensions android-viewmodel

我正在为活动及其所有片段使用Single viewModel。

因此,如果必须在所有片段的const name = 'preceding_text_0_following_text'; const matcher = /(\d+)/; // Replace with whatever you would like const newName = name.replace(matcher, 'NEW_STUFF'); console.log("Full replace", newName); // Perform work on the match and replace using a function // In this case increment it using an arrow function const incrementedName = name.replace(matcher, (match) => ++match); console.log("Increment", incrementedName);中编写此设置代码,则要初始化viewmodel

onActivityCreated

我正在浏览Android KTX扩展页面:(refer here

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

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

因此我将以下依赖项添加到了gradle(app)中:

    // 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" 时,找不到它们的引用。

我希望获得有关如何使用这些扩展名的帮助,并提供一些我尝试搜索示例的基本示例。

10 个答案:

答案 0 :(得分:3)

最后我们有了稳定的版本。

移到implementation 'androidx.fragment:fragment-ktx:1.1.0'之后,我遇到了另一个问题。

编译器错误:

  

无法将使用JVM target 1.8构建的字节码内联到以下字节码中   用JVM target 1.6构建的

build.gradle(Module:app)

compileOptions {
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }

reference

应用上述所有方法后,问题已解决。

谢谢大家。

答案 1 :(得分:2)

尝试

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

答案 2 :(得分:1)

试试这个。它对我有用。

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

答案 3 :(得分:0)

您使用此最新的Alpha版本:

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

答案 4 :(得分:0)

扩展功能viewModels(...)已在版本1.1.0-alpha03中添加。因此,为了在您的应用程序中使用它,您将必须实现与1.1.0-alpah03或更高版本匹配的fragment-ktx。

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

答案 5 :(得分:0)

请注意,您可以使用Koin来完成这项工作:

private val viewModel by viewModel<NoteViewModel>()

将使用导入

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

来自依赖项:

implementation "org.koin:koin-android-viewmodel:+" //当您阅读此书时,将+更改为w / e是最新的

答案 6 :(得分:0)

您可以实施

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

实际上,KTX包中的BY viewModels实现看起来像这样,您也可以自己实现扩展功能

@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)
}

答案 7 :(得分:0)

注意:这也适用于 Jetpack Compose

HERE 复制依赖项

目前 2021 June 5 的依赖如下:

dependencies {
    val activity_version = "1.2.3"

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

答案 8 :(得分:0)

对于谷歌员工:您的 Activity 应该继承 AppCompatActivity,而不是 Activity

答案 9 :(得分:0)

如果您想对视图模型使用 kotlin 委托,我认为您需要为您的活动建立这种依赖关系

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