一段时间以来,我一直试图使用集团,但把集团供应商放在哪里的问题让我感到困惑。
在学习之初,我使用MultipleBlocProvider将几乎所有的提供者都放在main()函数中。

但是,由于我的一些区块订阅了诸如firebase快照之类的流,我认为如果我不通过关闭区块来关闭这些订阅,可能会花费额外的资源(我不确定,但至少占用了一些内存)。
但是,如果提供程序位于main()中,则更改页或弹出将不会关闭这些块和内部的订阅。

在这种情况下,我尝试将一些集团提供商放到特定的页面中,这样,当我进出这个页面时,这个集团就可以关闭并重新创建。但是还有一些其他的问题。
例如,如果我有一个名为ProductDetailsBloc的区域,用于控制产品详细信息页中的产品详细信息小部件,则其事件包含一个名为GetProductBySku的事件,该事件用于从防火墙获取产品并在state(ProductDetailsState).中设置产品。
我想把这个集团及其提供商放在产品详细信息页面中,并在产品列表小部件(位于产品列表页面中)和它的onTap()函数中放置事件触发器,其中用户单击产品列表项E 219(这是来自其他资源的缩略图产品项目,只包含非常基本的信息,例如sku、title )在E 120产品列表页E 221中,然后导航到E 122产品详细信息页E 223查看该产品的完整信息。
但是,正如我前面提到的,如果我将ProductDetailsBloc的集团提供商放置在产品详细信息页中,则在输入产品详细信息页之前,不能使用。

所以,我个人对这个问题有两个想法,
GetProductBySku
第二个是把ProductDetailsBloc放在main()中,所以我可以跳过这个问题,直接使用GetProductBySku in 产品列表小部件,但是这就把问题转移到了最前面。
我不知道哪一个更好,所以如果有人能给我一些建议,我会非常感激。
回到主要的问题,放置集群提供者的最佳实践是什么,如果我将提供者放入main()中,需要考虑的是什么。
感谢每一个读到这里的人,因为这有点长,这是我第一次询问攻击溢出:3
发布于 2022-11-11 02:24:06
您可以在Bloc的不和谐服务器中找到关于这一点的更多讨论。更多信息:https://discord.com/channels/649708778631200778/649708993773699083/860604230930006016
我会在这里复制粘贴消息和代码。我们已经在我们的应用程序中使用了一年多了,看起来我们遇到了一个问题。场景:帖子列表需要显示在家庭提要中。假设每个post都封装在PostBloc (将在这里执行的post操作)中。我一直在使用moor来积极地查找数据中是否有任何变化(比如可能会从post详细信息页面触发的post数量,其中的post细节再次被获取)。我想知道创建BlocFactory是否是一个明智的决定,它将提供基于Post_Id的Bloc对象(这里是不同的PostBloc对象)。
我已经写了一个样本BlocFactoryProvider,请告诉我你的想法
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
typedef CreateIfAbsent<T> = T Function();
//create bloc of <T> type
//author: https://github.com/imrhk
class BlocFactory<T extends Bloc<dynamic, dynamic>> {
Map<String, T> _cache = <String, T>{};
T createBloc({@required String id, @required CreateIfAbsent<T> createIfAbsent}) {
assert(id != null && createIfAbsent != null);
if (_cache.containsKey(id)) {
return _cache[id];
}
final value = createIfAbsent.call();
_cache[id] = value;
return value;
}
void dispose() {
_cache.values.forEach((bloc) => bloc?.close());
_cache.clear();
}
}
class BlocFactoryProvider<T extends Bloc<dynamic, dynamic>, V>
extends SingleChildStatelessWidget {
final BlocFactory<T> _blocFactory;
final Widget child;
BlocFactoryProvider({BlocFactory<T> blocFactory, this.child})
: _blocFactory = blocFactory ?? BlocFactory<T>();
@override
Widget buildWithChild(BuildContext context, Widget child) {
return InheritedProvider<BlocFactory<T>>(
create: (_) => _blocFactory,
dispose: (_, __) => _blocFactory.dispose(),
child: child,
lazy: false,
);
}
static BlocFactory<T> of<T extends Bloc<dynamic, dynamic>>(BuildContext context) {
try {
return Provider.of<BlocFactory<T>>(context, listen: false);
} on ProviderNotFoundException catch (e) {
if (e.valueType != T) rethrow;
throw FlutterError(
"""
BlocProvider.of() called with a context that does not contain a Bloc of type $T.
No ancestor could be found starting from the context that was passed to BlocProvider.of<$T>().
This can happen if the context you used comes from a widget above the BlocProvider.
The context used was: $context
""",
);
}
}费利克斯的重播
很难说没有更多的上下文,但是我建议将缓存移到存储库层,而使用一个带有PostChanged事件的PostBloc来获取最新的细节(使用缓存)。所以他并没有完全放弃这个想法。
声明:我是以下代码的作者,在3月21日因不和而分享。
https://stackoverflow.com/questions/74397072
复制相似问题