Flutter 如何为小部件(视图)启动ViewModel

Flutter 如何为小部件(视图)启动ViewModel,flutter,Flutter,因此,我正在编写一个利用MVVM体系结构的颤振应用程序。对于每个屏幕(小部件),我都有一个带有ValueNotifiers的viewModel,我想为该视图启动viewModel。 现在,大多数指南都建议使用提供者方法,但为什么要在我可以正常启动时提供它呢 代码: 类模型{ 最终估价通知程序_active=估价通知程序(false); ValueNotifier get active=>\u active; FooModel(){u active=false;} doSomething(){u

因此,我正在编写一个利用MVVM体系结构的颤振应用程序。对于每个屏幕(小部件),我都有一个带有ValueNotifiers的viewModel,我想为该视图启动viewModel。 现在,大多数指南都建议使用提供者方法,但为什么要在我可以正常启动时提供它呢

代码:

类模型{
最终估价通知程序_active=估价通知程序(false);
ValueNotifier get active=>\u active;
FooModel(){u active=false;}
doSomething(){u active=!\u 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");
          }

      ) 
  }
@覆盖
小部件构建(构建上下文){
_viewModel=FooModel();
返回脚手架(
正文:ValueListenableBuilder(
valueListenable:_viewModel.active,
构建器:(上下文,值,u){
如果(值)返回(文本(“活动”);
返回文本(“非活动”);
}
) 
}
建议:

  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");
            });
      },
   );
 }
小部件构建(构建上下文){
返回提供者(
创建:()=>FooModel(),
生成器:(上下文,子对象){
final vm=Provider.of(上下文);
返回值ListenableBuilder(
valueListenable:vm.active,
生成器:(上下文、值){
如果(值)返回文本(“活动”);
返回文本(“非活动”);
});
},
);
}
现在我明白了,我所建议的在每次构建时都会创建viewModel,但这应该只在ValueNotifier加载屏幕时才会发生,所以这很好。
我想我只是不理解提供viewModel的价值。

颤振有不同的思想。 是的,您可以创建价值通知,这样做很好,但只需考虑更大的前景。 选中此流您要调用API,然后对其执行解析和过滤,屏幕上有两个视图显示相同的数据一个是显示数据,另一个是与数据交互,此更新需要反映在显示的数据上

要做到这一点,我们需要做什么

  • 在类级别创建包含两个屏幕小部件的valuenotifier
  • 在类级别调用API和过滤器代码
  • 将此valuenotifier传递给两个屏幕小部件您可能会问为什么?因为一个类需要更新其他类小部件。而将更新推送到valuenotifier的唯一方法是对象本身。因此您需要在两个类中传递此valuenotifier
  • 一旦您这样做并且更新已经同步,如果任何setState已经被调用到包含这两个小部件的主小部件,那么您需要再次执行所有这些操作
  • 此外,还会有多个valuenotifier实例,这是不好的,因为valuenotifier是一个流,一旦处理完流,您需要关闭流,因此您需要在主窗口小部件上的任何setState事件中关闭流的逻辑
  • 什么是提供程序?它是如何工作的?好吧,提供程序是一个变更通知程序类,当您调用notifyDataChanged或notify方法时,它会调用setState。这会触发正在侦听该数据变更的小部件状态变更。 对于每个状态管理库Bloc、ScopedBloc或任何类似streamBuilder或ValueListenableBuilder的小部件,这都是相同的逻辑

    在Flatter中,如果您想更改数据,只需调用setState。为了便于测试、更可读和维护,我们将要做的是像在Android或iOS中一样,将逻辑分离到不同的文件中,这就是这种类型的库出现的原因,以减少我们再次键入代码并集中精力的麻烦主要任务是应用程序的功能

    请看,我们可以创建不同格式的循环

    for(int i=0;i<length;i++)
    while(i++<length)
    for(i in 0...length) 
    

    for(int i=0;我为什么反对投票?我的问题是提供代码和所有东西。这可能不符合主题,但如果您希望使用mvvm arch实现应用程序。有一个软件包堆叠()。它遵循mvvm arch,并附带一些非常有用的功能。看看它是否符合您的要求。
    
    for(int i=0;i<length;i++)
    while(i++<length)
    for(i in 0...length)