Dmi*_*kov 10 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
...
}
Run Code Online (Sandbox Code Playgroud)
我需要accesstoken
从独立类中读/写的方法。
或者我的应用程序架构有问题?
这是完整的源代码。
Har*_*ngh 10
交换provider
为get_it
. 后者在全局范围内进行 DI,而不将其范围限定为 BuildContext。(它实际上有自己的可选作用域机制,使用 string namedInstance
。)
我遇到了类似的问题,我相信这可以归结为 Provider 强制执行某种类型的(元?)架构,即 Widget 位于您可能称之为“代理金字塔”的顶部的架构。
换句话说,在这种风格中,小部件了解业务逻辑(因此称为 BLoC 架构),它们运行整个节目,与ViewController
iOS 和 MVVM 设置流行的范例没有什么不同。
在这种架构风格中,当小部件创建子小部件时,它还会创建该小部件的模型。这里上下文可能很重要,例如,如果同时显示同一子窗口小部件的多个实例,则每个实例都需要其自己的底层模型实例。在小部件或其后代中,您的 DI 系统将需要上下文来选择正确的小部件。请参阅BuildContext::findAncestorWidgetOfExactType
以了解原因/方式。
这种架构风格似乎是受到普通 Flutter 的鼓励,其范式包括应用程序作为小部件(“乌龟一直向下”)、非可视小部件、布局作为小部件和用于 DI 的 InheritedWidget(我相信提供商使用)
但
现代应用程序框架库(例如 redux、mobx)鼓励相反类型的元架构:金字塔底部的小部件。
这里的小部件是“哑的”,只是 UI 信号发生器和接收器。业务逻辑封装在“商店”中或通过与商店交互的“操作”。这些小部件只是对商店中正在更新的相关字段做出反应,并在用户与它们交互时发送操作信号。
根据我的经验,至少在屏幕空间较小的移动设备上,很少需要将模型范围限定到渲染树中的分支。如果它突然变得重要,那么有很多其他方法来处理它(索引数组、id 查找映射、namedInstances in get_it
),而不是需要将其链接到 UI 渲染的语义。
目前,由于在 iOS ViewController 上花费了太多时间,我非常喜欢执行更好SoC 的新系统。个人认为,如果不加以管理,Flutter 的一切都是小部件的范式有时会显得有点混乱。但最终这是个人喜好。
您不能也不应该访问小部件树之外的提供者。
即使您理论上可以使用全局变量/单例或类似的替代方法get_it
,也不要这样做。
相反,您将希望使用小部件在您的提供者和您的模型之间建立桥梁。
这通常是通过didChangeDependencies
生命周期实现的,如下所示:
class MyState extends State<T> {
MyModel model = MyModel();
@override
void didChangeDependencies() {
super.didChangeDependencies();
model.valueThatComesFromAProvider = Provider.of<MyDependency>(context);
}
}
Run Code Online (Sandbox Code Playgroud)
provider
附带一个小部件内置小部件,可帮助处理常见场景,即:
ProxyProvider
ChangeNotifierProxyProvider
一个典型的例子是:
ChangeNotifierProxyProvider<TenderApiData, AppState>(
initialBuilder: () => AppState(),
builder: (_, tender, model) => model
..accessToken = tender.accessToken,
child: ...,
);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6717 次 |
最近记录: |