正在尝试获取数据,然后将其显示在列表视图中。首先,我将获取一个哈希值,然后将其与我保存的哈希值进行比较,如果是相同的话,那么我将获取保存的json数据,如果不是,我将调用api .就像这样:
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
Future<File> get _localFile async {
final path = await _localPath;
File f = File('$path/mypollshash.txt');
if (f.existsSync()) {
print('exists');
String contents = await f.readAsString();
content = contents;
fetchHash();
} else {
print('not exists');
fetch();
}
return f;
}
Future checkfileexist() async {
try {
final file = await _localFile;
String contents = await file.readAsString();
content = contents;
} catch (e) {
//return 'nothing';
}
}
Future<File> writehash(String hash) async {
final file = await _localFile;
return file.writeAsString('$hash', mode: FileMode.write);
}
Future<File> get _localjson async {
final path = await _localPath;
return File('$path/mypolls.json');
}
Future<File> writejson(String json) async {
final file = await _localjson;
return file.writeAsString('$json', mode: FileMode.write);
}
Future readjson() async {
try {
final file = await _localjson;
String contents = await file.readAsString();
content = contents;
setState(() {
polls = pollsFromJson(content);
});
writejson(pollsToJson(polls));
writehash(polls.hash);
print('here');
// return contents;
} catch (e) {
print('there');
print(e);
// If we encounter an error, return 0
//return 'nothing';
}
}
fetch() async {
String data =
await DefaultAssetBundle.of(context).loadString("assets/mypolls.json");
setState(() {
polls = pollsFromJson(data);
});
writejson(pollsToJson(polls));
writehash(polls.hash);
}
fetchHash() async {
String data = await DefaultAssetBundle.of(context)
.loadString("assets/pollshash.json");
print(content);
final pollshash = pollshashFromJson(data);
if (content == pollshash.hash) {
print('take from the saved json');
readjson();
} else {
print('call api');
fetch();
}
}我在这里称之为:
@override
void initState() {
super.initState();
checkfileexist();
}问题是,一旦页面启动,我将得到长度为null的红色错误颤振屏幕。因为数据还没有被取走。然后列表就会显示出来。
如何获取数据fisrt,然后构建列表,这样我就不会得到错误?
而且,自从我收到这些消息之后,这些函数就会一次又一次地重复:
I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json /颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json I/颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json I/颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json /颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json I/颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json I/颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json /颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json I/颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json I/颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json /颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json I/颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json I/颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json /颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json I/颤振( 3556):这里I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json I/颤振( 3556):这里我/颤振( 3556):存在I/颤振( 3556):I/颤振( 3556):调用api I/颤振( 3556):存在I/颤振( 3556):d1f4bd60f52991d100adafa416f48b52 I/颤振( 3556):从保存的json /颤振( 3556):这里.
我怎么能叫它一次?第一次启动页面是什么时候?
发布于 2018-11-01 08:13:13
您需要使用FutureBuilder
https://docs.flutter.io/flutter/widgets/FutureBuilder-class.html查看示例代码,其中'_calculation‘是数据的来源。
它需要被包裹在未来。
发布于 2018-11-01 09:38:09
尝尝这个
Widget _myBuild() {
return FutureBuilder(
future: _fetchData(),
builder: (context, snapshot) {
if (snapshot.hasData) {
// Update UI with data
} else if (snapshot.hasError) {
// show error
}
// show progress indicator
CircularProgressIndicator();
});
}https://stackoverflow.com/questions/53096798
复制相似问题