开发者社区 问答 正文

类型强制类型'Future <List <Data >>'不是类型'List <Data>'的子类型

我从服务器获取数据并尝试在网格视图中进行设置,但出现错误:

type 'Future<List<Data>>' is not a subtype of type 'List<Data>' in type cast

这是我的数据类:

class Data with ChangeNotifier {
Data({
  this.name,
  this.image,
});

final String image;
final String name;


factory Data.fromJson(Map<String, dynamic> json) {
print(json['title'].toString());
return Data(
  name: json['title'].toString(),
  image: json['image'].toString(),
 );

}
}

这是我的Data_screen,我在此调用它:

 var datas= Provider.of<Datas>(context).fetchData() as List<Data>;
 var datalength = datas.length;

小部件:

 Expanded(
            child: GridView.builder(
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(

                crossAxisSpacing: 10,
                mainAxisSpacing: 10,
              ),
              padding: EdgeInsets.only(left: 28, right: 28, bottom: 58),
              itemCount: datas.length,

              itemBuilder: (context, index) => DataCard(
                datas[index],
                index: index,
                onPress: () {
                },
              ),
            ),
          ),

在Datas.dart中:

 Future<List<Data>> fetchData() async {
 var response = await http.get(url);
 var responseJson = json.decode(response.body);
 print(responseJson);
 return (responseJson['datas'])
    .map<Data>((p) => Data.fromJson(p))
  .toList();
}

展开
收起
Puppet 2019-12-04 15:19:08 891 分享 版权
阿里云 AI 助理回答

根据你提供的代码,问题出在数据获取和类型转换上。你的fetchData方法返回的是一个Future<List<Data>>,但是在调用时你尝试将其直接强制转换为List,这导致了类型不匹配的错误。

要解决这个问题,你需要确保在数据完全加载后再使用它,并且正确处理异步操作的结果。以下是修改后的代码示例:

修改Data_screen中的调用部分

// 使用FutureBuilder来处理异步数据
FutureBuilder<List<Data>>(
  future: Provider.of(context).fetchData(), // 获取数据的异步操作
  builder: (BuildContext context, AsyncSnapshot<List<Data>> snapshot) {
    switch (snapshot.connectionState) {
      case ConnectionState.waiting: // 数据正在加载
        return Center(child: CircularProgressIndicator()); // 显示加载指示器
      default:
        if (snapshot.hasError) {
          return Center(child: Text('Error: ${snapshot.error}')); // 处理错误情况
        } else {
          List<Data> datas = snapshot.data ?? []; // 确保数据不为空
          return Expanded(
            child: GridView.builder(
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisSpacing: 10,
                mainAxisSpacing: 10,
              ),
              padding: EdgeInsets.only(left: 28, right: 28, bottom: 58),
              itemCount: datas.length,
              itemBuilder: (context, index) => DataCard(
                datas[index],
                index: index,
                onPress: () {},
              ),
            ),
          );
        }
    }
  },
),

Datas.dart保持不变

你的Datas.dart文件中的fetchData方法看起来是正确的,用于从网络获取数据并将其转换为Data对象列表。不需要对此进行修改。

通过使用FutureBuilder,你可以更优雅地处理异步数据加载,同时在数据准备就绪前向用户显示加载指示器或错误信息。这样就不会再出现类型转换的错误了。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: