You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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渲染代码
          }));
}

额外优化建议

  1. 给TernakService的getTernak()添加显式返回类型,避免隐式dynamic:
Future<List<ternakModel>> getTernak() async {
  // 原有代码不变
}
  1. 避免在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:50:23