如何在Flutter中的单例内部使用Provider.of(...)?

时间:2019-09-04 01:40:35

标签: flutter flutter-provider

这个widget位于我的小部件树的深处:

Widget build(BuildContext context) {
return ChangeNotifierProvider(
  builder: (context) => TimersModel(context: context),
  child: Scaffold(...

TimersModel获取上下文:

class TimersModel extends ChangeNotifier {
  final BuildContext context;
  NotificationsService _notificationsService;

  TimersModel({@required this.context}) {
    _notificationsService = NotificationsService(context: context);
  }

并首次实例化此NotificationsService单例:

class NotificationsService {
  static FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin;

  final BuildContext context;

  static NotificationsService _instance;

  factory NotificationsService({@required BuildContext context}) {
    _instance ??= NotificationsService._internalConstructor(context: context);
    return _instance;
  }

  NotificationsService._internalConstructor({@required this.context}) {

如您所见,这是FlutterLocalNotificationsPlugin

的单例

问题在于,如果我从这个单例中调用Provider.of<TimersModel>(context)...,尽管它获得了正确的上下文,但它总是抛出ProviderNotFoundError

如果我在提供程序的此代码上放置了一个断点:

static T of<T>(BuildContext context, {bool listen = true}) {
    // this is required to get generic Type
    final type = _typeOf<InheritedProvider<T>>();
    final provider = listen
        ? context.inheritFromWidgetOfExactType(type) as InheritedProvider<T>
        : context.ancestorInheritedElementForWidgetOfExactType(type)?.widget
            as InheritedProvider<T>;

    if (provider == null) {
      throw ProviderNotFoundError(T, context.widget.runtimeType);
    }

    return provider._value;
  }

上下文ChangeNotifierProvider和类型TimersModel是正确的。但是provider始终为空。

我知道单例不是小部件,当然,它不在小部件树中。

但是,只要提供正确的上下文和类型,我是否应该可以从任何地方致电Provider.of<TimersModel>(context)...

还是应该这样做,我做错了什么?

1 个答案:

答案 0 :(得分:0)

当Provider按类型进行查找时,请在构建方法中将其返回时尝试给ChangeNotifierProvider一个类型:

return ChangeNotifierProvider<TimersModel>(...);

我可以想象Provider根本找不到TimersModel的实例,因为您没有声明该类型的提供程序。