我想创建一个使用ChangeNotifier的父类。在这个类中,我想创建两个独立的继承类它们会提供列表数据给app的某些部分,每个会有自己独立的列表。但是我无法弄清楚每个类如何创建自己的列表,并且只能通过使用超类对该列表进行操作。有人能告诉我怎么做吗?
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;
}
}
例如,我将在其他文件中使用此提供程序
final groupList = Provider.of<GroupList>(context);
groupList.add(....)
我重构了我的代码,并提出了一个适合我的解决方案。让我尽可能多地解释未来的阅读。
将map从private改为public。我不确定这是最好的方法,但它对这种情况有效。我还可以使用getter和setter,但这样做,提供者对象最终会有两个变量_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();
}
}
扩展后添加泛型。通过这种方式,我能够访问之前我公开访问的地图变量。对PersonList也做了同样的事情。
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(),
),
);
},
);
}
...
我正在做类似的事情(不是当前版本)。我想尝试和帮助,如果和在哪里我可以-尽管警告,我仍然弄清楚很多基本的自己。
你能把问题缩小或重新表述吗?
我在上面链接的应用程序中所做的,在我快速浏览你的代码后,我认为它可能与你相关,我所做的是:
- 在父类中'保留'列表和尽可能多的功能
- 在我的例子中,每个子类扩展父类-我称之为' lististicle ',对象的类型是特定于那个childTypeListicle的(目前)。子类包含它们列出的类型的规范——在我的例子中,每个it类型共享一个抽象的父Item类——以及一些配置细节,例如远程访问和工厂构造器。这些字段通过共享父类强制的抽象方法声明与父接口及其围绕列表的泛型功能通信。这就形成了一种列表类型,它与项目类型无关。有意义吗?
到目前为止似乎工作得很好,基本上保持了表示平面实现的这一边的逻辑。
我也有三级连接的界面元素,如底部警报栏连接到父' lististicle '的字段,并创建一种导航ui,操作列表到listview生成器。还想构建一些局部的本地存储库,但这似乎不是目前这个项目的优先事项。
我希望这些能有所帮助。