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

Flutter中FutureBuilder读取本地JSON时返回ConnectionState.none如何解决

问题原因
  • _getStateList 方法没有返回Future对象:FutureBuilder的future参数要求接收一个Future实例,你当前的方法没有return语句,默认返回null,导致FutureBuilder无法监听异步状态,所以连接状态一直是none。
  • 重复发起异步请求:你在initState中已经调用了一次_getStateList,同时在FutureBuilder的future参数里又调用了一次,会发起两次完全相同的请求,属于多余操作。
  • 异步结果处理不符合FutureBuilder的使用逻辑:你当前把请求结果赋值给全局变量stateList,没有通过Future的返回值传递给snapshot,即使Future正常执行也拿不到data。
  • 隐藏规范问题:原有initState方法没有加@override注解,也没有调用super.initState(),可能触发未知异常。
修正方案
class _TestState extends State<Test> {
  // 声明Future对象,避免build重绘时重复发起请求,泛型替换成你stateJson返回的实际类型即可
  late Future<dynamic> stateListFuture;

  @override
  void initState() {
    super.initState();
    stateListFuture = _getStateList();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
          child: FutureBuilder(
        future: stateListFuture, // 直接传入预先定义的Future
        builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
          print(snapshot);
          switch (snapshot.connectionState) {
            case ConnectionState.none:
              return Text('Press button to start.');
            case ConnectionState.active:
            case ConnectionState.waiting:
              return Text('Awaiting result...');
            case ConnectionState.done:
              if (snapshot.hasError) return Text('Error: ${snapshot.error}');
              // 这里snapshot.data就是你请求返回的JSON数据,可直接用来遍历生成Dropdown的选项
              return Text('Result: ${snapshot.data}');
          }
        },
      )),
    );
  }

  // 给方法加Future返回值,直接返回异步请求结果
  Future<dynamic> _getStateList() async {
    return await DetailServices().stateJson();
  }
}
额外注意点

不要在FutureBuilder的future参数里直接调用异步方法,否则每次组件重绘都会重新发起请求,提前在initState里初始化Future是官方推荐的最优实践。

内容的提问来源于stack exchange,提问作者Vedha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:06:09