【问题标题】:Future Builder to make Sliver ListsFuture Builder 制作 Sliver 列表
【发布时间】:2018-07-12 06:05:35
【问题描述】:

我正在尝试从 GET 请求生成一个动态的条子列表。但是我遇到了麻烦,似乎响应数据为空。这是我的代码:

import 'package:flutter/material.dart';
import 'boardSummary.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:async';
import 'package:flutter/foundation.dart';


class HomepageBody extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {

    return HomepageBodyState();
  }
}

class HomepageBodyState extends State <HomepageBody> {


  @override
  Widget build(BuildContext context) {
    return new Expanded(
      child: new Container(
        color: new Color(0xFF736AB7),
        child: new FutureBuilder <List<Post>>(
            future: fetchPost(),
            builder: (BuildContext context, AsyncSnapshot snapshot) {
              if (snapshot.hasError) print(snapshot.error);
              else
              return jobscroll(context, snapshot);
                  //: Center(child: CircularProgressIndicator());
            }


        ),
      ),
    );
  }
}

Future<List<Post>>fetchPost() async {
final response = await http.get('https://jsonplaceholder.typicode.com/posts?userId=1');

return compute(parsePosts, response.body);

}


List<Post> parsePosts(String responseBody){
  final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();

  return parsed.map<Post>((json)=>Post.fromJson(json)).toList();

}


class Post {

  final String userId;
  final String hashtag;
  final String price;
  final String description;

  Post({this.userId, this.hashtag, this.price, this.description});

  factory Post.fromJson(Map<String, dynamic> json) {
    return Post(
      userId: json['userId'],
      hashtag: json['id'],
      price: json['title'],
      description: json['body'],
    );
  }

  }


 Widget jobscroll(BuildContext context, AsyncSnapshot snapshot) {

  List data = snapshot.data;

   return CustomScrollView(
     scrollDirection: Axis.vertical,
     shrinkWrap: false,
     slivers: <Widget>[new SliverPadding(
       padding: const EdgeInsets.symmetric(vertical: 24.0),
       sliver: new SliverList(
         delegate: new SliverChildBuilderDelegate(
               (context, index) => new BoardSummary(data[index]),
            childCount: data.length,
         ),
       ),
     ),
     ],
   );
 }

BoardSummary 是一个无状态的小部件类,它只需要使用每个“帖子”上的属性创建一个“卡片”。它接受一个“Post”类型的对象。

控制台吐出了很多错误,但这是最后一个似乎有意义的错误,它也出现在我的模拟器中:

I/flutter (18882): Another exception was thrown: NoSuchMethodError: The getter 'length' was called on null.

编辑这也是我松弛跟踪的前几行:

E/flutter (13964): type 'int' is not a subtype of type 'String'
E/flutter (13964): #0      new Post.fromJson (file:///home/daniel/Desktop/testapp/lib/ui/homePageBody.dart:76:19)
E/flutter (13964): #1      parsePosts.<anonymous closure> (file:///home/daniel/Desktop/testapp/lib/ui/homePageBody.dart:60:40)
E/flutter (13964): #2      MappedListIterable.elementAt (dart:_internal/iterable.dart:414:29)
E/flutter (13964): #3      ListIterable.toList (dart:_internal/iterable.dart:219:19)
E/flutter (13964): #4      parsePosts (file:///home/daniel/Desktop/testapp/lib/ui/homePageBody.dart:60:56)
E/flutter (13964): #5      _IsolateConfiguration.apply (package:flutter/src/foundation/isolates.dart:88:16)
E/flutter (13964): #6      _spawn.<anonymous closure> (package:flutter/src/foundation/isolates.dart:96:30)

我该怎么办?

Edit 将这段代码转换为字符串使其工作,只是需要修复溢出。如果有更好的解决方案,欢迎分享!

  return Post(
      userId: json['userId'].toString(),
      hashtag: json['id'].toString(),
      price: json['title'].toString(),
      description: json['body'].toString(),
    );

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    FutureBuilder 即使值尚不可用也会立即构建,因为build() 是同步的,不能延迟。

    FutureBuilder 示例展示了如何检查值是否已经可用(default: ... 而不是snapshot.hasError):

    new FutureBuilder<String>(
      future: _calculation, // a Future<String> or null
      builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
        switch (snapshot.connectionState) {
          case ConnectionState.none: return new Text('Press button to start');
          case ConnectionState.waiting: return new Text('Awaiting result...');
          default:
            if (snapshot.hasError)
              return new Text('Error: ${snapshot.error}');
            else
              return new Text('Result: ${snapshot.data}');
        }
      },
    )
    

    【讨论】:

    • 我仍然得到同样的错误,不知道为什么。我正在从 Jsonplaceholder 网站获取 JSON。
    • ConnectionStatenonewaiting 时,您不能使用data.length
    • 啊,我看看我是否把它取下来,我只是得到一个空白屏幕(我的背景颜色),没有出现奇怪的数据。我从我的松弛跟踪中添加了更多信息,我认为这是一个将 int 视为字符串的问题,不确定。
    • 正如我所说,数据到达需要一段时间。然后将再次调用构建器并更改ConnectionState。当 ConnectionStatenonewaiting 时,您可以显示微调器或类似的东西
    • 谢谢,我也会添加微调器!我还能够通过将我的对象属性转换为字符串来解决这个问题。不确定这是否是一个好的解决方案,但它目前有效。
    猜你喜欢
    • 2021-03-04
    • 2020-07-21
    • 2019-05-10
    • 2019-07-05
    • 2023-02-08
    • 2021-03-02
    • 2021-03-02
    • 2022-06-21
    • 2021-11-15
    相关资源
    最近更新 更多