flutter - Dart继承类并在父类的函数中使用

标签 flutter dart oop inheritance

我想创建一个使用 ChangeNotifier 的父类。从这个类中,我想创建两个单独的继承类,它们将为应用程序的某些部分提供列表数据,并且每个类都有自己单独的列表。但是我无法弄清楚每个类如何创建自己的列表并仅通过使用父类(super class)对该列表进行操作。有人可以向我解释一下我该如何管理吗?

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 从私有(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();
  }
}

扩展后添加泛型。这样我就可以访问之前我公开访问的 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();
  }
}

除了这些我没有改变任何相关的东西。现在我可以在其他文件中调用和使用 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 - Dart继承类并在父类的函数中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72744109/

相关文章:

flutter - 在下面的代码中,当点击按钮时,为什么不能调用[print ("BBB' s build function.")]?

http - 如果http请求失败,如何添加超时?

android - 如何在单击推送通知时打开特定屏幕以进行 flutter

flutter - 如何在 Flutter 中刷新 AlertDialog?

c++ - 扩展嵌套类方法

php - 调用具有相同签名/名称的父函数

javascript - 我自己的 JavaScript 库存在错误。看不到它在哪里

user-interface - 为什么此FAB无法更新状态?

flutter - 如何在 flutter 中等待 setter/getter ?

dart - Dart:如何获得Stream的长度?