【问题标题】:Flutter: Invoking Provider method in another class outside of the widget treeFlutter:在小部件树之外的另一个类中调用 Provider 方法
【发布时间】:2022-01-13 06:34:07
【问题描述】:

我目前在我的 Flutter 项目中使用 Provider 来管理我的移动应用的身份验证状态。 AuthProvider 的模型如下:

lib/models/auth_provider.dart

class AuthProvider with ChangeNotifier {
  
  // Some methods and properties are removed for simplicity.
  // ...

  bool loggedIn;

  void allowAccess() {
    loggedIn = true;
    notifyListeners();
  }

  void revokeAccess() {
    loggedIn = false;
    notifyListeners();
  }
}

应用程序使用其他类的一些服务来检查身份验证令牌的有效性。

如果令牌不再有效,则另一个类的服务中的方法将需要撤销访问权限:

lib/services/auth_services.dart

import 'package:exampleapp/shared/global_context.dart' as global_context;

class AuthService {
  // Some methods and properties are removed for simplicity.
  // ...
  void checkValidity() {
      // ...
      if(notValid) {
          // Use provider to revoke access
          Provider.of<AuthProvider>(
          global_context.GlobalContext.globalContext!, listen: false)
          .revokeAccess();
      }
  }
}

为了实现这一点(因为在小部件树之外没有上下文),应用程序使用全局上下文来允许服务文件调用 Provider 方法: lib/shared/global_context.dart

import 'package:flutter/material.dart';

class GlobalContext {
  static BuildContext? globalContext;
}

并在可能涉及身份验证状态更改的小部件的构建方法中添加以下行:

global_context.GlobalContext.globalContext = context;

我读到我们不建议在小部件树之外访问 Provider,我认为使用 GlobalContext 不是最佳做法。有没有其他方法可以通过使用 Provider 来做到这一点?

P/S:我还在学习 Flutter,如有需要请在下方评论。

【问题讨论】:

  • 在这种情况下,您认为您需要提供者吗?你也可以看看pub.dev/packages/get_it
  • 嗨 Ahmad,我很好奇我是否可以使用 Provider 来实现与 Flutter 推荐的 Provider 用于状态管理相同的结果。谢谢你的建议。

标签: flutter dart mobile-application flutter-provider state-management


【解决方案1】:

我通常使用 get_it 包,它提供了调用 Provider 而无需指定特定上下文的能力。

https://pub.dev/packages/get_it

首先我会调用 setupLocator()

import 'package:get_it/get_it.dart';

GetIt locator = GetIt.instance;

void setupLocator() {
  locator
      .registerLazySingleton(() => AuthProvider());
 }

那就这样用吧..

class SomeClass {
  final _provider = locator<AuthProvider>();

  void someMethod(){
     _provider.revokeAccess();
   }
}

【讨论】:

    【解决方案2】:

    这是一个非常好的和重要的问题,显然我们可以在这里遵循很多方法,你可以使用全局上下文,但你必须确保它始终是正确的上下文,所以每当你推送/弹出不同的路线时,你有也同步上下文

    我认为一种简单的方法是将上下文作为参数添加到 checkValidity() 函数

    我还建议查看堆叠状态管理解决方案https://pub.dev/packages/stacked,它非常适合这种情况。

    【讨论】:

      猜你喜欢
      • 2021-06-18
      • 2022-01-16
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      • 2023-02-14
      • 1970-01-01
      • 2020-05-04
      相关资源
      最近更新 更多