Flutter报错:List<dynamic>无法转为FutureOr<List<Map<String,dynamic>>>
解决‘List is not a subtype of type FutureOr<List<Map<String,dynamic>>>’错误
问题根源
json.decode(resp.body)返回的是List<dynamic>类型,但你的fetchdata函数声明要返回Future<List<Map<String,dynamic>>>,Dart的强类型系统不允许这种隐式类型转换,所以FutureBuilder会触发错误分支。
修复方案
方案1:显式强制类型转换
适合你确定接口返回结构完全符合预期的场景,直接将解码结果强制转换为目标类型:
Future<List<Map<String,dynamic>>> fetchdata() async { var resp = await http.get(Uri.parse("https://jsonplaceholder.typicode.com/photos")); print("fetchdata function showing"+json.decode(resp.body).toString()); // 新增强制类型转换 return json.decode(resp.body) as List<Map<String,dynamic>>; }
方案2:安全类型校验转换(推荐)
如果需要避免接口返回异常导致的崩溃,可以先校验类型再转换:
Future<List<Map<String,dynamic>>> fetchdata() async { var resp = await http.get(Uri.parse("https://jsonplaceholder.typicode.com/photos")); final decodedData = json.decode(resp.body); print("fetchdata function showing"+decodedData.toString()); if (decodedData is List) { return decodedData.cast<Map<String,dynamic>>(); } else { throw Exception('接口返回数据不是预期的列表格式'); } }
额外优化建议
不要在build方法里直接调用fetchdata(),Widget重建时会重复发起网络请求。可以把Future对象提前存到State变量中:
class _HomeScreenState extends State<HomeScreen> { late Future<List<Map<String,dynamic>>> _futureData; Future<List<Map<String,dynamic>>> fetchdata() async { // ... 原函数逻辑 } @override void initState() { super.initState(); _futureData = fetchdata(); // 初始化时仅调用一次 } @override Widget build(BuildContext context) { return SafeArea( child: Scaffold( body: MyBody(), ), ); } MyBody() { return FutureBuilder<List<Map<String,dynamic>>>( future: _futureData, // 使用预存的Future对象 builder: (context, snapshot) { // ... 原builder逻辑 }, ); } }
内容的提问来源于stack exchange,提问作者Irfan Ganatra
相关产品推荐
相关产品推荐

