为什么在异步函数中等待后不能使用 BuildContext?



我今天更新了我的Dart检查器,并被告知VSCode中的问题选项卡中的更改。原来我在工作中做了很多不被推荐的操作。

下面是我在许多具有相同操作顺序的代码片段:

class Body extends StatelessWidget {
const Body({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Consumer<CheckoutScreenState>(
builder: (context, state, _) {
return CustomFooter(
total: 'Php ${state.totalAmount}',
inAsync: state.inAsync,
onPressed: state.isReady()
? () async {
await state.postCheckout();
String? storeName = await SecureStorage.instance.read(
key: 'storeName',
);
if (state.orderDetails != null) {
Navigator.pushNamed(
context,
OrderReceipt.id,
arguments: {
'state': state,
'storeName': storeName,
},
);
} else {
showDialog(
context: context,
builder: (_) {
return CustomAlert(
headingText: 'Error',
subText:
'An error occurred while processing your order. Please try again.',
onPressed: () {
Navigator.pop(context);
},
);
},
);
}
}
: () {},
buttonColor: state.isReady() ? kPrimaryColor : kFieldHintTextColor,
buttonText: 'Place Order',
);
},
);
}
}

我只是想知道我违反了什么规则,如果我改变我的代码是如此重要。到目前为止,我还没有遇到问题,但linter建议我不要这样做。在异步间隙之后访问上下文有什么问题?

在我的问题发布一个月后,Flutter团队显然发布了一个有用的视频。总而言之,小部件对应的元素具有不可预测的刷新时刻,从而导致BuildContext发生变化。

https://youtu.be/bzWaMpD1LHY

相关内容

最新更新