Flutter运行报错'Null类型不是List<dynamic>子类型'问题求助
报错原因
这个报错是代码执行顺序错误导致的,FutureBuilder的builder回调会被多次触发:首次触发时异步请求还未完成,snapshot.data的值就是Null,你直接将Null赋值给非空类型的List变量,就触发了类型不匹配的报错。
另外你代码里还有两处隐含问题:
- 打印返回值的代码
print('responsBody');缺了变量插值符$,实际只会打印字符串字面量,没法判断接口返回是否正常 getMethod没有做异常捕获,也没有明确返回类型,接口请求失败、返回格式不符合预期时也会返回Null
修复方案
调整代码逻辑顺序:先判断加载状态、错误状态,确认异步请求成功且返回值不为空后,再进行变量赋值。
修正后的完整代码如下:
class _EntryState extends State<Entry> { // 明确指定返回类型,增加异常捕获 Future<List?> getMethod() async { try { String theUrl = 'http://ananyananu.000webhostapp.com/getData.php'; var res = await http.get(Uri.parse(theUrl), headers: {"Accept":"application/json"}); var responsBody = json.decode(res.body); print ('I reached here'); print('$responsBody'); // 补全插值符,打印实际返回值 return responsBody as List; } catch(e) { print('请求出错:$e'); return null; } } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.grey[200], appBar: AppBar( title: Text('Connect to Local Host') , centerTitle: true, backgroundColor: Colors.redAccent, ), body: FutureBuilder( future: getMethod(), builder: (BuildContext context, AsyncSnapshot snapshot) { // 先判断加载状态 if (snapshot.connectionState == ConnectionState.waiting) { return Center( child: CircularProgressIndicator(), ); } // 再判断错误状态 if (snapshot.hasError || snapshot.data == null) { return Center( child: Text('Error Fetching Data'), ); } // 确认返回值不为空后再赋值 List snap = snapshot.data as List; return ListView.builder( itemCount: snap.length, itemBuilder: (context, index) { return ListTile( title: Text("head: ${snap[index]['heading']}"), subtitle: Text("body ${snap[index] ['body']}"), ); }, ); }, ), ); } }
内容的提问来源于stack exchange,提问作者Uttam Mane
相关产品推荐
相关产品推荐

