更改通知程序中的对象列表不更新

时间:2020-06-06 07:55:33

标签: flutter flutter-layout flutter-dependencies flutter-animation flutter-test

我有一个从ChangeNotifier继承的对象列表。我删除了这些类型只是为了简化内容。

class TaskListsState with ChangeNotifier {
  List _lists = List();
  _currentList;

  List get lists => _lists;
  get currentList => _currentList;

  set lists(List newValue) {
    this._lists = newValue;
    notifyListeners();
  }

  set currentList(newValue) {
    this._currentList = newValue;
    notifyListeners();
  }

  TaskListsState() {
    this._lists = [
      ToDoListState(),
      ToCreateListState(),
      ToDecideListState(),
      BalancedMeListState()
    ];

    this._currentList = this._lists[0];
  }
}

所有对象都继承自基类,但是通常,这是它们的外观

class ToCreateListState with ChangeNotifier implements TaskListState {
  String title = "TO CREATE LIST";
  String alias = "tocreate";
  bool _loading = false;
  List<TaskState> _tasks;

  bool get loading => _loading;
  List<TaskState> get tasks => _tasks;

  set tasks(List<TaskState> newValue) {
    this._tasks = newValue;
    notifyListeners();
  }

  set loading(bool newValue) {
    _loading = newValue;
    notifyListeners();
  }

  ToCreateListState();

  removeTask(TaskState task) {
    this._tasks.remove(task);
    notifyListeners();
  }
}

现在,当我更新列表对象之一时,它们不会在UI中更新。我该如何解决?

当前,这是我在视图中的使用方式:

 MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (context) => TaskListsState(),
        ),

      ],
      child: MaterialApp(
        title: '',
        debugShowCheckedModeBanner: false,
        theme: ThemeData(
          primarySwatch: Colors.blue,
          fontFamily: 'Montserrat',
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        initialRoute: defaultHome,
        onGenerateRoute: onGenerateRoute,
      ),
    );

然后,当我想使用屏幕中的一项时,我会Provider.of<TaskListsState>(context).lists[index].whateverValue =. anotherValue;

但是,它不会更新。

2 个答案:

答案 0 :(得分:2)

运行sex时不会调用Provider.of<TaskListsState>(context).lists[index].whateverValue =. anotherValue;,因为它不会更新notifyListeners()本身。

您可以简单地在lists内创建一个为您进行修改的方法,然后调用TaskListsState

notifyListeners()

您应将class TaskListsState with ChangeNotifier { ... void updateWhateverValue(int index, dynamic value) { lists[index].whateverValue = value; notifyListeners(); } ... } 替换为您拥有的对象。

答案 1 :(得分:0)

这是另一种解释: 想象一下我们有这个班

class Products with ChangeNotifier
{

List<String> prods =new List() :

List<String> getProds => prods;

Void addprod() 
{
prods.add('chocolate');
prods.add('beer');
notifyListeners();
} 

Products()
{
addprod();
}


} 

因此,我们有一个已经有两个产品的类产品。

如果我们致电

,则删除产品的情况

Provider.of<Products>(context)().products.remove('beer')

啤酒将被删除,但所有其他消费者将不会得到通知,因为remove是预定义的函数,在Products类中不作为通知程序存在。

确保每次调用函数时,它实际上是在更新数据模型类中的某些内容,以便您可以注意到更改。

希望能阐明您的愿景。