我想创建一个使用ChangeNotifier的父类.从这个类中,我想创建两个单独的继承类,它们将为应用程序的某些部分提供列表数据,每个类都有自己的单独列表.但我无法理解每个类如何创建自己的列表,并且只能通过使用超类对该列表进行操作.有人能给我解释一下我该怎么做吗?

import 'package:flutter/material.dart';

class ObjectListProvider<T extends num, K extends Object> with ChangeNotifier {
  final Map<T, K> _map = {};

  Map<T, K> get map {
    return {..._map};
  }

  K? getSingleObjectWithId(id) {
    return _map[id];
  }

  void add(T id, K obj) {
    _map[id] = obj;
    notifyListeners();
  }

  void remove(T id) {
    _map.remove(id);
    notifyListeners();
  }
}

import 'object_list_provider.dart';
import '../person.dart';

class PersonList extends ObjectListProvider {
  final Map<dynamic, Person> _people = {};
}

import './object_list_provider.dart';
import '../group.dart';
import '../person.dart';

class GroupList extends ObjectListProvider {
  final Map<dynamic, Group> _groups = {};

  void addPersonToGroup<T extends num>(Person person, T id) {
    super.add(id, person);
    notifyListeners();
  }

  void removePersonFromGroup<T extends num>(Person person, T id) {
    _groups[id]?.removePerson(id);
    notifyListeners();
  }
}

import './person.dart';
import './transaction.dart';

class Group {
  final int _id;
  String _name;
  List<Person> _people = [];
  List<Transaction> _transactions = [];
  int _totalSpending;

  Group({required int id, required String name, int totalSpending = 0})
      : _id = id,
        _name = name,
        _totalSpending = totalSpending;

  int get id {
    return _id;
  }

  String get name {
    return _name;
  }

  int get totalSpending {
    return _totalSpending;
  }

  set name(String newName) {
    _name = newName;
  }

  void addPerson(Person person) {
    _people.add(person);
  }

  void removePerson<T extends num>(T id) {
    _people = _people.where((Person person) => person.id != id).toList();
  }

  void addTransaction(Transaction transaction) {
    _transactions.add(transaction);
  }
}

class Person {
  final int _id;
  final String _name;
  int _balance;
  List<int> involvedGroups = [];

  Person({required int id, required String name, int balance = 0})
      : _id = id,
        _name = name,
        _balance = balance;

  int get id {
    return _id;
  }
}

例如,我将在其他dart文件中使用此提供程序作为

final groupList = Provider.of<GroupList>(context);
groupList.add(....)

推荐答案

我重构了代码,并提出了一个适合我的解决方案.让我尽可能多地解释一下future 的阅读.

已将 map 从专用更改为公用.我不确定这是不是最好的办法,但它对这个案子起到了作用.我还能够使用getter和setter,但通过使用该provider对象,最终得到了两个变量,即\u map和map.

import 'package:flutter/material.dart';

class ObjectListProvider<T extends num, K extends Object> with ChangeNotifier {
  Map<T, K> map = {};

  K? getSingleObjectWithId(id) {
    return map[id];
  }

  void add(T id, K obj) {
    map[id] = obj;
    notifyListeners();
  }

  void remove(T id) {
    map.remove(id);
    notifyListeners();
  }
}

扩展后添加泛型.通过这种方式,我可以访问map变量,之前我将其公开访问.对个人主义者也做了同样的事情.

import './object_list_provider.dart';
import '../group.dart';
import '../person.dart';

class GroupList extends ObjectListProvider<num, Group> {

  void addPersonToGroup<T extends num>(Person person, T id) {
    super.map[id]?.addPerson(person);
    notifyListeners();
  }

  void removePersonFromGroup<T extends num>(Person person, T id) {
    super.map[id]?.addPerson(person);
    notifyListeners();
  }
}

除此之外,我没有改变任何相关内容.现在,我可以在其他文件中调用并使用provider作为

...

@override
  Widget build(BuildContext context) {
    final groupList = Provider.of<GroupList>(context);
    final groups = groupList.map;

    return ListView.builder(
      itemCount: groups.length,
      itemBuilder: (context, int index) {
        return ListTile(
          onTap: () => index,
          title: Text(groups[groups.keys.elementAt(index)]!.name),
          trailing: Text(
            groups[groups.keys.elementAt(index)]!.totalSpending.toString(),
          ),
        );
      },
    );
  }

...

Flutter相关问答推荐

无法在GroupButton内部正确呈现

从超级应用程序启动时,Flutter 小应用程序中未加载资源

如果我使用搜索栏,如何在嵌套滚动视图中停止自动滚动?

Flutter GestureDetector单击问题-堆叠外面的按钮不可点击

为什么我的Flutter 动画过渡没有发生?

Flutter 中的 setState() 内部是如何工作的?

Flutter 构建 Web 分段故障 - 无法启动事件处理程序线程

Supabase Auth:重定向到 Google.com 而不是我的应用程序

如何在列表视图生成器中显示图像

Flutter Dismissible 不会在 startToEnd 滑动时被关闭

如何将取消图标放置在右上角

点击后,将按钮的 colored颜色 禁用/更改一段时间

如何(部分)更新 riverpod 中的 AsyncValue?

Flutter/Riverpod 创建复杂对象的副本,其值在某处发生变化

如何修复int类型不是String类型的子类型

Flutter:如何判断嵌套列表是否包含值

出现错误;运算符[]不是为对象类型定义的?功能()'

如何在 flutter 中更改日期 Select 器 colored颜色 ?

Flutter:整个判断整个应用生命周期的通用类

根据索引/变量更改小部件的 colored颜色