我开始学习共享视图模型。目前我在活动中有 3 个片段,其中 2 个在嵌套的 navGraph 中。
我想为它们创建共享的 navGraph viewModel 范围,但我无法理解如何以及在哪里可以在这些片段中初始化视图模型。
在我过去的所有应用程序中,我创建了全局视图模型
private lateinit var viewModel: MainViewModel
Run Code Online (Sandbox Code Playgroud)
然后在里面onCreateView我像这样初始化 viewModel -
viewModel = ViewModelProvider(this, Factory(requireActivity().application)).get(
MainViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
如果我想与 2 个片段共享一个视图模型,我如何对 navGraph viewModel 范围执行相同的操作?
目前我有这种方法:
private val homeViewModel: HomeViewModel by navGraphViewModels(R.id.nested_navigation)
Run Code Online (Sandbox Code Playgroud)
这是工作,但是
A.我从来没有在全局变量中看到过 viewModel
B.我不能用这种方法在工厂内部传递变量
我有一个容器列表,我想为容器设置动画。
比如改变他的高度/宽度,改变容器的内容。
到目前为止我所做的是:
containerHeight = MediaQuery.of(context).size.height * 0.20;
body: Container(
child: ListView.builder(
itemCount: data.length,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: const EdgeInsets.all(15.0),
child: Container(
color: Colors.black,
height: containerHeight,
child: IconButton(
icon: Icon(Icons.list),
color: Colors.white,
onPressed: () {
setState(() {
containerHeight = MediaQuery.of(context).size.height * 0.35;
});
},
),
),
);
},
),
Run Code Online (Sandbox Code Playgroud)
我打算使用AnimatedContainer,但即使在使用它之前,如果我按下按钮什么也没有发生
我有这个变量来提取时间 DateTime.now();
DateTime date = DateTime.now();
String time = "${date.hour}:${date.minute}:${date.second}";
Run Code Online (Sandbox Code Playgroud)
问题是,如果时间例如是01:09:32,我得到的时间是1:9:32。
如何获得常规格式的时间?
我可以使用if-else做到这一点,但是我敢肯定有更好的方法
目前我在我的应用程序中有这种方法:
ViewState(每个屏幕一个视图状态)
sealed class CategoriesViewState {
object Loading : CategoriesViewState()
data class Error(
val errorMessage: String,
val messageType: UIComponentType
) : CategoriesViewState()
data class CategoryList(
val categories: List<Category>
) : CategoriesViewState()
}
Run Code Online (Sandbox Code Playgroud)
我使用实时数据在我的片段/活动中观察这种状态:
viewModel.viewState.observe(viewLifecycleOwner, Observer {
when (it) {
is CategoriesViewState.Loading -> {
progress_bar.visibility = View.VISIBLE
Log.d(TAG, "LOADING")
}
is CategoriesViewState.Error -> {
progress_bar.visibility = View.GONE
Log.d(TAG, "ERROR")
}
is CategoriesViewState.CategoryList -> {
progress_bar.visibility = View.GONE
Log.d(TAG, "DATA")
}
}
})
Run Code Online (Sandbox Code Playgroud)
它工作正常。
但在我看来,随着应用程序的增长,效率很低。
假设我的应用程序中有 20 个屏幕:我需要 20 个视图状态,我需要在每个屏幕中编写相同的 …
android mvvm kotlin android-livedata android-architecture-components