我有一个容器 Fragment,称之为包含ContainerFragment两个FragmentFragmentA和FragmentB. 两者,FragmentA并使用该方法在方法中FragmentB创建一个。ViewModelonCreate()ViewModelProviders.of(this)
假设容器一次只能显示一个片段,我正在使用该FragmentTransaction.replace()方法在FragmentA和之间切换FragmentB。在我的例子中,我显示了FragmentA,它创建了FragmentAViewModel,然后触发FragmentB了一个操作来替换FragmentA。现在,当我完成后FragmentB,我再次调用 replace 来显示FragmentA。这是我在替换片段的方法中所做的检查:
if (fragmentA == null) {
fragmentA = FragmentA.newInstance();
}
FragmentTransaction ft = getChildFragmentManager().beginTransaction();
ft.replace(R.id.container_content, fragmentA, "my-tag");
ft.commit();
Run Code Online (Sandbox Code Playgroud)
因为它FragmentA是第一次运行时创建的,所以它不会进入 if 块。但是我注意到onCreate()ofFragmentA返回了一个不同的 ViewModel 实例。我有以下代码FragmentA:
public void onCreate(Bundle sI) {
super.onCreate(sI);
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
Log.i("test", "ViewModel-> " + …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewmodel android-architecture-components
在添加 viewmodel 和 livedata 之前,我通过改造成功实现了无限滚动。但是在使用 Retrofit 添加 viewmodel 和 livedata 后,我无法使用新数据调用更新 recyclerview 或 viewmodel 观察者不更新列表。
我只是想像我之前的代码那样无限滚动。我添加了一个全局变量来重用下一页令牌。我是否缺少任何东西或任何示例来实现具有视图模型和改造的无限回收器视图将很棒。
public static String NEXT_PAGE_URL = null;
Run Code Online (Sandbox Code Playgroud)
我是这样编码的。
我的活动 -> PlaceListActivity
placeRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
LogMe.d(tag, "onScrollStateChanged:: " + "called");
// check scrolling started or not
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
isScrolling = true;
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
LogMe.d(tag, "onScrolled:: " + "called");
super.onScrolled(recyclerView, dx, dy);
currentItem = …Run Code Online (Sandbox Code Playgroud) infinite-scroll android-recyclerview retrofit2 android-viewmodel android-jetpack
我正在使用导航底部与导航底部ViewModel内的所有片段共享,但它在第二次调用片段时抛出此异常
java.lang.IllegalArgumentException: Cannot add the same observer with different lifecycles
我试图让所有观察者都附加到活动而不是它的片段,如下所示
1-在fragemt中声明viewModel
viewModel = activity?.run {
ViewModelProviders.of(this,viewModelFactory).get(SharedViewModel::class.java)
} ?: throw Exception("Invalid Activity")
Run Code Online (Sandbox Code Playgroud)
2-观察者实时数据对象
viewModel.msg.observe(activity!!, Observer {
Log.i(TAG,it)
})
Run Code Online (Sandbox Code Playgroud)
3- 移除观察者
override fun onStop() {
super.onStop()
viewModel.msg.removeObservers(activity!!)
}
Run Code Online (Sandbox Code Playgroud)
这段代码对我来说工作正常,但我想知道我的代码是否正确并且可能工作?提前致谢
所以我正在使用 Dagger 开发一些示例 MVVM 项目。我有一个视图模型工厂,如下所示:
class DaggerViewModelFactory @Inject constructor(private val viewModelsMap: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>) :
ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val creator = viewModelsMap[modelClass] ?:
viewModelsMap.asIterable().firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
return try {
creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
Run Code Online (Sandbox Code Playgroud)
视图模型工厂模块
@Module
abstract class ViewModelFactoryModule {
@Binds
abstract fun bindViewModelFactory(viewModelFactory: DaggerViewModelFactory): ViewModelProvider.Factory
}
Run Code Online (Sandbox Code Playgroud)
我有一个 ViewModelModule:
@Module
abstract class MyViewModelModule {
@Binds
@IntoMap …Run Code Online (Sandbox Code Playgroud) ViewModel如果不处理,为什么建议使用架构组件process death?
例如,如果我保存状态,onSaveInstanceState状态为configuration change和都持续存在process death,而ViewModel只生存configuration change,生存process death需要从中获取状态ViewModel并使用相同的onSaveInstanceState机制。
我想念什么?
所以我的问题很简单。viewmodel 需要一个范围才能保持活力。例如活动或片段。所以我想一定有一个与 相关的类navgraph在多个片段中幸存下来。那么它是如何实现的呢?
val viewModel by navGraphViewModels(R.id.my_nav_graph).
Run Code Online (Sandbox Code Playgroud) java android kotlin android-viewmodel android-architecture-navigation
我正在使用 Android Jetpack 的 Compose,并且一直在尝试弄清楚如何保存方向更改的状态。
我的思路是让一个类成为一个 ViewModel。因为当我使用 Android 的传统 API 时,这通常有效。
当信息发生更改时,我使用了 remember {} 和 mutableState {} 来更新 UI。请验证我的理解是否正确...
记住 = 保存变量并允许通过 .value 访问,这允许缓存值。但它的主要用途是在更改时不重新分配变量。
mutableState = 在发生变化时更新变量。
许多博客文章都说要使用@Model,但是,在尝试该方法时,导入会出错。所以,我添加了一个: ViewModel()
但是,我相信我记得 {} 阻止它按预期工作?
我能在正确的方向上得到一个点吗?
@Composable
fun DefaultFlashCard() {
val flashCards = remember { mutableStateOf(FlashCards())}
Spacer(modifier = Modifier.height(30.dp))
MaterialTheme {
val typography = MaterialTheme.typography
var question = remember { mutableStateOf(flashCards.value.currentFlashCards.question) }
Column(modifier = Modifier.padding(30.dp).then(Modifier.fillMaxWidth())
.then(Modifier.wrapContentSize(Alignment.Center))
.clip(shape = RoundedCornerShape(16.dp))) {
Box(modifier = Modifier.preferredSize(350.dp)
.border(width = 4.dp,
color = Gray,
shape = RoundedCornerShape(16.dp))
.clickable( …Run Code Online (Sandbox Code Playgroud) android kotlin android-viewmodel android-jetpack android-jetpack-compose
我正在努力在 Android Jetpack Compose 中实现 DataStore 首选项库,以在我的应用程序中保留一些用户设置。每当我尝试从可组合组件访问 SettingsViewModel 时,应用程序就会崩溃并收到以下错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.boldmethod, PID: 5415
java.lang.RuntimeException: Cannot create an instance of class com.boldmethod.Models.SettingsViewModel
...
Caused by: java.lang.InstantiationException: java.lang.Class<com.packageName.Models.SettingsViewModel> has no zero argument constructor
Run Code Online (Sandbox Code Playgroud)
我正在按照文档创建数据存储和视图模型,所以也许我没有在可组合项中正确使用它们。这是相关的源代码:
摇篮
dependencies {
// Kotlin/Core
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.20"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
// Compose
implementation "androidx.compose.ui:ui:1.0.0-alpha08"
implementation "androidx.compose.material:material:1.0.0-alpha08"
implementation "androidx.compose.runtime:runtime:1.0.0-alpha08"
implementation "androidx.compose.runtime:runtime-livedata:1.0.0-alpha08"
implementation "androidx.compose.runtime:runtime-rxjava2:1.0.0-alpha08"
// Navigation
def nav_compose_version = "1.0.0-alpha03"
implementation "androidx.navigation:navigation-compose:$nav_compose_version"
// Architecture
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha05"
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
//implementation "android.arch.lifecycle:runtime:2.1.0"
// UI/Material
implementation 'com.google.android.material:material:1.2.1'
implementation …Run Code Online (Sandbox Code Playgroud) android android-viewmodel android-jetpack android-jetpack-compose android-jetpack-datastore
我试图在活动和片段之间创建共享视图模型。在活动中:
val viewModel: SharedViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)
并在片段中:
val viewModel: SharedViewModel by navGraphViewModels(R.id.activity_nav_graph) {
defaultViewModelProviderFactory
}
Run Code Online (Sandbox Code Playgroud)
但当前有 2 个实例,其中一个在 Activity 上创建,一个在 Fragment 中创建
android dependency-injection android-fragments android-viewmodel dagger-hilt
LeakCanary 告诉我,我的一个 ViewModel 正在泄漏,但在玩了 2 天后,我无法让泄漏消失。
这是获取 ViewModel 的 Fragment
viewModel = ViewModelProvider(this).get(ViewBreederViewModel::class.java).apply {
getStrains(arguments?.getString(BREEDER_ID_KEY, "")!!)
}
Run Code Online (Sandbox Code Playgroud)
这是视图模型
class ViewBreederViewModel(application: Application) : AndroidViewModel(application) {
private val breederRepository = BreederRepository(application)
val strainList = MutableLiveData<List<MinimalStrain>>()
fun getStrains(breederId: String) {
viewModelScope.launch {
breederRepository.getMinimalStrains(breederId).observeForever {
strainList.value = it
}
}
}
Run Code Online (Sandbox Code Playgroud)
}
这是 BreederRepository:
class BreederRepository(context: Context) {
private val dao: BreederDao
private val breederApi = RetrofitClientInstance.getInstance(context).breederAndStrainIdsApi
init {
val database: Db = Db.getInstance(
context
)!!
dao = database.breederDao()
}
suspend …Run Code Online (Sandbox Code Playgroud) android ×8
kotlin ×3
android-architecture-components ×1
android-architecture-navigation ×1
android-mvvm ×1
android-room ×1
dagger ×1
dagger-2 ×1
dagger-hilt ×1
java ×1
leakcanary ×1
mvvm ×1
retrofit2 ×1