簡體   English   中英

Flutter 提供程序。 如何擁有相同提供者類型的多個實例?

[英]Flutter Provider. How to have multiple instances of the same provider type?

所以我對如何使用 setstate 將應用程序移植到提供者有點困惑。

假設我有一個擴展提供者的人 model。 現在我也想要多人報告。 每個報告都有自己的屬性,例如標題、創建日期等以及人員列表。

我遇到的麻煩是如何為每人和每人報告創建提供者? 我見過的所有使用提供程序的示例似乎都只有一個提供程序實例。

實際上,我希望能夠在不影響人 B 的情況下編輯人 A 的值

編輯:

我的 object 的每個實例都需要一個單獨的 state。 提供者如何管理所有相同類型的多個對象的狀態?

編輯2:

我將嘗試用一個不同的例子進一步澄清。 想象一下創建 flutter 應用程序時默認示例的計數器小部件。 如果我需要一個動態創建的計數器列表(可能是 10 個,也可能是 100 個)。 每個計數器都會有它自己的提供程序來控制它的 state,如果是這樣,我們將如何創建它?

關於如何構建數據沒有硬性規定。 根據我對您的問題的理解:

 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 class,您可以管理您的人員。 每個人都有一個報告類型 object 代表其中的數據。

我不確定我是否正確理解了您的問題,但是提供程序不包含數據,它只是使其可用,如果您在談論提供程序 package 它可以幫助您的應用程序的其他部分在更改時收到通知對您的數據進行了處理。 而 model 是您可以制作的實例。

您的 state 對象必須是唯一命名的類型,否則 Provider 無法區分它們。

您可以創建一個基礎Person class ,然后將該基礎 class 擴展到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"),
              )
            ],
          ),
        ],
      ),
    );
  }
}

我不知道是否有一種方法可以動態創建提供程序,就像在 edit2 的示例中一樣,但是如果您想創建多個相同類型的提供程序而不重復代碼,您可以將類型 T 傳遞給擴展 ChangeNotifier 的 class。

class Counter<T> extends ChangeNotifier {
    late int value;

    Counter() { value = 0; }

    int get getValue => value;

    void increase() {
        value += 1;
        notifyListeners();
    }
}

傳遞不同的類型應該在 memory 中創建不同的類,這些類將管理這些不同計數器的 state。 插圖:

class A {}
class B {}
class C {}

MultiProvider(
    providers: [
        ChangeNotifierProvider(
            create: (_) => Counter<A>()),
        ChangeNotifierProvider(
            create: (_) => Counter<B>()),
        ChangeNotifierProvider(
            create: (_) => Counter<C>()),
    ],
    child: Home(),
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM