Flutter中.then代码未执行,如何按序执行三个异步函数?
问题原因与优化方案
问题原因
- 回调写法错误:你在
.then中使用了(value) => (){ ... }的写法,这会让回调返回一个未被执行的匿名函数,而非直接运行逻辑,导致.then内部的代码完全没有触发。正确的写法应该去掉外层的()=>,改用普通函数或直接用大括号包裹逻辑。 - 异步顺序被破坏:
gotoPickElec()写在registerElec().then()的外部,不管Firebase注册操作是否完成都会立即执行,违背了「按顺序执行三个函数」的需求。 - 嵌套过深+错误处理混乱:多层嵌套的
if和.then导致代码可读性极差,且多个showSnackBar(errorSnack)未用else分支包裹,会出现条件满足时仍弹出错误提示的情况。
优化实现(使用async/await)
Flutter中async/await是处理异步操作更清晰的方式,能避免回调地狱,同时严格保证执行顺序。重构后的代码如下:
Future<void> startElectionComplete() async { if (kDebugMode) {print('verifying adhar');} try { // 1. 执行Adhar验证 await getAdharVerified(adharTextController.text); showSnackBar(snackbarshow().succesAdharSnack); if (kDebugMode) {print('adhar verified');} // 验证年龄与私钥,不满足则提前返回 if (_adharage <= 18 || privateKeyTextController.text.isEmpty) { showSnackBar(errorSnack); return; } if (kDebugMode) {print('adhar verification complete');} // 验证时间戳,不满足则提前返回 if (unixlast == null || unixlast.isEmpty || unix == null || unix.isEmpty) { showSnackBar(errorSnack); return; } if (kDebugMode) {print('unix not null');} // 2. 注册选举到Firebase if (kDebugMode) {print('registering');} await registerElec(unix, unixlast); // 3. 在区块链创建选举 if (kDebugMode) {print('creating blockchain');} await createElection( electionNameTextController.text, ethclient!, privateKeyTextController.text, contractAdressConst ); showSnackBar(snackbarshow().succesAdharSnack); gotoPickElec(); // 所有异步操作完成后再执行跳转 } catch (e) { if (kDebugMode) {print(e);} showSnackBar(errorAdharSnack); } print('i am now out of async part'); }
重构优势
- 用
async/await替代.then链式,代码线性执行,可读性大幅提升。 - 通过
await严格保证异步操作的顺序,前一步完成后才会执行下一步。 - 集中式错误处理:单个
try/catch捕获所有异步操作异常,避免分散的错误逻辑。 - 条件判断改用提前返回的方式,减少嵌套层级,逻辑更清晰。
gotoPickElec()放在所有异步操作完成后执行,保证流程正确性。
内容的提问来源于stack exchange,提问作者Abhiram
相关产品推荐
相关产品推荐

