- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在编写一个利用 MVVM 架构的 Flutter 应用程序。我有一个带有 ValueNotifiers 的每个屏幕(小部件)的 viewModel,我想为该 View 启动 viewModel。现在大多数指南都建议使用 Provider 方法,但为什么在我可以正常启动它时提供它。
代码:
class FooModel{
final ValueNotifier<bool> _active = ValueNotifier<bool>(false);
ValueNotifier<bool> get active => _active;
FooModel(){_active = false;}
doSomething(){_active=!_active}
}
我想做什么:
@override
Widget build(BuildContext context) {
_viewModel = FooModel();
return Scaffold(
body:ValueListenableBuilder<bool>(
valueListenable: _viewModel.active,
builder : (context,value,_){
if(value)return(Text("active");
return Text("unactive");
}
)
}
建议:
Widget build(BuildContext context) {
return Provider<FooModel>(
create: (_) => FooModel(),
builder: (context, child) {
final vm = Provider.of<FooModel>(context);
return ValueListenableBuilder<bool>(
valueListenable: vm.active,
builder: (context, value) {
if (value) return Text("active");
return Text("unactive");
});
},
);
}
现在我明白我的建议是在每次构建时创建 viewModel,但由于 ValueNotifier,这应该只在加载屏幕时发生,所以它很好。我想我只是不明白提供 viewModel 的值(value)。
最佳答案
Flutter 有不同的意识形态。是的,您可以创建 Value Notifier,这样做很好,但只是要考虑更大的图景。检查您要调用 API 的流程,然后对其执行解析和过滤,您在屏幕上有 2 个 View 来显示相同的数据,一个是展示数据,另一个是与数据交互,此更新需要反射(reflect)在展示的数据上。
为此我们需要做什么?
究竟什么是供应商?它是如何工作的?好吧,提供程序是一个更改通知程序类,它在您调用 notifyDataChanged 或 notify 方法时调用 setState。这会触发正在监听该数据更改的小部件状态更改。那个小部件得到重建。这对于 Bloc、ScopedBloc 或任何像 streamBuilder 或 ValueListenableBuilder 这样的小部件的每个状态管理库都是相同的逻辑。
在 Flutter 中,如果你想改变数据,你只需要调用 setState。只是为了可测试、更具可读性和可维护性,我们将做的是将逻辑分离到不同的文件中,就像我们在 Android 或 iOS 中所做的那样,这就是这种类型的库出现的地方,以减少我们重新输入代码的头痛并专注于主要任务,即应用程序的功能。
我们可以创建不同格式的循环
for(int i=0;i<length;i++)
while(i++<length)
for(i in 0...length)
我们有责任提供干净易懂的代码,这样任何其他开发人员就不需要删除所有代码,因为他无法理解我们的代码。
开发没有对错之分。这是更方便或更有意义的问题。像 int i 一样没有意义,但如果我们用 index 或 listIndex 替换它,它就会。
此外,要提及的一件事是您正在做的是创建一个与 bloc 模式有点相同的模型。所以你已经完成了一半。您只需要从模型检查 block 和您将理解的其他模式调用状态更改。
关于flutter - 如何为 widget(view) 启动 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63016065/
我是一名优秀的程序员,十分优秀!