使 API 在所有小部件中都可访问 - 使用已实例化变量的 Provider?

Posted

技术标签:

【中文标题】使 API 在所有小部件中都可访问 - 使用已实例化变量的 Provider?【英文标题】:Making an API accessible throughout all widgets - use Provider with already instantiated variable? 【发布时间】:2021-12-29 17:03:21 【问题描述】:

我编写了一个 API 类,显然它封装了几个 http 请求。但是,这个 API 类也存储了一些状态:即,它保存了一个身份验证令牌,该令牌将在第一个之后的所有后续请求中使用。

在我的颤振函数中,我首先等待该令牌被设置,然后再执行其他任何操作:

Future<void> main() async 
  var api = MyAPI();
  await api.auth.refreshTokens(); // Sets api.auth.token
  runApp(MaterialApp(etc));

这里重要的是,在 etc 中,我还设置了 Providers,其中之一就是那个 API:

providers: [Provider(create: (context) => api), ...]

然后我想在整个应用程序中使用它。然而,这真的是最好的方法吗?仅仅能够使用这个或多或少的全局 API 对象似乎是一种非常麻烦和混乱的方法。

通常是怎么做的?

【问题讨论】:

【参考方案1】:

您可以将该类编写为单例,这样您就可以调用构造函数并每次获取相同的实例而无需创建新实例:

void main() 
  Api().call();
  Api().call();


class Api 
  static Api? _instance;

  Api._();
  factory Api() 
    _instance ??= Api._();
    return _instance!;
  

  String token = '';

  void call() 
    token += '*';
    print('new token $token');
  

【讨论】:

那个状态是持久的?如果是这样,为什么需要 Flutter 中的整个 Provider... 的东西?看起来它只是让事情变得过于复杂 它们是不同的模式。单例是持久的,但不通知其更新并且在代码范围内可用。虽然提供者仅可用于小部件树的子集。 Provider 还会受到应用程序上下文变化的影响(您需要一个才能使用它),而单例只是一种较低级别的模式,可保证您在应用程序的整个生命周期内拥有一个且唯一的类实例跨度>

以上是关于使 API 在所有小部件中都可访问 - 使用已实例化变量的 Provider?的主要内容,如果未能解决你的问题,请参考以下文章

如何使Qt小部件可调整大小[重复]

导航抽屉未在颤动中从 APPBar 小部件打开

使 QListWidget 调整其项目的大小以填充空间

使用来自另一个类的实例访问有状态小部件的变量时,在 null 上调用 getter 长度

从多个小部件访问 StreamController Stream

如何从模型实例(具有来自 api 的值)传递数据并将其提供给 Text() 小部件