provider 4.3.1

  • Readme
  • Changelog
  • Example
  • Installing
  • 100

English | Português

Black Lives Matter. Support the Equal Justice Initiative. #

Build Status pub package codecov Gitter

InheritedWidget的包装,使它们更易于使用和可重复使用.

通过使用provider而不是手动编写InheritedWidget ,您将获得:

  • 简化资源分配/处置
  • lazy-loading
  • 每次都制作新类时大大减少了样板
  • devtools友好
  • 使用这些InheritedWidget的常用方法(请参阅Provider.of / Consumer / Selector
  • 侦听机制的类复杂性呈指数增长,从而提高了类的可伸缩性(例如ChangeNotifier ,它是用于调度通知的O(N²)).

要了解有关provider更多信息,请参阅其文档 .

也可以看看:

Migration from v3.x.0 to v4.0.0 #

  • 提供程序的参数builderinitialBuilder被删除.

    • initialBuilder应该由create代替.
    • "代理"提供程序的builder者应由update替换
    • 古典提供者的builder商应该被create代替.
  • 新的create / update回调是延迟加载的,这意味着它们是在首次读取值时调用的,而不是在第一次创建提供程序时调用的.

    如果这是不希望的,则可以通过将lazy: false传递给您选择的提供程序来禁用延迟加载:

    FutureProvider(
      create: (_) async => doSomeHttpRequest(),
      lazy: false,
      child: ...
    )
    
  • ProviderNotFoundError重命名为ProviderNotFoundException .

  • SingleChildCloneableWidget接口已删除,并由一种新的控件SingleChildWidget代替.

    有关如何迁移的详细信息,请参见此问题 .

  • 现在,如果选择器是集合,则选择器会深度比较以前的值和新的值.

    如果这是不希望的,则可以通过将shouldRebuild参数传递给Selector来恢复到旧的行为:

    Selector<Selected, Consumed>(
      shouldRebuild: (previous, next) => previous == next,
      builder: ...,
    )
    
  • DelegateWidget及其家族被删除. 相反,对于自定义提供程序,可以直接继承InheritedProvider或现有提供程序的子类.

Usage #

Exposing a value #

Exposing a new object instance

提供程序不仅可以公开值,还可以创建/监听/处置它.

要公开新创建的对象,请使用提供程序的默认构造函数. 不要使用.value ,如果你想创建一个对象的构造函数,或者你可另外具有不良副作用.

请参阅此stackoverflow答案该答案进一步详细说明了为什么不希望使用.value构造函数来创建值.

  • 不要createcreate一个新对象.
Provider(
  create: (_) => MyModel(),
  child: ...
)
  • 不要使用Provider.value创建对象.
ChangeNotifierProvider.value(
  value: MyModel(),
  child: ...
)
  • 不要使用随时间变化的变量来创建对象.

    在这种情况下,值更改时将永远不会更新您的对象.

int count;

Provider(
  create: (_) => MyModel(count),
  child: ...
)

如果您想将随时间变化的变量传递给对象,请考虑使用ProxyProvider

int count;

ProxyProvider0(
  update: (_, __) => MyModel(count),
  child: ...
)

NOTE:

使用提供程序的create / update回调时,值得注意的是,默认情况下此回调被延迟调用.

这意味着,在至少一次请求该值之前,不会调用create / update回调.

This behavior can be disabled if you want to pre-compute some logic, using the lazy parameter:

MyProvider(
  create: (_) => Something(),
  lazy: false,
)

Reusing an existing object instance:

如果已经有对象实例并想要公开它,则应使用提供程序的.value构造函数.

不这样做可能会在对象仍在使用时调用其dispose方法.

MyChangeNotifier variable;

ChangeNotifierProvider.value(
  value: variable,
  child: ...
)
MyChangeNotifier variable;

ChangeNotifierProvider(
  create: (_) => variable,
  child: ...
)

Reading a value #

读取值的最简单方法是使用[BuildContext]上的扩展方法:

  • context.watch<T>() ,它使小部件侦听T上的更改
  • context.read<T>() ,不听T就返回T
  • context.select<T, R>(R cb(T value)) ,它允许小部件仅监听T一小部分.

或使用静态方法Provider.of<T>(context) ,其行为与watch / read类似.

这些方法将从与传递的BuildContext关联的窗口小部件开始在窗口小部件树中查找,并将返回找到的类型T的最近变量(如果未找到,则抛出该变量).

值得注意的是此操作为O(1). 它实际上并不涉及在小部件树中行走.

与第一例子结合暴露的值 ,这个小部件将读取暴露String和渲染的"Hello World".

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Text(
      // Don't forget to pass the type of the object you want to obtain to `watch`!
      context.watch<String>(),
    );
  }
}

Alternatively, instead of using these methods, we can use Consumer and Selector.

这些对于性能优化或在难以获得提供程序的BuildContext后代时很有用.

有关更多信息,请参见FAQ使用者选择器的文档.

MultiProvider #

在大型应用程序中注入许多值时, Provider会迅速嵌套:

Provider<Something>(
  create: (_) => Something(),
  child: Provider<SomethingElse>(
    create: (_) => SomethingElse(),
    child: Provider<AnotherThing>(
      create: (_) => AnotherThing(),
      child: someWidget,
    ),
  ),
),

To:

MultiProvider(
  providers: [
    Provider<Something>(create: (_) => Something()),
    Provider<SomethingElse>(create: (_) => SomethingElse()),
    Provider<AnotherThing>(create: (_) => AnotherThing()),
  ],
  child: someWidget,
)

这两个示例的行为严格相同. MultiProvider仅更改代码的外观.

ProxyProvider #

从3.0.0开始,提供了一种新的提供程序: ProxyProvider .

ProxyProvider是一个提供程序,它将来自其他提供程序的多个值组合到一个新对象中,并将结果发送到Provider .

然后,只要新提供者之一依赖更新,该新对象就会被更新.

下面的示例使用ProxyProvider基于来自另一个提供程序的计数器来构建转换.

Widget build(BuildContext context) {
  return MultiProvider(
    providers: [
      ChangeNotifierProvider(create: (_) => Counter()),
      ProxyProvider<Counter, Translations>(
        update: (_, counter, __) => Translations(counter.value),
      ),
    ],
    child: Foo(),
  );
}

class Translations {
  const Translations(this._value);

  final int _value;

  String get title => 'You clicked $_value times';
}

它具有多种变体,例如:

  • ProxyProvider vs ProxyProvider2 vs ProxyProvider3 ,...

    类名后面的数字是ProxyProvider依赖的其他提供程序的数量.

  • ProxyProvider vs ChangeNotifierProxyProvider vs ListenableProxyProvider ,...

    它们的工作方式都相似,但是ChangeNotifierProxyProvider不会将结果发送到Provider ,而是将其值发送到ChangeNotifierProvider .

FAQ #

Can I inspect the content of my objects?

Flutter附带有一个devtool ,可显示给定时刻的小部件树.

由于提供者是窗口小部件,因此它们在该devtool中也可见:

从那里,如果您单击一个提供程序,您将能够看到它提供的值:

(使用example文件夹的devtools的屏幕截图)

The devtool only shows "Instance of MyClass". What can I do?

默认情况下,devtool依赖于toString ,默认为" MyClass实例".

要拥有更多有用的东西,您有两种解决方案:

  • 使用Flutter的Diagnosticable API.

    在大多数情况下,可以在您的对象上使用DiagnosticableTreeMixin来完成此操作,然后使用debugFillProperties的自定义实现.

    class MyClass with DiagnosticableTreeMixin {
      MyClass({this.a, this.b});
    
      final int a;
      final String b;
    
      @override
      void debugFillProperties(DiagnosticPropertiesBuilder properties) {
        super.debugFillProperties(properties);
        // list all the properties of your class here.
        // See the documentation of debugFillProperties for more information.
        properties.add(IntProperty('a', a));
        properties.add(StringProperty('b', b));
      }
    }
    
  • override toString.

    如果您不能使用DiagnosticableTreeMixin (例如您的类在不依赖Flutter的程序包中),则可以简单地重写toString .

    这比使用DiagnosticableTreeMixin容易,但功能不那么强大:您将无法展开/折叠对象的详细信息.

    class MyClass with DiagnosticableTreeMixin {
      MyClass({this.a, this.b});
    
      final int a;
      final String b;
    
      @override
      String toString() {
        return '$runtimeType(a: $a, b: $b)';
      }
    }
    

I have an exception when obtaining Providers inside initState. What can I do?

发生此异常是因为您试图从永远不会再次调用的生命周期中监听提供程序.

这意味着您应该使用另一个生命周期( build ),或者明确指定您不关心更新.

因此,代替:

initState() {
  super.initState();
  print(context.watch<Foo>().value);
}

你可以做:

Value value;

Widget build(BuildContext context) {
  final value = context.watch<Foo>.value;
  if (value != this.value) {
    this.value = value;
    print(value);
  }
}

它会在value更改时(且仅在value更改时)打印value .

Alternatively you can do:

initState() {
  super.initState();
  print(context.read<Foo>().value);
}

它将一次打印value并忽略更新.

How to handle hot-reload on my objects?

您可以使提供的对象实现ReassembleHandler

class Example extends ChangeNotifier implements ReassembleHandler {
  @override
  void reassemble() {
    print('Did hot-reload');
  }
}

然后通常与provider

ChangeNotifierProvider(create: (_) => Example()),

I use ChangeNotifier and I have an exception when I update it, what happens?

发生这种情况的原因是,在构建小部件树时,您正在从其后代之一修改ChangeNotifier .

发生这种情况的典型情况是在启动http请求时,将来存储在通知程序中:

initState() {
  super.initState();
  context.read<MyNotifier>().fetchSomething();
}

这是不允许的,因为修改是立即的.

这意味着某些小部件可能突变之前构建,而其他小部件可能突变之后构建. 这可能会导致UI不一致,因此是不允许的.

相反,您应该在一个会平均影响整个树的地方执行该突变:

  • 直接在模型的提供者/构造函数的内部create

    class MyNotifier with ChangeNotifier {
      MyNotifier() {
        _fetchSomething();
      }
    
      Future<void> _fetchSomething() async {}
    }
    

    当没有"外部参数"时,这很有用.

  • 在帧末尾异步:

    initState() {
      super.initState();
      Future.microtask(() =>
        context.read<MyNotifier>(context).fetchSomething(someValue);
      );
    }
    

    它不太理想,但是允许将参数传递给突变.

Do I have to use ChangeNotifier for complex states?

No.

您可以使用任何对象表示您的状态. 例如,另一种体系结构是将Provider.value()StatefulWidget结合使用.

这是使用这种架构的反例:

class Example extends StatefulWidget {
  const Example({Key key, this.child}) : super(key: key);

  final Widget child;

  @override
  ExampleState createState() => ExampleState();
}

class ExampleState extends State<Example> {
  int _count;

  void increment() {
    setState(() {
      _count++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Provider.value(
      value: _count,
      child: Provider.value(
        value: this,
        child: widget.child,
      ),
    );
  }
}

我们可以通过以下方式读取状态:

return Text(context.watch<int>().toString());

并使用以下命令修改状态:

return FloatingActionButton(
  onPressed: () => context.read<ExampleState>().increment(),
  child: Icon(Icons.plus_one),
);

或者,您可以创建自己的提供程序.

Can I make my own Provider?

是. provider公开了构成完整提供程序的所有小组件.

这包括:

  • SingleChildStatelessWidget ,使任何窗口小部件都可以与MultiProvider .
    此接口作为package:provider/single_child_widget一部分公开

  • InheritedProvider ,执行context.watch时获得的通用InheritedWidget .

这是一个使用ValueNotifier作为状态的自定义提供程序的示例: https : ValueNotifier

My widget rebuilds too often, what can I do?

可以使用context.select代替context.watch ,仅侦听所获取对象上的一组特定属性.

例如,虽然您可以编写:

Widget build(BuildContext context) {
  final person = context.watch<Person>();
  return Text(person.name);
}

如果name以外的其他内容发生变化,则可能导致小部件重建.

相反,您可以使用context.select仅侦听name属性:

Widget build(BuildContext context) {
  final name = context.select((Person p) => p.name);
  return Text(name);
}

这样,如果name以外的其他内容发生更改,则该窗口小部件将不会不必要地重建.

同样,您可以使用Consumer / Selector . 它们的可选child参数仅允许重建小部件树的非常特定的部分:

Foo(
  child: Consumer<A>(
    builder: (_, a, child) {
      return Bar(a: a, child: child);
    },
    child: Baz(),
  ),
)

在此示例中,当A更新时,仅Bar将重建. FooBaz不会不必要地重建.

Can I obtain two different providers using the same type?

可以.虽然可以有多个共享同一类型的提供程序,但是小部件将只能获取其中之一:最接近的祖先.

相反,您必须显式地为两个提供程序提供不同的类型.

代替:

Provider<String>(
  create: (_) => 'England',
  child: Provider<String>(
    create: (_) => 'London',
    child: ...,
  ),
),

Prefer:

Provider<Country>(
  create: (_) => Country('England'),
  child: Provider<City>(
    create: (_) => City('London'),
    child: ...,
  ),
),

Can I consume an interface and provide an implementation?

是的,必须将类型提示提供给编译器,以指示接口将被使用,并在create中提供实现.

abstract class ProviderInterface with ChangeNotifier {
  ...
}

class ProviderImplementation with ChangeNotifier implements ProviderInterface {
  ...
}

class Foo extends StatelessWidget {
  @override
  build(context) {
    final provider = Provider.of<ProviderInterface>(context);
    return ...
  }
}

ChangeNotifierProvider<ProviderInterface>(
  create: (_) => ProviderImplementation(),
  child: Foo(),
),

Existing providers #

provider者为不同类型的对象provider了几种不同类型的"提供者".

所有可用对象的完整列表在这里

namedescription
Provider 提供程序的最基本形式. 无论值是多少,它都会获取一个值并将其公开.
ListenableProvider 侦听对象的特定提供程序. 每当调用侦听器时,ListenableProvider将侦听该对象并要求依赖于该对象的小部件进行重建.
ChangeNotifierProvider 用于ChangeNotifier的ListenableProvider的规范. 必要时它将自动调用ChangeNotifier.dispose .
ValueListenableProvider听一个ValueListenable,只暴露ValueListenable.value .
StreamProvider收听流,并公开发出的最新值.
FutureProvider接受Future并在未来完成时更新依赖项.

4.3.1 #

  • 修复了一个热重载强制计算所有延迟加载的提供程序的错误.

4.3.0 #

  • 添加了ReassembleHandler接口,用于实现对象,以便provider让它们处理热重载.

4.2.0 #

  • MultiProvider上添加了一个builder参数(感谢@ joaomarcos96):
     MultiProvider( providers: [ ChangeNotifierProvider(create: (ct) => Counter()), ], builder: (ctx, child) { final counter = ctx.watch<Counter>(); return Text('${counter.count}'); }, ); 

4.1.3+1 #

  • 小自述更改

4.1.3 #

  • 改进了ProviderNotFoundException的错误消息,并ProviderNotFoundException了更适合通常出现问题的指令.

  • 添加了有关为何不应在build内部调用context.read以及如何执行操作的文档.

  • 改进了context.select的性能,如果在侦听该值的窗口小部件已经需要构建时提供者发生更改,则不调用选择器.

  • 修复了无法在ListView / LayoutBuilder调用context.watch的错误

  • 改善尝试在ListView.builder使用context.select时的错误消息

  • 打电话时改进错误消息context.read/watch/select / Provider.ofcontextnull .

4.1.2 #

  • 放松了对Flutter版本的限制以使其与beta通道兼容.

4.1.1 #

  • 使用context.select修复了"方面"泄漏,从而导致内存泄漏和不必要的重建
  • 修复提供程序的builder参数不起作用(由于@passsy)

4.1.0 #

  • BuildContext上添加了一个select扩展. 它的行为类似于Selector ,但是写起来却不那么冗长:

    使用选择器:

    Widget build(BuildContext context) {
      return Selector<Person, String>(
        selector: (_, p) => p.name,
        builder: (_, name, __) {
          return Text(name);
        },
      ),
    }
    

    带有新select扩展的VS:

    Widget build(BuildContext context) {
      final name = context.select((Person p) => p.name);
      return Text(name);
    }
    
  • 在不同的提供程序上添加了builder . 此参数简化了我们需要可以访问新提供程序的BuildContext的情况.

    因此,代替:

    Provider(
      create: (_) => Something(),
      child: Builder(
        builder: (context) {
          final name = context.select((Something s) => s.name);
          return Text(name);
        },
      ),
    )
    

    我们可以这样写:

    Provider(
      create: (_) => Something(),
      builder: (context, child) {
        final name = context.select((Something s) => s.name);
        return Text(name);
      },
    )
    

    行为是相同的. 这只是一个小的语法糖.

  • BuildContext上添加了两个扩展,以稍微减少样板:

    beforeafter
    Provider.of<T>(context, listen: false)context.read<T>()
    Provider.of<T>(context)context.watch<T>
  • BuildContext上添加了Locator typedef和扩展名,以帮助能够从不依赖Flutter的类中读取提供程序.

4.0.5+1 #

  • 添加了自述文件的葡萄牙语翻译(感谢@ robsonsilv4)

4.0.5 #

  • 当在MultiProvider之外使用提供程序时忘记传递child时,改进错误消息(感谢@felangel)

4.0.4 #

  • 更新ProviderNotFoundException以删除过时的解决方案. (感谢@augustinreille)

4.0.3 #

  • 改进了在未指定listen: false情况下调用Provider.of时的错误消息listen: false小部件树外部的listen: false .

4.0.2 #

  • 如果在didChangeDependencies内部调用,则修复Provider.of返回以前的值而不是新值.
  • 解决了不必要地调用update的问题.

4.0.1 #

  • 稳定发布4.0.0-hotfix + 1
  • 解决一些错字

4.0.0-hotfix.1 #

4.0.0 #

  • Selector现在默认情况下会深度比较集合,并提供了shouldRebuild来定制重建行为.
  • ProviderNotFoundError重命名为ProviderNotFoundException . 这允许在try/catch调用Provider.of而不触发警告.
  • 更新提供程序以与Flutter 1.12.1一起使用
  • 现在,使用提供程序创建和侦听对象的操作比较延迟. 这意味着对象是在第一次读取值时创建的,而不是第一次安装提供程序时创建的.
  • 现在将自动推断Provider.oflisten参数. 在小部件树外部调用Provider.of时,不再需要传递listen: false . 被4.0.0-hotfix删除. 见https://github.com/rrousselGit/provider/issues/305
  • renamed initialBuilder & builder of *ProxyProvider to create & update
  • renamed builder of *Provider to create
  • 添加了*ProxyProvider0变体

3.2.0 #

  • 提供者不赞成使用"构建器",而赞成"创建"
  • 不赞成使用代理提供程序的" initialBuilder" /" builder",而分别建议使用" create"和" update"

3.1.0 #

  • 添加了Selector ,类似于Consumer但是可以过滤不需要的更新
  • 改善了整体文件
  • 修正了错误ChangeNotifierProvider.value时没有更新家属ChangeNotifier例如改变.
  • Consumer现在可以在MultiProvider
     MultiProvider( providers: [ Provider(builder: (_) => Foo()), Consumer<Foo>( builder: (context, foo, child) => Provider.value(value: foo.bar, child: child), ) ], ); 

3.0.0 #

breaking (see the readme for migration steps): #

  • Provider现在如果与Listenable / Stream一起使用,则抛出该Listenable . 可以通过将Provider.debugCheckInvalidValueType设置为null来禁用它.
  • StreamProvider的默认构造函数现在已构建一个Stream而不是StreamController . 先前的行为已移至StreamProvider.controller .
  • 现在,所有XXProvider.value构造函数都使用value作为参数名称.
  • 添加了FutureProvider ,它接受将来并在将来完成时更新依赖项.
  • 提供程序不再可以使用const构造函数实例化.

non-breaking: #

  • 添加了ProxyProviderListenableProxyProviderChangeNotifierProxyProvider . 这些提供程序允许建立依赖于其他提供程序的值,而不会失去反应性或手动处理状态.
  • 添加了DelegateWidget和一些相关的类来帮助构建自定义提供程序.
  • 公开了内部通用InheritedWidget来帮助构建自定义提供程序.

2.0.1 #

  • 修复了一个错误,该错误ListenableProvider.value / ChangeNotifierProvider.value / StreamProvider.value / ValueListenableProvider.value过于频繁地订阅/取消订阅各自的对象
  • 修复了ListenableProvider.value / ChangeNotifierProvider.value可能重建得太频繁或跳过一些错误的错误.

2.0.0 #

  • Consumer现在采用一个可选的child参数来进行优化.
  • merged Provider and StatefulProvider
  • ValueListenableProvider添加了一个" builder"构造ValueListenableProvider
  • 规范化提供程序构造函数,以使默认构造函数为" builder",并提供一个名为构造函数的value .

1.6.1 #

  • Provider.of<T>现与崩溃ProviderNotFoundException时没有Provider<T>在使用的上下文的祖先中.

1.6.0 #

  • 新增内容: ChangeNotifierProvider ,类似于scoped_model,它仅在notifyListeners时公开ChangeNotifer子类并重建依赖项.
  • 新增: ValueListenableProvider ,一个提供程序,只要传递给ValueNotifier的值更改,该提供程序就会重建.

1.5.0 #

  • 新增:添加带有多达6个参数的Consumer .
  • 新增功能: MultiProvider ,一个提供程序,使提供程序树更易读
  • 新增: StreamProvider ,这是一个向其子孙公开Stream的当前值的Stream .

1.4.0 #

  • 通过修改后的原型重新引入了StatefulProvider . valueBuilderdidChangeDependencies的第二个参数已删除. 现在,在StatefulProvider的整个生命周期中,仅对valueBuilder调用一次.

1.3.0 #

  • 增加了Consumer ,当我们需要同时公开和使用一个值时很有用.

1.2.0 #

  • 补充: HookProvider ,一个从Hook创建其值的Provider .
  • 不推荐使用的StatefulProvider . 制作一个StatefulWidget或使用HookProvider .
  • Integrated the widget inspector, so that Provider widget shows the current value.

1.1.1 #

  • 添加didChangeDependencies回调以允许基于InheritedWidget更新值
  • ProviderStatefulProvider都添加updateShouldNotify方法

1.1.0 #

  • onDispose已添加到StatefulProvider
  • BuildContext现在传递给valueBuilder回调

example/lib/main.dart

// ignore_for_file: public_member_api_docs, lines_longer_than_80_chars
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

/// This is a reimplementation of the default Flutter application using provider + [ChangeNotifier].

void main() {
  runApp(
    /// Providers are above [MyApp] instead of inside it, so that tests
    /// can use [MyApp] while mocking the providers
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => Counter()),
      ],
      child: MyApp(),
    ),
  );
}

/// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool
class Counter with ChangeNotifier, DiagnosticableTreeMixin {
  int _count = 0;
  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }

  /// Makes `Counter` readable inside the devtools by listing all of its properties
  @override
  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
    super.debugFillProperties(properties);
    properties.add(IntProperty('count', count));
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Example'),
      ),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text('You have pushed the button this many times:'),

            /// Extracted as a separate widget for performance optimization.
            /// As a separate widget, it will rebuild independently from [MyHomePage].
            ///
            /// This is totally optional (and rarely needed).
            /// Similarly, we could also use [Consumer] or [Selector].
            const Count(),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        /// Calls `context.read` instead of `context.watch` so that it does not rebuild
        /// when [Counter] changes.
        onPressed: () => context.read<Counter>().increment(),
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

class Count extends StatelessWidget {
  const Count({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Text(

        /// Calls `context.watch` to make [MyHomePage] rebuild when [Counter] changes.
        '${context.watch<Counter>().count}',
        style: Theme.of(context).textTheme.headline4);
  }
}

Use this package as a library

1. Depend on it

将此添加到包的pubspec.yaml文件中:


dependencies:
  provider: ^4.3.1

2. Install it

您可以从命令行安装软件包:

使用Flutter:


$ flutter pub get

另外,您的编辑器可能支持flutter pub get . 查看您的编辑器文档以了解更多信息.

3. Import it

现在,在Dart代码中,您可以使用:


import 'package:provider/provider.dart';
  
Popularity:
描述该程序包相对于其他程序包的受欢迎程度. [更多]
100
Health:
从静态分析得出的代码运行状况. [更多]
100
Maintenance:
反映出包装的整洁和最新状态. [更多]
100
Overall:
以上的加权分数. [更多]
100
了解有关得分的更多信息.

我们在2020年7月14日对该程序包进行了分析,并在下面提供了得分,详细信息和建议. using: 分析已完成,状态使用以下命令 :

  • 飞镖:2.8.4
  • 直到:0.13.15
  • 颤振:1.17.5

Analysis suggestions

软件包与SDK dart不兼容

Because:

  • provider ,该程序包需要null.

Dependencies

Package Constraint Resolved Available
直接依赖
Dart SDK > = 2.7.0 <3.0.0
collection ^1.14.0 1.14.12 1.14.13
flutter 0.0.0
nested > = 0.0.4 <2.0.0 0.0.4
传递依存关系
meta 1.1.8 1.2.2
sky_engine 0.0.99
typed_data 1.1.6 1.2.0
vector_math 2.0.8 2.1.0-nullsafety
开发依赖
flutter_test
mockito ^4.0.0

by  ICOPY.SITE