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

问题描述 投票:0回答:2

我有一个从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;

但是,它不会更新。

flutter flutter-layout flutter-dependencies flutter-animation flutter-test
2个回答
2
投票

当您运行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();
    }
...
}

您应将dynamic替换为所拥有的对象。


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类中不存在作为通知程序的功能。

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

希望能阐明您的愿景。

© www.soinside.com 2019 - 2024. All rights reserved.