Flutter 在调用构建方法之前,如何等待异步方法完成加载数据?
我在initState()中调用_read方法来读取文件并生成映射。但是这个方法是aynch,它不等待它的完成,所以map得到null,我得到异常“传递给饼图的dataMap不能为null或空”。如何在build方法中加载小部件之前等待_read()方法完成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
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
部分。