我从服务器获取数据并尝试在网格视图中进行设置,但出现错误:
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();
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据你提供的代码,问题出在数据获取和类型转换上。你的fetchData
方法返回的是一个Future<List<Data>>
,但是在调用时你尝试将其直接强制转换为List
,这导致了类型不匹配的错误。
要解决这个问题,你需要确保在数据完全加载后再使用它,并且正确处理异步操作的结果。以下是修改后的代码示例:
// 使用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
文件中的fetchData
方法看起来是正确的,用于从网络获取数据并将其转换为Data
对象列表。不需要对此进行修改。
通过使用FutureBuilder
,你可以更优雅地处理异步数据加载,同时在数据准备就绪前向用户显示加载指示器或错误信息。这样就不会再出现类型转换的错误了。