Flutter 在调用构建方法之前,如何等待异步方法完成加载数据?

Flutter 在调用构建方法之前,如何等待异步方法完成加载数据?,flutter,dart,Flutter,Dart,我在initState()中调用_read方法来读取文件并生成映射。但是这个方法是aynch,它不等待它的完成,所以map得到null,我得到异常“传递给饼图的dataMap不能为null或空”。如何在build方法中加载小部件之前等待_read()方法完成 import 'package:flutter/material.dart'; import 'package:pie_chart/pie_chart.dart'; import 'package:path_provider/path_pr

我在initState()中调用_read方法来读取文件并生成映射。但是这个方法是aynch,它不等待它的完成,所以map得到null,我得到异常“传递给饼图的dataMap不能为null或空”。如何在build方法中加载小部件之前等待_read()方法完成

import 'package:flutter/material.dart';
import 'package:pie_chart/pie_chart.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';

class Visualize extends StatefulWidget {

  @override
  State<StatefulWidget> createState() => new VisualizeState();

}

Map<String, double> dataMap = new Map();

class VisualizeState extends State<Visualize> {

  @override
  void initState()  {
    _read();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
      return new Material(
        color: Colors.blueAccent,
        child: new PieChart(
          dataMap: dataMap,
          chartValueBackgroundColor: Colors.blueGrey[900],
          animationDuration: Duration(milliseconds: 800),
          chartLegendSpacing: 32.0,
          chartRadius: MediaQuery
              .of(context)
              .size
              .width / 2.7,
          showChartValuesInPercentage: true,
          showChartValues: true,
        ),
      );
  }

  Future<String> _read() async {
    String text;
    try {
      final Directory directory = await getApplicationDocumentsDirectory();
      final File file = File('${directory.path}/todo_list4.txt');
      text = await file.readAsString();

      var list = text.split("\n");
      for(final x in list)
        {
          var values = x.split(",");
          print(values);
          print(values[0]);
          print(values[1]);
          dataMap.putIfAbsent(values[0], () => double.parse(values[1]) );
        }

    } catch (e) {
      print("Couldn't read file" +e);
    }
    return text;
  }

}
导入“包装:颤振/材料.省道”;
导入“package:pie_chart/pie_chart.dart”;
导入“package:path_provider/path_provider.dart”;
导入“dart:io”;
类Visualize扩展StatefulWidget{
@凌驾
State createState()=>新的可视化状态();
}
映射数据映射=新映射();
类状态扩展了状态{
@凌驾
void initState(){
_read();
super.initState();
}
@凌驾
小部件构建(构建上下文){
退回新材料(
颜色:Colors.blueAccent,
孩子:新皮查特(
dataMap:dataMap,
chartValueBackgroundColor:颜色.蓝灰色[900],
animationDuration:持续时间(毫秒:800),
chartLegendSpacing:32.0,
chartRadius:MediaQuery
.of(上下文)
.尺寸
.宽度/2.7,
showChartValuesInPercentage:真,
showChartValues:正确,
),
);
}
Future\u read()异步{
字符串文本;
试一试{
最终目录目录=等待getApplicationDocumentsDirectory();
final File File=File('${directory.path}/todo_list4.txt');
text=wait file.readAsString();
var list=text.split(“\n”);
对于(列表中的最终x)
{
var值=x.split(“,”);
打印(值);
打印(值[0]);
打印(值[1]);
dataMap.putIfAbsent(值[0],()=>double.parse(值[1]);
}
}捕获(e){
打印(“无法读取文件”+e);
}
返回文本;
}
}
使用一个

class VisualizeState extends State<Visualize> {
  Future<String> chartDataFuture;

  @override
  void initState()  {
    chartDataFuture = _read();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
      return new FutureBuilder<String>(
        future: chartDataFuture,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            Material(
              color: Colors.blueAccent,
              child: new PieChart(...),
            );
          }
          else {
            // TODO: Build loading or error.
          }
        }
      );
  }
类状态扩展状态{
未来,未来;;
@凌驾
void initState(){
chartDataFuture=_read();
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回新的FutureBuilder(
未来:未来,
生成器:(上下文,快照){
if(snapshot.hasData){
材料(
颜色:Colors.blueAccent,
孩子:新皮查特(…),
);
}
否则{
//TODO:生成加载或错误。
}
}
);
}

您应该使用FutureBuilder,这是一个例外,但有一个变化:“构建函数返回null'@yogas,那么您可能没有填写
TODO
部分。