我想創建一個使用 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(....)
uj5u.com熱心網友回復:
我重構了我的代碼并提出了一個適合我的解決方案。讓我盡可能多地解釋未來的閱讀。
將地圖從私人更改為公共。我不確定這是最好的方法,但它適用于這種情況。我還可以使用 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();
}
}
擴展后添加泛型。通過這種方式,我能夠訪問之前公開訪問的 map 變數。對 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();
}
}
除了這些,我沒有改變任何相關的東西。現在我可以在其他檔案中呼叫和使用提供程式
...
@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(),
),
);
},
);
}
...
uj5u.com熱心網友回復:
我目前正在研究類似的東西(不是當前版本)。如果可以的話,我想盡我所能提供幫助——盡管需要注意的是,我自己仍在弄清楚很多基礎知識。
你能縮小范圍或重新表述問題嗎?
我在上面鏈接到的應用程式中所做的,據我認為在快速瀏覽您的代碼后可能與您相關,我所做的是:
- 在父類中“保留”串列和盡可能多的功能。
- 就我而言,每個子類都擴展了該父類——我稱它為“listicle”,并且物件的型別特定于該 childTypeListicle(目前)。
- 子類包含它們列出的型別的規范——在我的例子中,它的每個型別都共享一個抽象的父項類——以及一些配置細節,例如遠程訪問和工廠建構式。這些欄位通過共享父類強制執行的抽象方法宣告與父介面及其圍繞串列的通用化功能進行通信。因此,它創建了一種串列作為 axel,而它合理地與專案型別無關。說得通?
到目前為止似乎運行良好,基本上掌握了表示平面實作這一方面的邏輯。
我還有第三級連接界面元素,例如底部警報欄連接到父“串列”的欄位,并創建一種導航 ui,將串列操作到串列視圖構建器上。還想構建一些部分本地存盤庫,但這似乎不是這個專案的優先事項。
我希望其中一些有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/496389.html
下一篇:在基類參考上轉換繼承類
