Flutter子提供者管理插件flutter_sub_provider的使用
Flutter 子提供者管理插件 flutter_sub_provider
的使用
引言
flutter_sub_provider
插件允许通过 flutter_sub
创建合理的提供者依赖关系。它类似于 ProxyProvider
,但当其依赖项发生变化时会完全重新创建。
动机
在使用 Provider
进行依赖注入时,通常需要创建一个依赖于另一个提供者的提供者。例如,一个 PaginationController
可能依赖于一个 HttpClient
来发起请求。在 flutter_sub_provider
中,这可能看起来像这样:
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return SubProvider<HttpClient, PaginationController>(
create: (context, httpClient) => PaginationController(client: httpClient),
builder: (context, child) => /* ... */,
);
}
}
每当 HttpClient
发生变化时,一个新的 PaginationController
将被创建,并且小部件将使用新的控制器重建。底层,SubProvider
使用 SubValue
来管理 PaginationController
。
相比之下,等效的 ProxyProvider
代码如下:
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ProxyProvider<HttpClient, PaginationController>(
update: (context, httpClient, paginationController) => paginationController..httpClient = httpClient,
builder: (context, child) => /* ... */,
);
}
}
在 ProxyProvider
示例中,依赖项通过一个 setter 侧加载,并且当 HttpClient
发生变化时,PaginationController
就地更新。SubProvider
的方法有以下几个原因:
- 依赖项通过构造函数注入而不是通过 setter。这确保了我们的控制器始终以有效状态创建。
- 控制器的内部状态在 HTTP 客户端更改时重置。这确保我们不会有任何来自先前 HTTP 客户端的陈旧数据。
- HTTP 客户端可以是最终的或私有的。控制器保留对其变量的控制。
原则
与 flutter_sub
类似,flutter_sub_provider
建立在子的概念上——即紧凑版本的 StatefulWidget
,它们创建、更新和销毁一个值。flutter_sub_provider
通过与 provider
集成来创建 SubProvider
。
SubProvider
扩展了相应的 Provider
类型,并添加了管理依赖项的功能。当依赖项发生变化时,SubProvider
会完全重新创建其管理的对象,以确保始终使用最新的依赖项。
为了简化理解,你可以想象 SubProvider
大致如下(实际上它更复杂):
class SubProvider<T, R> extends StatelessWidget {
SubProvider({
required this.create,
required this.builder,
});
@override
Widget build(BuildContext context) {
final dependency = Provider.of<T>(context);
return SubValue<R>.builder(
create: (context, dependency),
keys: [dependency],
builder: (context, value) =>
Provider<R>.value(
value: value,
builder: builder,
),
);
}
}
这段代码经过高度简化。要查看完整的实现,你可以查看 SubProvider。
自定义子提供者
你可以直接在你的树中使用所有内置的子提供者。也可以扩展 SubProvider
来创建自己的可重用的子提供者。
要访问 SingleChildSubValue
和其他内部类型,可以通过导入 package:flutter_sub_provider/developer.dart
。
为了从我们之前的例子中创建一个可重用的子提供者,我们可以这样做:
class PaginationControllerProvider extends SubProvider<HttpClient, PaginationController> {
PaginationControllerProvider({
super.child,
super.builder,
}) : super(
create: (context, httpClient) => PaginationController(client: httpClient),
);
}
更多关于Flutter子提供者管理插件flutter_sub_provider的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html