问题描述
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 (将#修改为@)