颤振提供者。如何拥有相同提供程序类型的多个实例?

时间:2021-05-28 17:53:43

标签: flutter flutter-provider

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

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

我理解的问题是我将如何创建每个人的提供者和每个人的报告?我见过的所有使用 provider 的示例似乎都只有一个 provider 实例。

实际上,我希望能够在不影响人员 B 的情况下编辑人员 A 的值

编辑:

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

编辑 2:

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

3 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解了您的问题,但是提供程序不包含数据,它只是使其可用,如果您正在谈论提供程序包,它可以帮助您应用程序的其他部分获得通知当对您的数据进行更改时。而模型是您可以制作实例的东西。

答案 1 :(得分:0)

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

 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 类,您可以管理您的人员。每个人都有一个报告类型的对象,代表其中的数据。

答案 2 :(得分:0)

你的状态对象必须是唯一命名的类型,否则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"),
              )
            ],
          ),
        ],
      ),
    );
  }
}