Flutter报错:type 'bool'不是List<ternakModel>子类型,求解决方案
解决Flutter类型转换错误:
type 'bool' is not a subtype of type 'List<ternakModel>' 错误根源
你的TernakProvider中getTernak()方法返回的是Future<bool>,但在FutureBuilder里你把snapshot.data强制转换成List<ternakModel>,直接导致布尔值与列表类型不匹配,触发转换错误。
修复方案(二选一即可)
方案一:让Provider方法直接返回列表类型
修改TernakProvider的getTernak()方法,使其返回获取到的列表而非布尔值:
class TernakProvider with ChangeNotifier { List<ternakModel> _ternak = []; List<ternakModel> get ternak => _ternak; set ternak(List<ternakModel> ternak) { _ternak = ternak; notifyListeners(); } Future<List<ternakModel>> getTernak() async { try { List<ternakModel> ternak = await TernakService().getTernak(); _ternak = ternak; notifyListeners(); return ternak; } catch (e) { print(e); rethrow; } } }
同步修改页面中的FutureBuilder,指定泛型并处理异常:
@override Widget build(BuildContext context) { TernakProvider ternakProvider = Provider.of<TernakProvider>(context); return Consumer<TernakProvider>( builder: (context, providerData, _) => FutureBuilder<List<ternakModel>>( future: providerData.getTernak(), builder: (context, snapshot) { if (snapshot.connectionState != ConnectionState.done) { return Text("Loading..."); } if (snapshot.hasError) { return Text("加载失败: ${snapshot.error}"); } List<ternakModel> ternak = snapshot.data ?? []; // 后续ListView渲染代码 })); }
方案二:利用Provider缓存的列表,FutureBuilder仅处理异步状态
既然Provider已经缓存了_ternak列表,可让getTernak()返回Future<void>,完成后直接读取Provider的属性:
修改TernakProvider:
Future<void> getTernak() async { try { List<ternakModel> ternak = await TernakService().getTernak(); _ternak = ternak; notifyListeners(); } catch (e) { print(e); } }
页面中的FutureBuilder调整:
@override Widget build(BuildContext context) { TernakProvider ternakProvider = Provider.of<TernakProvider>(context); return Consumer<TernakProvider>( builder: (context, providerData, _) => FutureBuilder<void>( future: providerData.getTernak(), builder: (context, snapshot) { if (snapshot.connectionState != ConnectionState.done) { return Text("Loading..."); } if (snapshot.hasError) { return Text("加载失败: ${snapshot.error}"); } List<ternakModel> ternak = providerData.ternak; // 后续ListView渲染代码 })); }
额外优化建议
- 给
TernakService的getTernak()添加显式返回类型,避免隐式dynamic:
Future<List<ternakModel>> getTernak() async { // 原有代码不变 }
- 避免在
build方法中直接调用getTernak()(build可能频繁触发导致重复请求),移到initState中:
@override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { Provider.of<TernakProvider>(context, listen: false).getTernak(); }); }
之后页面可直接通过Consumer读取providerData.ternak,无需FutureBuilder,更贴合Provider的使用逻辑。
内容的提问来源于stack exchange,提问作者Breed
相关产品推荐
相关产品推荐

