Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振多供应商消费者触发器-如何防止多次重建? 小部件构建(构建上下文){ repo=提供方(上下文); shopInfoRepository=Provider.of(上下文); psValueHolder=Provider.of(上下文,侦听:false); 最终小部件_expansionTitleWidget=Text( getString(上下文“详细信息”和“会话信息”), 风格:Theme.of(context.textTheme.subtitle1); 回程多供应商( 供应商:[ 变更通知提供者( 懒惰:错, 创建:(构建上下文){ 最终RegisteredProductSessionProvider提供程序= RegisteredProductSessionProvider( repo:repo,userId:psValueHolder.loginUserId); if(widget.isNavRegistered){ provider.getRegisteredProductSessionList(widget.productId); } 退货供应商; }), 变更通知提供者( 懒惰:错, 创建:(构建上下文){ 最终注册的ProductSessionProvider提供程序= Enrolled ProductSessionProvider( repo:repo,userId:psValueHolder.loginUserId); 如果(!widget.isNavRegistered){ provider.getEnrolledProductSessionList(widget.productId); } 退货供应商; }), 变更通知提供者( 懒惰:错, 创建:(构建上下文){ 最终ProductSessionProvider提供程序=ProductSessionProvider( repo:repo,userId:psValueHolder.loginUserId); productSessionProvider=提供程序; 退货供应商; }), 变更通知提供者( 懒惰:错, 创建:(构建上下文){ 最终ShopInfoProvider提供程序=ShopInfoProvider( 回购:ShopInformationPository, psValueHolder:psValueHolder, 所有者代码:“HomeDashboardViewWidget”); provider.loadShopInfo(); 退货供应商; }), ], 儿童:消费者3( 生成器:(上下文、shopInfoProvider、Enrolled ProductSessionProvider、, registeredProductSessionProvider,小部件子项){ if(widget.isNavRegistered){ sessionList=registeredProductSessionProvider .registeredProductSessionList.data; }否则{ 会期者= enrolledProductSessionProvider.enrolledProductSessionList.data; } sessionList.sort((a,b)=>a.compareTo(b)); //添加了future builder以等待会话状态更新 回归未来建设者( future:WidgetUtils.checkAndUpdateSessionStatus(会话列表, productSessionProvider、shopInfoProvider.shopInfo.data), 建设者: (BuildContext上下文,异步快照){ if(snapshot.hasData){ //if(snapshot.connectionState!=connectionState.waiting&&!snapshot.hasError){ sessionList=snapshot.data;//合并sessionList 如果(sessionList.length>0){ 回程卡( 标高:0.0, 子文件:PSExpansionFile( 初始扩展:false, 标题:_expansionTitleWidget, 儿童:[ 填充物( 填充:仅限常量边设置( 底部:PsDimens.space10, 左:PsDimens.space10, 右:PsDimens.space10), 子项:sessionList.length>0 ?立柱( 横轴对齐: CrossAxisAlignment.stretch, 儿童:[ 居中( 子项:_buildSessionDataTable(上下文)), ], ) :容器(子:文本('None')), ) ], ), ); }否则{ 返回容器(); } }否则{ 返回容器(); } }, ); }));_Flutter_Dart_Provider - Fatal编程技术网

Flutter 颤振多供应商消费者触发器-如何防止多次重建? 小部件构建(构建上下文){ repo=提供方(上下文); shopInfoRepository=Provider.of(上下文); psValueHolder=Provider.of(上下文,侦听:false); 最终小部件_expansionTitleWidget=Text( getString(上下文“详细信息”和“会话信息”), 风格:Theme.of(context.textTheme.subtitle1); 回程多供应商( 供应商:[ 变更通知提供者( 懒惰:错, 创建:(构建上下文){ 最终RegisteredProductSessionProvider提供程序= RegisteredProductSessionProvider( repo:repo,userId:psValueHolder.loginUserId); if(widget.isNavRegistered){ provider.getRegisteredProductSessionList(widget.productId); } 退货供应商; }), 变更通知提供者( 懒惰:错, 创建:(构建上下文){ 最终注册的ProductSessionProvider提供程序= Enrolled ProductSessionProvider( repo:repo,userId:psValueHolder.loginUserId); 如果(!widget.isNavRegistered){ provider.getEnrolledProductSessionList(widget.productId); } 退货供应商; }), 变更通知提供者( 懒惰:错, 创建:(构建上下文){ 最终ProductSessionProvider提供程序=ProductSessionProvider( repo:repo,userId:psValueHolder.loginUserId); productSessionProvider=提供程序; 退货供应商; }), 变更通知提供者( 懒惰:错, 创建:(构建上下文){ 最终ShopInfoProvider提供程序=ShopInfoProvider( 回购:ShopInformationPository, psValueHolder:psValueHolder, 所有者代码:“HomeDashboardViewWidget”); provider.loadShopInfo(); 退货供应商; }), ], 儿童:消费者3( 生成器:(上下文、shopInfoProvider、Enrolled ProductSessionProvider、, registeredProductSessionProvider,小部件子项){ if(widget.isNavRegistered){ sessionList=registeredProductSessionProvider .registeredProductSessionList.data; }否则{ 会期者= enrolledProductSessionProvider.enrolledProductSessionList.data; } sessionList.sort((a,b)=>a.compareTo(b)); //添加了future builder以等待会话状态更新 回归未来建设者( future:WidgetUtils.checkAndUpdateSessionStatus(会话列表, productSessionProvider、shopInfoProvider.shopInfo.data), 建设者: (BuildContext上下文,异步快照){ if(snapshot.hasData){ //if(snapshot.connectionState!=connectionState.waiting&&!snapshot.hasError){ sessionList=snapshot.data;//合并sessionList 如果(sessionList.length>0){ 回程卡( 标高:0.0, 子文件:PSExpansionFile( 初始扩展:false, 标题:_expansionTitleWidget, 儿童:[ 填充物( 填充:仅限常量边设置( 底部:PsDimens.space10, 左:PsDimens.space10, 右:PsDimens.space10), 子项:sessionList.length>0 ?立柱( 横轴对齐: CrossAxisAlignment.stretch, 儿童:[ 居中( 子项:_buildSessionDataTable(上下文)), ], ) :容器(子:文本('None')), ) ], ), ); }否则{ 返回容器(); } }否则{ 返回容器(); } }, ); }));

Flutter 颤振多供应商消费者触发器-如何防止多次重建? 小部件构建(构建上下文){ repo=提供方(上下文); shopInfoRepository=Provider.of(上下文); psValueHolder=Provider.of(上下文,侦听:false); 最终小部件_expansionTitleWidget=Text( getString(上下文“详细信息”和“会话信息”), 风格:Theme.of(context.textTheme.subtitle1); 回程多供应商( 供应商:[ 变更通知提供者( 懒惰:错, 创建:(构建上下文){ 最终RegisteredProductSessionProvider提供程序= RegisteredProductSessionProvider( repo:repo,userId:psValueHolder.loginUserId); if(widget.isNavRegistered){ provider.getRegisteredProductSessionList(widget.productId); } 退货供应商; }), 变更通知提供者( 懒惰:错, 创建:(构建上下文){ 最终注册的ProductSessionProvider提供程序= Enrolled ProductSessionProvider( repo:repo,userId:psValueHolder.loginUserId); 如果(!widget.isNavRegistered){ provider.getEnrolledProductSessionList(widget.productId); } 退货供应商; }), 变更通知提供者( 懒惰:错, 创建:(构建上下文){ 最终ProductSessionProvider提供程序=ProductSessionProvider( repo:repo,userId:psValueHolder.loginUserId); productSessionProvider=提供程序; 退货供应商; }), 变更通知提供者( 懒惰:错, 创建:(构建上下文){ 最终ShopInfoProvider提供程序=ShopInfoProvider( 回购:ShopInformationPository, psValueHolder:psValueHolder, 所有者代码:“HomeDashboardViewWidget”); provider.loadShopInfo(); 退货供应商; }), ], 儿童:消费者3( 生成器:(上下文、shopInfoProvider、Enrolled ProductSessionProvider、, registeredProductSessionProvider,小部件子项){ if(widget.isNavRegistered){ sessionList=registeredProductSessionProvider .registeredProductSessionList.data; }否则{ 会期者= enrolledProductSessionProvider.enrolledProductSessionList.data; } sessionList.sort((a,b)=>a.compareTo(b)); //添加了future builder以等待会话状态更新 回归未来建设者( future:WidgetUtils.checkAndUpdateSessionStatus(会话列表, productSessionProvider、shopInfoProvider.shopInfo.data), 建设者: (BuildContext上下文,异步快照){ if(snapshot.hasData){ //if(snapshot.connectionState!=connectionState.waiting&&!snapshot.hasError){ sessionList=snapshot.data;//合并sessionList 如果(sessionList.length>0){ 回程卡( 标高:0.0, 子文件:PSExpansionFile( 初始扩展:false, 标题:_expansionTitleWidget, 儿童:[ 填充物( 填充:仅限常量边设置( 底部:PsDimens.space10, 左:PsDimens.space10, 右:PsDimens.space10), 子项:sessionList.length>0 ?立柱( 横轴对齐: CrossAxisAlignment.stretch, 儿童:[ 居中( 子项:_buildSessionDataTable(上下文)), ], ) :容器(子:文本('None')), ) ], ), ); }否则{ 返回容器(); } }否则{ 返回容器(); } }, ); }));,flutter,dart,provider,Flutter,Dart,Provider,如上所述,我有一个消费者很少的MultiProvider。在Consumer3代码块中,我有FutureBuilder,因为我有异步会话状态更新方法checkAndUpdateSessionStatus()。consumer3代码块被多次触发,我认为这是MultiProvider使用者模型的本质。问题是,现在checkAndUpdateSessionStatus()也被多次调用,我希望调用一次。我可以使用StreamBuilder,但我仍然需要异步checkAndUpdateSessionSta

如上所述,我有一个消费者很少的MultiProvider。在Consumer3代码块中,我有FutureBuilder,因为我有异步会话状态更新方法checkAndUpdateSessionStatus()。consumer3代码块被多次触发,我认为这是MultiProvider使用者模型的本质。问题是,现在checkAndUpdateSessionStatus()也被多次调用,我希望调用一次。我可以使用StreamBuilder,但我仍然需要异步checkAndUpdateSessionStatus()

我对Flatter还比较陌生。我见过很多StackOverFow项目,都是关于如何防止多构建的东西,但没有一个解决我的核心问题(我需要MultiProvider,但不想多次触发使用者,在使用者内部,我有一个异步进程,不应该使用多个使用者触发器进行处理)


任何解决方案或替代解决方案都会对我有帮助,请提前感谢。

我也有同样的想法。你可以尝试
选择器
(我尝试过一次,但我知道自己做的事情比现在少,所以会再试一次)。此外,
提供程序
也有。例如,v4.2.0在MultiProvider上添加了一个生成器参数。我也将对此进行研究。以下是。我也有同样的想法。您可以尝试
选择器
(我尝试过一次,但我知道我做的事情比现在少,因此将再次尝试)。此外,
提供程序
也有。例如,v4.2.0在MultiProvider上添加了一个生成器参数。我也将对此进行研究。下面是示例。
Widget build(BuildContext context) {
repo = Provider.of<ProductSessionRepository>(context);
shopInfoRepository = Provider.of<ShopInfoRepository>(context);
psValueHolder = Provider.of<PsValueHolder>(context, listen: false);

final Widget _expansionTileTitleWidget = Text(
    Utils.getString(context, 'detail_info_tile__session_info'),
    style: Theme.of(context).textTheme.subtitle1);

return MultiProvider(
    providers: <SingleChildWidget>[
      ChangeNotifierProvider<RegisteredProductSessionProvider>(
          lazy: false,
          create: (BuildContext context) {
            final RegisteredProductSessionProvider provider =
                RegisteredProductSessionProvider(
                    repo: repo, userId: psValueHolder.loginUserId);
            if (widget.isNavRegistered) {
              provider.getRegisteredProductSessionList(widget.productId);
            }
            return provider;
          }),
      ChangeNotifierProvider<EnrolledProductSessionProvider>(
          lazy: false,
          create: (BuildContext context) {
            final EnrolledProductSessionProvider provider =
                EnrolledProductSessionProvider(
                    repo: repo, userId: psValueHolder.loginUserId);
            if (!widget.isNavRegistered) {
              provider.getEnrolledProductSessionList(widget.productId);
            }
            return provider;
          }),
      ChangeNotifierProvider<ProductSessionProvider>(
          lazy: false,
          create: (BuildContext context) {
            final ProductSessionProvider provider = ProductSessionProvider(
                repo: repo, userId: psValueHolder.loginUserId);
            productSessionProvider = provider;
            return provider;
          }),
      ChangeNotifierProvider<ShopInfoProvider>(
          lazy: false,
          create: (BuildContext context) {
            final ShopInfoProvider provider = ShopInfoProvider(
                repo: shopInfoRepository,
                psValueHolder: psValueHolder,
                ownerCode: 'HomeDashboardViewWidget');
            provider.loadShopInfo();
            return provider;
          }),
    ],
    child: Consumer3<ShopInfoProvider, EnrolledProductSessionProvider,
            RegisteredProductSessionProvider>(
        builder: (context, shopInfoProvider, enrolledProductSessionProvider,
            registeredProductSessionProvider, Widget child) {
      if (widget.isNavRegistered) {
        sessionList = registeredProductSessionProvider
            .registeredProductSessionList.data;
      } else {
        sessionList =
            enrolledProductSessionProvider.enrolledProductSessionList.data;
      }
      sessionList.sort((a, b) => a.compareTo(b));

      //added future builder to wait for the session status update
      return FutureBuilder<List<Session>>(
        future: WidgetUtils.checkAndUpdateSessionStatus(sessionList,
            productSessionProvider, shopInfoProvider.shopInfo.data),
        builder:
            (BuildContext context, AsyncSnapshot<List<Session>> snapshot) {
          if (snapshot.hasData) {
            //if (snapshot.connectionState != ConnectionState.waiting &&!snapshot.hasError) {
            sessionList = snapshot.data; //consolidated sessionList

            if (sessionList.length > 0) {
              return Card(
                elevation: 0.0,
                child: PsExpansionTile(
                  initiallyExpanded: false,
                  title: _expansionTileTitleWidget,
                  children: <Widget>[
                    Padding(
                      padding: const EdgeInsets.only(
                          bottom: PsDimens.space10,
                          left: PsDimens.space10,
                          right: PsDimens.space10),
                      child: sessionList.length > 0
                          ? Column(
                              crossAxisAlignment:
                                  CrossAxisAlignment.stretch,
                              children: <Widget>[
                                Center(
                                    child: _buildSessionDataTable(context)),
                              ],
                            )
                          : Container(child: Text('None')),
                    )
                  ],
                ),
              );
            } else {
              return Container();
            }
          } else {
            return Container();
          }
        },
      );
    }));