如何通过viewModels获取viewModel? (片段-ktx)
how to get viewModel by viewModels? (fragment-ktx)
我正在为 Activity 及其所有片段使用 Single viewModel。
所以要初始化 viewmodel
如果必须在所有片段的 onActivityCreated
中编写此设置代码
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(activity!!).get(NoteViewModel::class.java)
}
我正在浏览 Android KTX 扩展页面:(refer here)
我发现我可以像这样初始化视图模型:
// 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>()
所以我将以下依赖添加到我的 gradle(app):
//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
时,找不到它们的参考。
我需要有关如何将这些扩展程序与一些基本示例一起使用的帮助,我尝试搜索示例但未找到任何示例。
尝试
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 中添加了扩展函数 viewModels(...)。因此,为了在您的应用中使用它,您必须实施匹配 1.1.0-alpah03 或更高版本的 fragment-ktx 版本。
我刚发现这个,所以我使用版本 1.1.0-rc01 因为我不想使用 alpha/beta 版本。
终于有稳定版了
搬到 implementation 'androidx.fragment:fragment-ktx:1.1.0'
后,我遇到了另一个问题。
###编译器错误:
Cannot inline bytecode built with JVM target 1.8 into bytecode that is
being built with JVM target 1.6
###build.gradle(模块:应用程序)
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:+"
// 将 + 更改为 w/e 是最新的,当你阅读这篇文章时
你可以实现
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)
}
试试这个。对我有用。
implementation "androidx.fragment:fragment-ktx:1.2.5"
注意:这也适用于 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")
}
对于 googlers:您的 Activity 应该继承 AppCompatActivity,而不是 Activity
如果你想为视图模型使用 kotlin 委托,我认为你的 activity 需要有这种依赖关系
//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")
查看更多内容并查看最新版本 here。
2022 年 4 月 29 日更新
你应该使用这个:
dependencies {
implementation "androidx.fragment:fragment-ktx:1.4.1"
}
更多信息:
https://developer.android.com/topic/libraries/architecture/viewmodel#implement
我正在为 Activity 及其所有片段使用 Single viewModel。
所以要初始化 viewmodel
如果必须在所有片段的 onActivityCreated
中编写此设置代码
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(activity!!).get(NoteViewModel::class.java)
}
我正在浏览 Android KTX 扩展页面:(refer here)
我发现我可以像这样初始化视图模型:
// 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>()
所以我将以下依赖添加到我的 gradle(app):
//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
时,找不到它们的参考。
我需要有关如何将这些扩展程序与一些基本示例一起使用的帮助,我尝试搜索示例但未找到任何示例。
尝试
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 中添加了扩展函数 viewModels(...)。因此,为了在您的应用中使用它,您必须实施匹配 1.1.0-alpah03 或更高版本的 fragment-ktx 版本。
我刚发现这个,所以我使用版本 1.1.0-rc01 因为我不想使用 alpha/beta 版本。
终于有稳定版了
搬到 implementation 'androidx.fragment:fragment-ktx:1.1.0'
后,我遇到了另一个问题。
###编译器错误:
Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6
###build.gradle(模块:应用程序)
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:+"
// 将 + 更改为 w/e 是最新的,当你阅读这篇文章时
你可以实现
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)
}
试试这个。对我有用。
implementation "androidx.fragment:fragment-ktx:1.2.5"
注意:这也适用于 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")
}
对于 googlers:您的 Activity 应该继承 AppCompatActivity,而不是 Activity
如果你想为视图模型使用 kotlin 委托,我认为你的 activity 需要有这种依赖关系
//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")
查看更多内容并查看最新版本 here。
2022 年 4 月 29 日更新
你应该使用这个:
dependencies {
implementation "androidx.fragment:fragment-ktx:1.4.1"
}
更多信息:
https://developer.android.com/topic/libraries/architecture/viewmodel#implement