我有一个有主屏幕的Flutter 翼项目.我已经向URL接口发送了http GET请求,需要从快照中获取数据. 但SnapShot.hasData返回FALSE.

打印响应正文时的控制台输出.

Performing hot reload...
Syncing files to device sdk gphone64 x86 64...
I/flutter ( 4384): NoSuchMethodError: Class 'MappedListIterable<Map<String, dynamic>, User>' has no instance method 'tolist'.
I/flutter ( 4384): Receiver: Instance of 'MappedListIterable<Map<String, dynamic>, User>'
I/flutter ( 4384): Tried calling: tolist()
Reloaded 1 of 671 libraries in 1,336ms (compile: 141 ms, reload: 534 ms, reassemble: 567 ms).
D/EGL_emulation( 4384): app_time_stats: avg=271975.19ms min=271975.19ms max=271975.19ms count=1
I/flutter ( 4384): [{"name":"James Calton","city":"London","image":"https://randomuser.me/api/portraits/men/78.jpg"},{"name":"Don Quixote","city":"Madrid","image":"https://randomuser.me/api/portraits/men/74.jpg"},{"name":"Joan of Arc","city":"Paris","image":"https://randomuser.me/api/portraits/men/76.jpg"},{"name":"Rosa Park","city":"Alabama","image":"https://randomuser.me/api/portraits/men/75.jpg"},{"name":"James Calton","city":"London","image":"https://randomuser.me/api/portraits/men/78.jpg"},{"name":"Don Quixote","city":"Madrid","image":"https://randomuser.me/api/portraits/men/74.jpg"},{"name":"James Calton","city":"London","image":"https://randomuser.me/api/portraits/men/78.jpg"},{"name":"Don Quixote","city":"Madrid","image":"https://randomuser.me/api/portraits/men/74.jpg"},{"name":"James Calton","city":"London","image":"https://randomuser.me/api/portraits/men/78.jpg"},{"name":"Don Quixote","city":"Madrid","image":"https://randomuser.me/api/portraits/men/79.jpg"},{"name":"James Calton","city":"London","image":"https://rand
I/flutter ( 4384): NoSuchMethodError: Class 'MappedListIterable<Map<String, dynamic>, User>' has no instance method 'tolist'.
I/flutter ( 4384): Receiver: Instance of 'MappedListIterable<Map<String, dynamic>, User>'
I/flutter ( 4384): Tried calling: tolist()
D/EGL_emulation( 4384): app_time_stats: avg=1965.76ms min=1965.76ms max=1965.76ms count=1

判断是否为SnapShot.hasData的主要代码:

Expanded(child: FutureBuilder(
              future: apiService.getUsers(),
              builder: (context, snapShot){
              print(snapShot.error);
                if(snapShot.hasData)
                {
                  return ListView.builder(
                    itemCount: snapShot.data?.length,
                    itemBuilder: (context , index){
                      return GestureDetector(
                        //onTap: (){},
                        child: Container(
                          margin: EdgeInsets.symmetric(horizontal: 10,vertical: 10),
                          padding: EdgeInsets.symmetric(horizontal: 10,vertical: 10),
                          child: ListTile(
                            title: Text('test', style: TextStyle(fontSize: 18, color: Colors.black),) //snapShot.data[index].name
                          ),
                        ),
                      );
                    },
                  );
                }else{
                  return Center(
                    child: CircularProgressIndicator(),
                }

向接口url发送http GET请求并判断状态码是否为200的代码:

class RestAPIService{

  String apiUrl = 'https://mocki.io/v1/ed0c6388-7a27-4c27-942b-f1b6b358178e';

  //// Future method to Get all users from API url | Returns > Response/Error
  Future<List<User>> getUsers() async{

    final response = await http.get(Uri.parse(apiUrl));
    print(response.body);

    //print(response.body);

    //// checking if the request is success with statusCode (200 = OK)
    if(response.statusCode == 200){
      //print(response.body);
      getUsersList(response.body);


    }else{
      throw Exception('Unable to fetch data');
    }
    return getUsers();
  }

  //// Convert response body => user object list
  List<User> getUsersList(String responseBody)
  {
    final parsedBody = json.decode(responseBody).cast<Map<String , dynamic>>();
    return parsedBody.map<User>((json) => User.fromJson(json)).tolist();
  }

}

所有DART文件:https://drive.google.com/drive/folders/1bcDV7eR_n7WgjCcmI1yKZoKRcAQhEylV?usp=sharing

我不知道为什么快照没有数据,但请求的响应有数据.

推荐答案

我所做的只是改变了这一切

builder: (context, snapShot){

对此:

builder: (context, AsyncSnapshot snapShot){

并按照@pskink的建议将tolist替换为toList

Flutter相关问答推荐

Cupertino Buttino SheetAction on按下可触发加载指示器,然后勾选并延迟

功能不起作用的Flutter 块复制

为什么PUT方法没有发出任何响应?

与FTPS连接时出现Flutter FTPConnect HandshakeException错误

如何画三角形的圆角?

火焰Flutter 在多个向量之间插补2

Flutter中不使用Container是否可以做margin

Dart:未捕获错误:RangeError(索引):索引超出范围:索引应小于 7:7

模块是使用不兼容的 kotlin 版本编译的.其元数据的二进制版本是1.8.0,预期版本是1.6

Android 模拟器在 Apple M2 芯片 EXC_BAD_ACCESS / KERN_INVALID_ADDRESS 上随机崩溃

小部件堆栈未显示顶层

Flutter Bloc 使用 Cubit 监听流和emits 状态

Flutter 构建方法使用的是旧版本的变量?

如何使用 Rrect 或类似工具在 flutter 中绘制梯形线?

Flutter中如何连续获取TextField的文本是否为空?

更改文本字段Flutter 中最大字母的 colored颜色

如何使用 Navigator 2.0 导航到任何页面?

try 为两个下拉值添加共享首选项,但在 Flutter 上显示错误断言失败:?

如何在 Flutter 中的页面加载上的 Listview 上应用自动滚动

Textfield 和 MasonryGrid 给出错误(垂直视口的高度没有限制)