如何从没有上下文的类访问提供者字段?

时间:2019-08-08 15:03:00

标签: flutter flutter-provider

我正在使用Provider。我有两个课程:class TenderApiData {}是独立的课程(不是小部件)。如何将accesstoken写到AppState

class AppState extends ChangeNotifier // putted to ChangeNotifierProvider
{ 
  String _accesstoken; // need to fill not from widget but from stand alone class
  String _customer; // Fill from widget 
  List<String> _regions; // Fill from widget 
  List<String> _industry; // Fill from widget 
  ...
}

我需要从独立的类中读\写accesstoken的方法。

还是我的应用程序体系结构有问题?

Here是完整的源代码。

2 个答案:

答案 0 :(得分:1)

您不能也不应访问窗口小部件树之外的提供程序。

即使您理论上可以使用全局变量/单例或get_it之类的替代方法,也不要这样做

您将改为使用小部件在提供程序和模型之间架起桥梁。

这通常是通过didChangeDependencies生命周期进行归档的,就像这样:

class MyState extends State<T> {
  MyModel model = MyModel();

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    model.valueThatComesFromAProvider = Provider.of<MyDependency>(context);
  }
}

provider带有一个小部件内置小部件,这些小部件可帮助解决常见情况,

  • ProxyProvider
  • ChangeNotifierProxyProvider

一个典型的例子是:

ChangeNotifierProxyProvider<TenderApiData, AppState>(
  initialBuilder: () => AppState(),
  builder: (_, tender, model) => model
    ..accessToken = tender.accessToken,
  child: ...,
);

答案 1 :(得分:1)

TL;DR

provider 交换为 get_it。后者在不将其范围限定为 BuildContext 的情况下全局执行 DI。 (它实际上有自己的可选作用域机制,使用字符串 namedInstance's。)

剩下的……

我遇到了类似的问题,我相信这归结为以下事实:Provider 强制执行某种类型的(元?)架构,即小部件位于您可能称之为“代理金字塔”的顶部的架构。

换句话说,在这种风格中,小部件了解业务逻辑(因此得名 BLoC 架构),它们运行展示,与 iOS 流行的 ViewController 范式不同,也可能与 MVVM 设置不同。

>

在这种架构风格中,当小部件创建子小部件时,它也会为小部件创建模型。此处上下文可能很重要,例如,如果您同时显示同一个子部件的多个实例,则每个实例都需要自己的底层模型实例。在小部件或其后代中,您的 DI 系统需要 Context 来选择合适的。请参阅BuildContext::findAncestorWidgetOfExactType了解原因/方式。

这种架构风格似乎受到了普通 Flutter 的鼓励,其范式是应用程序即小部件(“海龟一直向下”)、非可视小部件、布局即小部件和 InheritedWidget 用于DI(我相信哪个提供商使用)

但是

现代应用框架库(例如 redux、mobx)鼓励相反的元架构:金字塔底部的小部件。

这里的小部件是“愚蠢的”,只是 UI 信号发生器和接收器。业务逻辑封装在“商店”中或通过与商店交互的“动作”封装。这些小部件仅对正在更新的商店中的相关字段做出反应,并在用户与其交互时发送操作信号。

你应该使用哪个?

根据我的经验,至少在屏幕空间较小的移动设备上,很少需要将模型范围限定到渲染树中的一个分支。如果它突然变得重要,那么除了需要将它链接到 UI 渲染的语义之外,还有很多其他方法可以处理它(索引数组、id 查找映射、get_it 中的命名实例)。

目前,由于在 iOS ViewControllers 上花费了太多时间,我很喜欢新系统,这些系统可以更好地执行 SoC。并且个人发现 Flutter 的一切都是小部件的范式,如果不加以注意,有时会显得有点凌乱。但归根结底是个人喜好。