如何解决Flutter MultiProvider Consumer触发器-如何防止多重重建?
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();
}
},);
}));
如上所述,我的MultiProvider消费者很少。在Consumer3代码块中,我具有FutureBuilder,因为我具有异步会话状态更新方法checkAndUpdateSessionStatus()。消费者3代码块被多次触发,我认为这是MultiProvider消费者模型的本质。问题是,现在checkAndUpdateSessionStatus()也被多次调用,而我希望被调用一次。我可以使用StreamBuilder,但仍然需要异步checkAndUpdateSessionStatus()。
我很陌生。我已经看到许多关于如何防止多重构建的东西的StackOverFow项,但它们都没有解决我的核心问题(我需要MultiProvider,但不想多次触发使用者,并且在使用者内部,我有一个异步过程,该过程不应与多个消费者触发器)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。