【问题标题】:Type 'List<dynamic>' is not a subtype of type 'FutureOr<List<RideData>>', Flutter类型 'List<dynamic>' 不是类型 'FutureOr<List<RideData>>' 的子类型,Flutter
【发布时间】:2021-08-02 13:42:36
【问题描述】:

我正在调用 API,但我一直在尝试正确解析此 JSON 响应,但我无法解决此问题。我调用 API,并想用FutureBuilderProvider 显示数据,但我收到了错误Type 'List&lt;dynamic&gt;' is not a subtype of type 'FutureOr&lt;List&lt;RideData&gt;&gt;',我不确定我做错了什么。代码如下:

API 调用:

  Future<List<RideData>> getRides() async {
    final response = await HTTP.apiRequest(Method.GET, '/rides');
    final data = jsonDecode(response.body)['data'];
    return data;
  }

我要显示数据的未来构建器:

 Future<List<RideData>> _getRideStreamList() async {
    final _vehicleStreamData = await APICall.instance.getRides();
    var provider = Provider.of<RideStore>(context, listen: false);
    provider.setVehicleList(_vehicleStreamData, notify: false);
    return _vehicleStreamData;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: SafeArea(
        child: SingleChildScrollView(
          scrollDirection: Axis.vertical,
          child: Column(
            children: [
              Container(
                height: 1000,
                child: FutureBuilder<List<RideData>>(
                  future: _getRideStreamList(),
                  builder: (context, snapshot) {
                    if (snapshot.hasData) {
                      Consumer<RideStore>(
                        builder: (context, rideData, child) {
                          return ListView.builder(
                            shrinkWrap: true,
                            itemCount: rideData.rideList.length,
                            itemBuilder: (context, index) {
                              RideData rides = rideData.getRideByIndex(index);
                              return Text('${rides.rideId}');
                            },
                          );
                        },
                      );
                    } else if (snapshot.hasError) {
                      return Text("${snapshot.error}");
                    }
                    return Container();
                  },
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

我几乎可以肯定 API 调用和响应的问题,因为我没有正确解析 JSON 数据,但也许我错了,还有其他问题...

【问题讨论】:

    标签: flutter mobile flutter-provider flutter-futurebuilder


    【解决方案1】:

    而且,除了指出的其他问题之外,您正在这样做:

    future: _getRideStreamList(),
    

    永远永远不会构建您正在关注的未来,作为构建 FutureBuilder 的一部分。无限循环!阅读 FutureBuilder 的文档,特别注意第二段和第三段。 StreamBuilder 也是如此。我有一个关于 https://www.youtube.com/watch?v=sqE-J8YJnpg 的视频来说明为什么文档不会撒谎。

    【讨论】:

      【解决方案2】:

      这一行

          final data = jsonDecode(response.body)['data'];
      

      您正在获取数据并对其进行解码,它会返回一个地图或字符串,而不是任何列表或任何模型......您应该先创建一个 RideData 列表然后返回它

      你可以按照这个方法

      List<RideData> list = List<RideData>();
          if (response.data != null) {
            list = data.map((item) => RideData.fromJson(item)).toList();
          }
          return list;
        }
      

      【讨论】:

        【解决方案3】:

        然后制作 RideData 的 Model 类

        Future<List<RideData>> getRides() async {
                final response = await HTTP.apiRequest(Method.GET, '/rides');
                List<dynamic> data = jsonDecode(response.body)['data'];
                List<YourModelClass> list = [];
                if (response.data != null) {
                  list = data.map((item) => YourModelClass.fromJson(item)).toList();
                }
                return list;
              }
        

        你可以生成模型类 https://javiercbk.github.io/json_to_dart/

        【讨论】:

          猜你喜欢
          • 2020-11-15
          • 1970-01-01
          • 2021-07-14
          • 2022-11-02
          • 2020-11-26
          • 2021-01-13
          • 2022-07-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多