【问题标题】:Flutter Provider. How to have multiple instances of the same provider type?颤振提供者。如何拥有相同提供者类型的多个实例?
【发布时间】:2021-08-16 23:28:48
【问题描述】:

所以我对如何使用 setstate 将应用程序移植到提供者有点困惑。

假设我有一个扩展提供者的人员模型。现在我也想要多人报告。每个报告都有自己的属性,例如标题、创建日期等以及人员列表。

我遇到的麻烦是如何创建一个提供者和每个人的报告?我见过的所有使用提供程序的示例似乎都只有一个提供程序实例。

实际上,我希望能够编辑“A”的值而不影响“B”的值

编辑:

我的对象的每个实例都需要一个单独的状态。提供者如何管理同一类型的多个对象的状态?

编辑 2:

我会尝试用一个不同的例子来进一步澄清。想象一下创建 Flutter 应用程序时默认使用的计数器小部件。如果我需要动态创建的计数器列表(可能是 10 个,也可能是 100 个)怎么办?每个计数器是否会有它自己的提供程序来控制它的状态?如果是这样,我们将如何创建它?

【问题讨论】:

    标签: flutter flutter-provider


    【解决方案1】:

    你的状态对象必须是唯一命名的类型,否则Provider无法区分。

    您可以创建一个基类 Person,然后将该基类扩展为 PersonAPersonB 等。

    那么它们可以单独控制,但仍然依赖于基类的功能。

    import 'package:flutter/material.dart';
    import 'package:provider/provider.dart';
    
    class Person with ChangeNotifier {
      String name;
    
      Person(this.name);
    
      void changeName(String newName) {
        name = newName;
        notifyListeners();
      }
    }
    
    class PersonA extends Person {
      PersonA(String value) : super(value);
    }
    
    class PersonB extends Person {
      PersonB(String value) : super(value);
    }
    
    class ProviderDuplicatePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MultiProvider(
          providers: [
            ChangeNotifierProvider(create: (_) => PersonA('Billy Boy')),
            ChangeNotifierProvider(create: (_) => PersonB('Francis')),
          ],
          child: Scaffold(
            appBar: AppBar(
              title: Text('Provider Duplicate Types'),
            ),
            body: DuplicateProviderStateObjects(),
          )
        );
      }
    }
    
    class DuplicateProviderStateObjects extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Center(
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              Column(
                children: [
                  Text('Provider One:'),
                  Text(Provider.of<PersonA>(context).name),
                  ElevatedButton(
                    child: Text('Change Person A'),
                    onPressed: () => Provider.of<PersonA>(context, listen: false).changeName("Kong"),
                  )
                ],
              ),
              Column(
                children: [
                  Text('Provider Two:'),
                  Text(context.watch<PersonB>().name),
                  ElevatedButton(
                    child: Text('Change Person B'),
                    onPressed: () => Provider.of<PersonB>(context, listen: false).changeName("Godzilla"),
                  )
                ],
              ),
            ],
          ),
        );
      }
    }
    

    【讨论】:

    • 如果人员列表是由用户动态生成或从外部数据源加载的,这听起来不太好管理?
    • @Lee 完全同意。我们不会创建几十个在所有意图和目的上都相同的 Person 类。这个答案是为了说明如何创建同一提供程序类型的多个实例的机制。您能解释一下是什么阻止您在状态类中使用数据结构(如数组或映射等)来维护多个对象的状态吗?
    【解决方案2】:

    对于如何构建数据没有硬性规定。根据我对您的问题的理解:

     class Person{
      String name;
      Report reportData;
      
      Person(this.name, this.reportData);
    }
    
    class Report{
      String title;
      Map<String, dynamic> data;
      
      Report(this.title, this.data);
    }
    
    class PersonsData with ChangeNotifier
    {
      List<Person> l1 = [];
      
      void addData()
      {
        l1.add(Person('John', Report('report1', {'dataTitle' : 'datDescription'})));
      }
    }
    

    现在使用 PersonsData 类,您可以管理您的人员。每个人都有一个报告类型对象,代表其中的数据。

    【讨论】:

    • 如何同时在屏幕上显示多个人,每个人都有自己的提供者状态?
    【解决方案3】:

    我不确定我是否正确理解了您的问题,但提供程序不包含数据,它只是使其可用,如果您谈论的是提供程序包,它可以帮助您的应用程序的其他部分得到通知当您的数据发生更改时。而模型是您可以创建实例的对象。

    【讨论】:

    • 我的对象的每个实例都需要一个单独的状态。提供者如何管理同一类型的多个对象的状态?。
    • 我建议使用 BLoC 或 cubits 进行状态管理。看看这个播放列表:youtube.com/…,如果有帮助请点赞我:)
    猜你喜欢
    • 2021-11-01
    • 2021-07-10
    • 1970-01-01
    • 2020-05-10
    • 2021-05-08
    • 2021-06-18
    • 1970-01-01
    • 2019-12-08
    • 2022-01-15
    相关资源
    最近更新 更多