标签: android-viewmodel

在 Jetpack Compose 中创建多个视图模型实例

我们知道下面的创建实例的方式非常好,可以享受生命周期管理。在 ViewModel 中创建的实例是相同的。

但如果想在一个页面上创建两个实例,该如何创建呢?

fun Following(viewModel: FollowViewModel = viewModel()) {

}
Run Code Online (Sandbox Code Playgroud)

kotlin android-viewmodel android-jetpack-compose

4
推荐指数
1
解决办法
2117
查看次数

如何在 Compose Navigation 中导航视图模型字段更改?

在我的应用程序中,我想将信息发送到服务器,在收到成功响应后,我想将信息传递到当前屏幕以导航到另一个屏幕。

这是流程:

我从 UI 调用viewModel将请求发送到服务器。在ViewModel我有一个回调:

@HiltViewModel
class CreateAccountViewModel @Inject constructor(
    private val cs: CS
) : ViewModel() {

    private val _screen = mutableStateOf("")

    val screen: State<String> = _screen

    fun setScreen(screen: Screen) {
        _screen.value = screen.route
    }

    private val signUpCallback = object : SignUpHandler {
        override fun onSuccess(user: User?, signUpResult: SignUpResult?) {
            setScreen(Screen.VerifyAccountScreen)
            Log.i(Constants.TAG, "sign up success")

        }

        override fun onFailure(exception: Exception?) {
            Log.i(Constants.TAG, "sign up failure ")
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我还State负责 Screen,因此当响应成功时,我想更新状态,以便 UI 层(Screen)知道它应该导航到另一个屏幕。我的问题是:我如何观察状态 …

android kotlin android-viewmodel android-jetpack-compose

4
推荐指数
1
解决办法
3171
查看次数

使用 StateFlow 对 Android ViewModel 进行单元测试,该 StateFlow 从另一个 StateFlow 映射最新版本,但永远不会触发 mapLatest

所以我有一个 ViewModel 我正在尝试进行单元测试。它使用 stateIn 运算符。我找到了有关如何测试使用 stateIn 运算符创建的状态流的文档https://developer.android.com/kotlin/flow/test但即使我正在收集流,mapLatest也永远不会触发。

\n
class DeviceConfigurationViewModel(\n    val systemDetails: SystemDetails,\n    val step: AddDeviceStep.ConfigureDeviceStep,\n    val service: DeviceRemoteService\n) : ViewModel(), DeviceConfigurationModel {\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val _state: StateFlow<DeviceConfigurationModel.State> =\n        service.state\n            .mapLatest { state ->\n                when (state) {\n                    DeviceRemoteService.State.Connecting -> {\n                        DeviceConfigurationModel.State.Connecting\n                    }\n                    is DeviceRemoteService.State.ConnectedState.Connected -> {\n                        state.sendCommand(step.toCommand(systemDetails))\n                        DeviceConfigurationModel.State.Connected\n                    }\n                    is DeviceRemoteService.State.ConnectedState.CommandSent -> {\n                        DeviceConfigurationModel.State.Configuring\n                    }\n                    is DeviceRemoteService.State.ConnectedState.MessageReceived -> {\n                        transformMessage(state)\n                    }\n                    is DeviceRemoteService.State.Disconnected -> {\n                        transformDisconnected(state)\n                    }\n                }\n            }\n            .distinctUntilChanged()\n            .stateIn(\n                viewModelScope,\n                SharingStarted.WhileSubscribed(5000), // Keep it alive for …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-viewmodel kotlin-coroutines kotlin-flow

4
推荐指数
1
解决办法
1798
查看次数

Dispatcher.IO 和 Dispatcher.Main 哪个更适合用于 API 调用?

我在 Android 应用程序中使用 MVVM 架构模式。我想从我的 using 进行 API 调用我ViewModel需要coroutinescope.lauch{}指定 Dispatcher 因为Dispatcher.IO它将在 IO 线程中执行,还是只使用由 提供的 Dispatcher ViewModelDispatcher.Main

android kotlin android-mvvm android-viewmodel kotlin-coroutines

4
推荐指数
1
解决办法
937
查看次数

SavedStateHandle 和 RememberSaveable 之间有什么区别?

据我所知,使用 Android Compose,

SavedStateHandle与生命周期和键值映射一起使用ViewModel并遵循生命周期和键值映射,它可以用作流程。ViewModel

rememberSaveable与可组合生命周期中的变量一起使用Composable并遵循可组合生命周期。

两者都用于在活动被系统破坏时防止数据丢失。

还有其他区别吗?

android android-savedstate android-viewmodel android-jetpack-compose

4
推荐指数
1
解决办法
999
查看次数

Android Live数据观察者异常

我正在尝试实现新的android体系结构组件并在片段和视图模型中使用实时数据,但是当我向实时数据添加观察者时,应用程序崩溃抛出此异常.

Process: com.nrs.nsnik.architecturecomponents, PID: 3071

java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.nrs.nsnik.architecturecomponents/com.nrs.nsnik.architecturec
omponents.view.MainActivity}: java.lang.ClassCastException: android.arch.lifecycle.LiveData_LifecycleBoundObserver_LifecycleAdapter cannot be cast to android.arch.lifecycle.GeneratedAdapter
.
.
.
.
 Caused by: java.lang.ClassCastException: android.arch.lifecycle.LiveData_LifecycleBoundObserver_LifecycleAdapter cannot be cast to android.arch.lifecycle.GeneratedAdapter
Run Code Online (Sandbox Code Playgroud)

列表片段:

public class ListFragment extends Fragment {

    @BindView(R.id.listFragmentRecyclerView)
    RecyclerView mRecyclerView;
    @BindView(R.id.listFragmentAddItem)
    FloatingActionButton mFloatingActionButton;
    private Unbinder mUnbinder;
    private CompositeDisposable mCompositeDisposable;
    private ListViewModel mListViewModel;
    private List<NoteEntity> mNoteEntityList;
    private ListAdapter mListAdapter;
    private NoteDatabase mNoteDatabase;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_list, container, false);
        mUnbinder …
Run Code Online (Sandbox Code Playgroud)

android android-sqlite android-livedata android-viewmodel android-architecture-components

3
推荐指数
1
解决办法
972
查看次数

拥有多个Viewmodel(每个片段大约一个)是一种不好的做法吗?

我有一个项目,其中有1个主要活动和4个片段都继承自相同的“ BaseFragment”。

刚开始时,我在整个主要活动和片段中都使用相同的ViewModel来管理整个项目,但是过了一会儿,内部的代码变得过于庞大,决定根据每个片段/活动的需要将其拆分为多个ViewModel。

我创建了一个“ MainViewModel”,并将其用于主要活动中,其余的ViewModels继承自该活动。

我的问题是减少ViewModel中的代码是否是一个好习惯?拥有多个视图模型也许效率低下吗?还有哪些其他方法可以简化它?

android android-fragments android-viewmodel android-architecture-components android-jetpack

3
推荐指数
1
解决办法
1869
查看次数

调用ViewModel实例会重置LiveData吗?

在Kotlin我正在使用

viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

从提供程序检索ViewModel.

在我的ViewModel中我有这样的东西.

val liveChuchuData = MutableLiveData<DataChuchu>()
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这会创建MutableLiveData的最终新变量吗?

我记得在Java中的ViewModel中声明MutableLiveDatas时,我们创建了一个函数,然后检查MutableLiveData是否为null,只创建一次.那么如果我有一个片段也会使用相同的ViewModel实例呢?

val liveChuchuData = MutableLiveData<DataChuchu>()
Run Code Online (Sandbox Code Playgroud)

一旦在片段中调用,该行是否会导致重置当前数据?

android kotlin android-livedata android-viewmodel

3
推荐指数
1
解决办法
1467
查看次数

android的ViewModel的奇怪行为

当我尝试通过在每次离开活动并返回时在开发人员选项中启用“不要保留活动”来模拟应用程序中的配置更改时,将ViewModel重新创建该活动!不ViewModels应该处理这些情况吗?

我可以通过保存活动状态来解决此问题,onSaveInstanceState但是使用a的意义ViewModel何在?

android android-viewmodel android-architecture-components

3
推荐指数
1
解决办法
467
查看次数

Koin-如何为咖啡测试提供模拟ViewModel?

我们如何将模拟的viewModel注入到Activity中以进行浓缩咖啡测试?使用declareMock我在Test类中获取模拟对象,但是Activity接收常规的viewModel对象。

@RunWith(AndroidJUnit4::class)
class SomeActivityTest : KoinTest {
    @Rule
    @JvmField
    val rule = ActivityTestRule(SomeActivity::class.java, true, true)
    val viewModel: MyViewModel by inject()

    @Before
    fun setup() {
        declareMock<MyViewModel>(isFactory = true, binds = listOf(ViewModel::class))
    }

    @After
    fun cleanUp() {
        stopKoin()
    }

    @Test
    fun shouldHaveTextViewVisible() {
        `when`(viewModel.sayHello())
                .thenReturn("hello view-model")
        onView(withId(R.id.tv_homescreen_message))
                .check(matches(isDisplayed()))
        onView(withId(R.id.tv_homescreen_message))
                .check(matches(withText("hello view-model")))
    }
}
Run Code Online (Sandbox Code Playgroud)

android kotlin android-espresso android-viewmodel koin

3
推荐指数
1
解决办法
1329
查看次数