首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取数据,然后构建列表视图

获取数据,然后构建列表视图
EN

Stack Overflow用户
提问于 2018-11-01 07:23:18
回答 2查看 96关注 0票数 0

正在尝试获取数据,然后将其显示在列表视图中。首先,我将获取一个哈希值,然后将其与我保存的哈希值进行比较,如果是相同的话,那么我将获取保存的json数据,如果不是,我将调用api .就像这样:

代码语言:javascript
复制
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();
}
}

我在这里称之为:

代码语言:javascript
复制
@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):这里.

我怎么能叫它一次?第一次启动页面是什么时候?

EN

回答 2

Stack Overflow用户

发布于 2018-11-01 08:13:13

您需要使用FutureBuilder

https://docs.flutter.io/flutter/widgets/FutureBuilder-class.html查看示例代码,其中'_calculation‘是数据的来源。

它需要被包裹在未来。

票数 0
EN

Stack Overflow用户

发布于 2018-11-01 09:38:09

尝尝这个

代码语言:javascript
复制
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();
      });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53096798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档