如何正确解析异步差距的buildContext。'在扑来?

发布于 2025-02-04 19:55:52 字数 1931 浏览 1 评论 0原文

我想找到一个适合 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

找回味觉 2025-02-11 19:55:52

有两个不错的选择可以根据您想要的内容来解决问题。即使您的小部件已被处置并从树中删除,您仍然要签出来,您所做的就是最好的。另一方面,如果执行签名操作是没有道理的,如果用户切换到不包含窗口小部件的其他路线,则如果您的状态已卸下,则只需跳过执行签字操作即可。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文