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 如何解决这个错误;在生成期间调用setState()或markNeedsBuild();?_Flutter_Dart_Flutter Provider - Fatal编程技术网

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();
      }


    },