获取数据,然后构建listview



am正在尝试获取数据,然后将其显示在列表视图中。。首先,我会获取一个哈希值,然后将其与我保存的哈希进行比较,如果相同,那么我会获取保存的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();
}

问题是,一旦页面启动,我将得到长度为空的红色错误flutter屏幕。。因为数据尚未提取。。然后将显示列表。。

我如何获取数据,然后建立列表,这样我就不会得到错误?

而且,自从我收到这些消息以来,这些功能不断重复:

I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里I/flutter(3556(:存在I/flutter(3556(:I/flutter(3556(:调用apiI/flutter(3556(:存在I/flutter(3556(:d1f4bd60f52991d100adafa416f48b52I/flutter(3556(:从保存的json中获取I/flutter(3556(:在这里….

我怎么能只调用一次?页面首次启动的时间?

您需要使用FutureBuilder

https://docs.flutter.io/flutter/widgets/FutureBuilder-class.html请参阅示例代码,其中"_calculation"是数据源。

它需要被包裹在一个未来中。

试试这个

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

最新更新