如何正确解析异步差距的buildContext。'在扑来?
我想找到一个适合 use_build_context_context_context_synchronaly
我想知道我是刚愚弄Flutter_lints
还是实际解决了问题。
修复之前:
class _HomeScreenState extends State<HomeScreen> {
bool _isLoading = false;
void _menuSelected(value) async {
if (value == 'logout') {
setState(() {
_isLoading = true;
});
final uid = context.read<AuthProvider>().user?.uid ?? '';
await Presence().updateUserPresence(uid);
// lines in question
await context.read<FCMProvider>().deleteCurrentDeviceToken(); // use_build_context_synchronously
await context.read<AuthProvider>().signOut(); // use_build_context_synchronously
setState(() {
_isLoading = false;
});
return;
}
...
修复程序之后:通过
class _HomeScreenState extends State<HomeScreen> {
bool _isLoading = false;
// define methods
late final Future<void> Function() deleteDeviceToken;
late final Future<void> Function() signOut;
@override
void initState() {
super.initState();
// use context to extract methods from providers
deleteDeviceToken = context.read<FCMProvider>().deleteCurrentDeviceToken;
signOut = context.read<AuthProvider>().signOut;
}
void _menuSelected(value) async {
if (value == 'logout') {
setState(() {
_isLoading = true;
});
final uid = context.read<AuthProvider>().user?.uid ?? '';
await Presence().updateUserPresence(uid);
// use the extracted methods
await deleteDeviceToken();
await signOut();
setState(() {
_isLoading = false;
});
return;
}
...
这种方式,我在使用这些方法之前提取了这些方法,但是我不确定这是否仍然使用不应使用的上下文。
I want to find a proper solution for use_build_context_synchronously & I'm wondering if the code below is ok?
I'd like to know if I've just fooled flutter_lints
or actually solved the issue.
BEFORE FIX:
class _HomeScreenState extends State<HomeScreen> {
bool _isLoading = false;
void _menuSelected(value) async {
if (value == 'logout') {
setState(() {
_isLoading = true;
});
final uid = context.read<AuthProvider>().user?.uid ?? '';
await Presence().updateUserPresence(uid);
// lines in question
await context.read<FCMProvider>().deleteCurrentDeviceToken(); // use_build_context_synchronously
await context.read<AuthProvider>().signOut(); // use_build_context_synchronously
setState(() {
_isLoading = false;
});
return;
}
...
AFTER FIX:
class _HomeScreenState extends State<HomeScreen> {
bool _isLoading = false;
// define methods
late final Future<void> Function() deleteDeviceToken;
late final Future<void> Function() signOut;
@override
void initState() {
super.initState();
// use context to extract methods from providers
deleteDeviceToken = context.read<FCMProvider>().deleteCurrentDeviceToken;
signOut = context.read<AuthProvider>().signOut;
}
void _menuSelected(value) async {
if (value == 'logout') {
setState(() {
_isLoading = true;
});
final uid = context.read<AuthProvider>().user?.uid ?? '';
await Presence().updateUserPresence(uid);
// use the extracted methods
await deleteDeviceToken();
await signOut();
setState(() {
_isLoading = false;
});
return;
}
...
This way I've extracted the methods before using them, but I'm not sure if this maybe still uses context where it shouldn't be used.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
有两个不错的选择可以根据您想要的内容来解决问题。即使您的小部件已被处置并从树中删除,您仍然要签出来,您所做的就是最好的。另一方面,如果执行签名操作是没有道理的,如果用户切换到不包含窗口小部件的其他路线,则如果您的状态已卸下,则只需跳过执行签字操作即可。
There are two good options to fix the issue depending on what you want. What you did is best if you still want to sign out even if your widget has been disposed and removed from the tree. On the other hand, if performing the sign out action makes no sense if the user has switched to a different route that does not contain your widget then you should just skip performing the signout action if your state is unmounted.