如何在 Flutter 中添加多个相同类型的 ChangeNotifierProvider

Blo*_*oss 5 dart flutter flutter-provider

是否可以添加相同类型的多个 ChangeNotifierProvider?

return MultiProvider(
  providers: [
      ChangeNotifierProvider<ValueNotifier<double>>(
        create: (_) => ValueNotifier<double>(0.0),
      ),
      ChangeNotifierProvider<ValueNotifier<double>>(
        create: (_) => ValueNotifier<double>(0.0),
      ),
  ],
Run Code Online (Sandbox Code Playgroud)

在我的构建方法中

 @override
  Widget build(BuildContext context) {
    ValueNotifier<double> firstNotifier = Provider.of(context, listen: true);
    ValueNotifier<double> secondNotifier = Provider.of(context, listen: true);

  print('First value ${firstNotifier.value} Second value ${secondNotifier.value}');

 ...
 onTap:(){
   firstNotifier.value = 10.0;
   secondNotifier.value = 30.0;
 }
Run Code Online (Sandbox Code Playgroud)

两个打印值相同 第一个值为 10 第二个值为 10

Sau*_*mar 21

有一种优雅的方法可以做到这一点,但是我们必须创建两个独立的类来扩展changeNotifierProvider

class FirstNotifier with ChangeNotifier{
  double value=0; //default
  void changeValue(double newValue){
    value=newValue
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

第二个通知者为;

class SecondNotifier with ChangeNotifier{
  double value=0; //default
  void changeValue(double newValue){
    value=newValue
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的构建方法中你可以访问它们

final firstNotifier = Provider.of<FirstNotifier>(context, listen:true)
final secondNotifier = Provider.of<SecondNotifier>(context, listen:true)
Run Code Online (Sandbox Code Playgroud)

然后你可以对它们进行更改

firstNotifier.changeValue(30); 
Run Code Online (Sandbox Code Playgroud)

在 MultiProvider 代码中,您可以将 Provider 包装为

return MultiProvider(
  providers: [
      ChangeNotifierProvider<FirstNotifier>(
        create: (_) => FirstNotifier,
      ),
      ChangeNotifierProvider<SecondNotifier >(
        create: (_) => SecondNotifier ,
      ),
  ],
Run Code Online (Sandbox Code Playgroud)

这样就可以了


Vir*_*iya 7

这是不可能的。您必须提供不同类型的提供程序才能获得正确的值。

如果您多次使用同一个提供程序,那么它会为您提供小部件树中最接近的提供程序值的值。

他们的官方文档中也提到了这一点。

在这里查看。 我可以使用相同的类型获得两个不同的提供者吗?