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')), ) ], ), ); }否则{ 返回容器(); } }否则{ 返回容器(); } }, ); }));
如上所述,我有一个消费者很少的MultiProvider。在Consumer3代码块中,我有FutureBuilder,因为我有异步会话状态更新方法checkAndUpdateSessionStatus()。consumer3代码块被多次触发,我认为这是MultiProvider使用者模型的本质。问题是,现在checkAndUpdateSessionStatus()也被多次调用,我希望调用一次。我可以使用StreamBuilder,但我仍然需要异步checkAndUpdateSessionStatus() 我对Flatter还比较陌生。我见过很多StackOverFow项目,都是关于如何防止多构建的东西,但没有一个解决我的核心问题(我需要MultiProvider,但不想多次触发使用者,在使用者内部,我有一个异步进程,不应该使用多个使用者触发器进行处理)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
任何解决方案或替代解决方案都会对我有帮助,请提前感谢。我也有同样的想法。你可以尝试
选择器
(我尝试过一次,但我知道自己做的事情比现在少,所以会再试一次)。此外,提供程序
也有。例如,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();
}
},
);
}));