我们知道下面的创建实例的方式非常好,可以享受生命周期管理。在 ViewModel 中创建的实例是相同的。
但如果想在一个页面上创建两个实例,该如何创建呢?
fun Following(viewModel: FollowViewModel = viewModel()) {
}
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我想将信息发送到服务器,在收到成功响应后,我想将信息传递到当前屏幕以导航到另一个屏幕。
这是流程:
我从 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)知道它应该导航到另一个屏幕。我的问题是:我如何观察状态 …
所以我有一个 ViewModel 我正在尝试进行单元测试。它使用 stateIn 运算符。我找到了有关如何测试使用 stateIn 运算符创建的状态流的文档https://developer.android.com/kotlin/flow/test但即使我正在收集流,mapLatest也永远不会触发。
\nclass 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
我在 Android 应用程序中使用 MVVM 架构模式。我想从我的 using 进行 API 调用我ViewModel需要coroutinescope.lauch{}指定 Dispatcher 因为Dispatcher.IO它将在 IO 线程中执行,还是只使用由 提供的 Dispatcher ViewModel?Dispatcher.Main
android kotlin android-mvvm android-viewmodel kotlin-coroutines
据我所知,使用 Android Compose,
SavedStateHandle与生命周期和键值映射一起使用ViewModel并遵循生命周期和键值映射,它可以用作流程。ViewModel
rememberSaveable与可组合生命周期中的变量一起使用Composable并遵循可组合生命周期。
两者都用于在活动被系统破坏时防止数据丢失。
还有其他区别吗?
android android-savedstate android-viewmodel android-jetpack-compose
我正在尝试实现新的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
我有一个项目,其中有1个主要活动和4个片段都继承自相同的“ BaseFragment”。
刚开始时,我在整个主要活动和片段中都使用相同的ViewModel来管理整个项目,但是过了一会儿,内部的代码变得过于庞大,决定根据每个片段/活动的需要将其拆分为多个ViewModel。
我创建了一个“ MainViewModel”,并将其用于主要活动中,其余的ViewModels继承自该活动。
我的问题是减少ViewModel中的代码是否是一个好习惯?拥有多个视图模型也许效率低下吗?还有哪些其他方法可以简化它?
android android-fragments android-viewmodel android-architecture-components android-jetpack
在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)
一旦在片段中调用,该行是否会导致重置当前数据?
当我尝试通过在每次离开活动并返回时在开发人员选项中启用“不要保留活动”来模拟应用程序中的配置更改时,将ViewModel重新创建该活动!不ViewModels应该处理这些情况吗?
我可以通过保存活动状态来解决此问题,onSaveInstanceState但是使用a的意义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 ×9
kotlin ×6
android-architecture-components ×3
android-mvvm ×1
koin ×1
kotlin-flow ×1