bounty将在23小时内到期。此问题的答案有资格获得+50声望奖励。Ruble正在寻找一个答案从一个有信誉的来源。
我们可以这样做:
class WorldModel {
WorldModel({required this.skyModel});
final SkyModel skyModel;
static final instance = Provider<WorldModel>(
(ref) => WorldModel(
skyModel: SkyModel(),
),
);
final countBirds = Provider<int>((ref) => 25);
}
这意味着我们只能在访问WorldModel
示例之后才能访问countBirds
提供程序。那些(在build()
方法中):
Widget build(BuildContext context, WidgetRef ref) {
final worldModel = ref.watch(WorldModel.instance);
final countBirds = ref.watch(worldModel.countBirds);
return Text(countBirds.toString());
}
否则,我们甚至可以这样定义它:
late final countBirds = Provider<int>((ref) => 5);
它工作得很好,并执行其功能100%。即使在使用.autoDispose
修改器时,一切都工作正常,并被丢弃。* 但是,官方文档强烈建议仅将提供程序用作最终提供程序 :
提供者应该始终是最终的。
这是否意味着它们可以是late
?为什么和什么是陷阱?
关于*function
**
为什么我需要这个(我说的是WorldModel
类中的定义)?这是因为countBirds
可能依赖于WorldModel
类的某些字段。我不能用任何其他方式来做,只是因为我认为这是 * 依赖注入的好实践 *。下面是一个很好的例子:
class WorldModel {
WorldModel({required this.skyModel});
final SkyModel skyModel;
static final instance = Provider<WorldModel>(
(ref) => WorldModel(skyModel: SkyModel()),
);
late final countBirds = Provider<int>((ref) => skyModel.countBirds);
}
class SkyModel {
late int countBirds;
}
1条答案
按热度按时间wkftcu5l1#
不建议使用提供程序作为
static
,虽然我不认为这在技术上有问题,但这仍然是一个不好的做法。至于在没有
static
关键字的类中将提供程序定义为final
,这将导致为类的每个示例创建一个新的提供程序,因此当您失去对类示例的访问权限时,您将无法访问提供程序,如果提供程序不是自动可丢弃的,这将是一个更大的问题。提供程序可以按以下方式定义
然后,您可以在访问小部件树之前初始化提供程序,方法是使用
ProviderScope
扭曲父小部件然后,您可以访问
ProviderScope
下的小部件树中的任何小部件中的提供程序。你可以做的另一件事是使用
.family
修饰符但是,您必须传递相同的
SkyModel
示例以重用相同的提供程序示例,否则您将得到一个新的提供程序