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


