提取Json后无法刷新ListView

时间:2018-10-23 05:56:47

标签: android dart flutter flutter-layout dart-html

我一直试图从服务器中获取数据,并将其显示在futurebuilder的listview.builder中,但是listview仅在应用setstate()后才更新,请保持一段时间的帮助。

  Future<dynamic> _fetchData() async {
    sPref.getUserId().then((onValue) {
      userIds = onValue;
    });
    sPref.getAuthToken().then((val) {
      token = val;
      var body = {
        'userId': '$userIds',
      };
      var client = http.Client();    

      var response = http.Request(
          'POST', Uri.parse('http://example.net/api/fetchJson'));    

      response.headers["Authorization"] = "Bearer $token";
      response.bodyFields = body;
      print(response.headers);
      client.send(response).then((response) {
        return http.Response.fromStream(response);
      }).then((res) {
        return res.body;
      }).then((body) {
        return json.decode(body);
      }).then((body) {
        print(body.toString());
        var datas = body['data'];
        if (body['status'] == 'success') {
          list = (datas as List)
              .map((data) => new PosModelData.fromJson(data))
              .toList();
          return list;
        } else {
          print('failed');
        }
      });
      return list;
    });
  }  

这是我将来所说的地方。需要知道我要去哪里。

           body: FutureBuilder(
             future: _fetchData(),
             builder: (context, data) {
               switch (data.connectionState) {
                 case ConnectionState.none:
                 case ConnectionState.waiting:
                   return Center(child: CircularProgressIndicator());
                 default:
                   // if (data.hasError)
                   //   return new Text('Error: ${data.error}');
                   // else
                   return ListView.builder(
                     itemCount: list.length,
                     itemBuilder: (BuildContext context, int index) {
                       return Container(
                         padding: EdgeInsets.symmetric(
                             horizontal: 6.0, vertical: 4.0),
                         child: Card(
                           elevation: 10.0,
                           child: Column(children: <Widget>[
                             ListTile(
                               title: Text(list[index].firstName),
                               subtitle: list[index].phone != null
                                   ? Text(list[index].phone)
                                   : Text('Not mentioned'),
                               trailing: trailingText(index),
                             ),
                           ]),
                         ),

1 个答案:

答案 0 :(得分:0)

在您的代码中,您没有从row_number()块中调用dense_rank()

您的退货类型为select dense_rank() over (order by (seq1-seq2)) as newcol, Name, Age from (select t.*, row_number() over (order by name) as seq1, (row_number() over (order by name) - 1) % 3 as seq2 from table t ) t; ,您需要使用call apoc.load.json("file:///Users\adnan\Desktop\test.json") yield value Return value ,并从return块中指定您的退货类型_fetchData()Future

await

然后您将从回调List<PosModelData>中获得列表。

请检查this示例。

已更新1

代替使用returnasync,使用Future<List<PosModelData>> _fetchData() async { final response = await http.Request('POST', Uri.parse('http://example.net/api/fetchJson')); final list = ... convert response to list return list; } 的另一种方法是返回builder: (context, data) {}类型。指定返回类型async,然后返回await类型

Future

请检查以下示例代码和Future document以进行飞镖异步编程。

Future<List< PosModelData>>