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
相关产品推荐
相关产品推荐

