Flutter 如何解决这个错误;在生成期间调用setState()或markNeedsBuild();?
所以我在摩尔有一个表,它返回一个Flutter 如何解决这个错误;在生成期间调用setState()或markNeedsBuild();?,flutter,dart,flutter-provider,Flutter,Dart,Flutter Provider,所以我在摩尔有一个表,它返回一个未来,我正试图用这些数据制作饼图 class Stats extends StatefulWidget { @override _StatsState createState() => _StatsState(); } class _StatsState extends State<Stats> { @override void initState() { super.initState(); }
未来
,我正试图用这些数据制作饼图
class Stats extends StatefulWidget {
@override
_StatsState createState() => _StatsState();
}
class _StatsState extends State<Stats> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
_buildTaskList(context)
],
);
}
}
FutureBuilder<List<Account>> _buildTaskList(BuildContext context) {
Map<String, double> dataMap = Map();
dataMap.putIfAbsent("SNACKS", () => Provider.of<Amount>(context,listen: false).snack_amount);
dataMap.putIfAbsent("ENTERTAINMENT", () => Provider.of<Amount>(context,listen: false).entertainment_amount);
dataMap.putIfAbsent("STATIONARY", () => Provider.of<Amount>(context,listen: false).stationary_amount);
dataMap.putIfAbsent("OTHERS", () => Provider.of<Amount>(context,listen: false).others_amount);
final dao = Provider.of<AccountDao>(context);
return FutureBuilder(
future: dao.getAllAccounts(),
builder: (context, AsyncSnapshot<List<Account>> snapshot) {
final accounts = snapshot.data ?? List();
Provider.of<Amount>(context,listen: false).add(Calculate(accounts, Type.SNACKS), Calculate(accounts, Type.ENTERTAINMENT),
Calculate(accounts, Type.STATIONARY), Calculate(accounts, Type.OTHERS));
if (accounts == null) {
return Text('No Accounts Yet');
} else {
return PieChart(
dataMap: dataMap,
);
}
},
);
}
double Calculate(List<Account> list, Type type){
double sum=0;
for(int i=0;i<list.length;i++){
if(list[i].type==type){
sum=sum+list[i].amount;
}
}
return sum;
}
获取未来的函数
```Future>getAllAccounts()=>select(accounts).get()``
编辑
我按照建议编辑了我的答案
return FutureBuilder(
future: dao.getAllAccounts(),
builder: (context, AsyncSnapshot<List<Account>> snapshot) {
if(snapshot.connectionState==ConnectionState.done){
final accounts = snapshot.data ?? List();
if (accounts == null) {
return Text('No Accounts Yet');
} else {
Provider.of<Amount>(context,listen: false).add(Calculate(accounts, Type.SNACKS), Calculate(accounts, Type.ENTERTAINMENT),
Calculate(accounts, Type.STATIONARY), Calculate(accounts, Type.OTHERS));
dataMap.putIfAbsent("SNACKS", () => Provider.of<Amount>(context,listen: false).snack_amount);
dataMap.putIfAbsent("ENTERTAINMENT", () => Provider.of<Amount>(context,listen: false).entertainment_amount);
dataMap.putIfAbsent("STATIONARY", () => Provider.of<Amount>(context,listen: false).stationary_amount);
dataMap.putIfAbsent("OTHERS", () => Provider.of<Amount>(context,listen: false).others_amount);
return PieChart(
dataMap: dataMap,
);
}
}else if(snapshot.connectionState==ConnectionState.waiting){
return Container();
}else{
return Container();
}
},
返回FutureBuilder(
future:dao.getAllAccounts(),
生成器:(上下文,异步快照){
if(snapshot.connectionState==connectionState.done){
决算=snapshot.data??List();
如果(帐户==null){
返回文本(“还没有帐户”);
}否则{
Provider.of(context,listen:false)、add(Calculate(accounts,Type.零食)、Calculate(accounts,Type.ENTERTAINMENT),
计算(账户,类型。固定),计算(账户,类型。其他);
dataMap.putIfAbsent(“零食”,()=>Provider.of(context,listen:false).snakt\u amount);
dataMap.putIfAbsent(“娱乐”,()=>Provider.of(context,listen:false).ENTERTAINMENT\u amount);
dataMap.putIfAbsent(“stational”,()=>Provider.of(context,listen:false)。stational\u amount);
dataMap.putIfAbsent(“其他”,()=>Provider.of(context,listen:false).OTHERS\u amount);
返回图(
dataMap:dataMap,
);
}
}else if(snapshot.connectionState==connectionState.waiting){
返回容器();
}否则{
返回容器();
}
},
但还是一样的错误
发送金额通知时引发了以下断言:生成期间调用的setState()或markNeedsBuild()
此错误表示您正在生成阶段调用setState
从你的日志中,它明确指出
只有当小部件的一个祖先当前正在构建时,才可以将其标记为需要在构建阶段构建。允许此异常,因为框架在子部件之前构建父小部件,这意味着将始终构建脏子部件。否则,框架可能不会在构建阶段访问此小部件
您可以实现ConnectionState.waiting
ConnectionState.done
我已经更新了问题,请查看问题,如果可能,请给出代码。
return FutureBuilder(
future: dao.getAllAccounts(),
builder: (context, AsyncSnapshot<List<Account>> snapshot) {
if(snapshot.connectionState==ConnectionState.done){
final accounts = snapshot.data ?? List();
if (accounts == null) {
return Text('No Accounts Yet');
} else {
Provider.of<Amount>(context,listen: false).add(Calculate(accounts, Type.SNACKS), Calculate(accounts, Type.ENTERTAINMENT),
Calculate(accounts, Type.STATIONARY), Calculate(accounts, Type.OTHERS));
dataMap.putIfAbsent("SNACKS", () => Provider.of<Amount>(context,listen: false).snack_amount);
dataMap.putIfAbsent("ENTERTAINMENT", () => Provider.of<Amount>(context,listen: false).entertainment_amount);
dataMap.putIfAbsent("STATIONARY", () => Provider.of<Amount>(context,listen: false).stationary_amount);
dataMap.putIfAbsent("OTHERS", () => Provider.of<Amount>(context,listen: false).others_amount);
return PieChart(
dataMap: dataMap,
);
}
}else if(snapshot.connectionState==ConnectionState.waiting){
return Container();
}else{
return Container();
}
},