如何在Flutter中使用多个ChangeNotifierProvider?

时间:2020-04-09 14:03:53

标签: flutter dart provider

我最近开始使用provider进行状态管理,并且我知道一次使用一个。

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ChangeNotifierProvider<Reader>(
        create: (context) => new Reader(),
        child: _HomeBody(),
      ),
    );
  }
}

但是现在我有两个不同的类,我想添加两个类并能够在我的小部件树中进行访问。

如何在ChangeNotifierProvider中添加多个Flutter

2 个答案:

答案 0 :(得分:2)

一个选项(不建议)是嵌套2个提供程序:

ChangeNotifierProvider<Reader>(
  create: (_) => Reader(),
  child: ChangeNotifierProvider<SomethingElse>(
    create: (_) => SomethingElse(),
    child: ChangeNotifierProvider<AnotherThing>(
      create: (_) => AnotherThing(),
      child: someWidget,
    ),
  ),
),

不建议这样做,因为如文档所述:

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

但是,Provider package itself的另一个建议是使用MultiProvider

  providers: [
    ChangeNotifierProvider<Reader>(create: (_) => Reader()),
    ChangeNotifierProvider<SomethingElse>(create: (_) => SomethingElse()),
    ChangeNotifierProvider<AnotherThing>(create: (_) => AnotherThing()),
  ],
  child: _HomeBody(),
)

两种方法的工作原理相同,但第二种方法更具可读性。作为文档文字:

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

根据provider flutter package page改编并适合您的情况的示例。

答案 1 :(得分:1)

您可以使用MultiProvider

本指南对我有帮助,希望对您有帮助...

MultiProvider(
  providers: [
    ChangeNotifierProvider<Counter>(builder: (context) => Counter(0)),
    ProxyProvider<Counter, ThemeSwitch>.custom(
      builder: (context, counter, previous) {
        final theme = previous ?? ThemeSwitch(ThemeState.light);
        theme.themeState =
              (counter.value > 5) ? ThemeState.dark : ThemeState.light;
        return theme;
      },
      dispose: (context, value) => value.dispose(),
      providerBuilder: (_, value, child) =>
          ChangeNotifierProvider.value(notifier: value, child: child),
    ),
  ],
)