list - 有什么方法可以在 Flutter 中处理应用程序状态中的列表?

标签 list flutter state-management

我想要几个 List,我可以使用来自 providerProvider 提供它们包裹。我可以从它们中的每一个添加或删除元素。这些列表的元素也是可以更改的对象。我希望我的应用程序对所有这些更改使用react。

现在我需要为每个列表创建单独的类。它们每个都有一个包含 List 的字段和访问、删除或添加其元素的方法。这需要大量样板文件,并且很难处理元素字段中的更改。

// I would like to use ChangeNotifier here, but then I need to make all fields
// private, write getters and setters for them and assign them manually in
// constructor.
class Model {
  int amount;

  Model(this.amount);
}

class ModelService extends ChangeNotifier {
  final models = <Model>[];

  UnmodifiableListView<Model> get all => UnmodifiableListView(models);

  int get length => models.length;

  remove(Model model) {
    models.remove(model);
    notifyListeners();
  }

  add(Model model) {
    models.add(model);
    notifyListeners();
  }

  Model elementAt(int index) => models.elementAt(index);

  elementChanged() => notifyListeners();
}

class ExampleWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) => Column(
    children: [
      RaisedButton(
        child: Text('Add model'),
        onPressed: () => Provider.of<ModelService>(context).add(Model(0)),
      ),
      Expanded(
        child: Consumer<ModelService>(
          builder: (context, service, child) {
            return ListView.builder(
              itemBuilder: (context, index) {
                if (index >= service.length) {
                  return null;
                }

                final model = service.elementAt(index);

                return ListTile(
                  leading: IconButton(
                    icon: Icon(Icons.add),
                    onPressed: () {
                      model.amount++;
                      service.elementChanged();
                    },
                  ),
                  title: Text(model.amount.toString()),
                  trailing: IconButton(
                    icon: Icon(Icons.delete),
                    onPressed: () => service.remove(model),
                  ),
                );
              },
            );
          },
        ),
      ),
    ],
  );
}

有没有更简单或更惯用的方法来处理这种情况?

最佳答案

您可以使用泛型使您的对象可重用:

class ModelService<Model> extends ChangeNotifier {
  final models = <Model>[];

  UnmodifiableListView<Model> get all => UnmodifiableListView(models);

  int get length => models.length;

  remove(Model model) {
    models.remove(model);
    notifyListeners();
  }

  add(Model model) {
    models.add(model);
    notifyListeners();
  }

  Model elementAt(int index) => models.elementAt(index);

  elementChanged() => notifyListeners();
}

我经常做的事情是从该类继承并向其添加额外的逻辑:排序、获取、过滤、保存等。例如:

class TodoService extends ModelService<Todo> {
  add(Todo model) {
    super.add(model);
    // save the list on disk
  }

  void setSearchText(String searchText) {
    // apply search text on the models list
  }
}

这样您的小部件可以变得更加简单。

关于list - 有什么方法可以在 Flutter 中处理应用程序状态中的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57462614/

相关文章:

ios - 属性更改时可观察不更新列表

Python 3 将范围转换为列表

android - 从动态创建的列表中动态删除小部件 flutter

reactjs - MobX,Store 不可用,请确保它是由某些提供商提供的

javascript - VueJs 和 Vuex,如何将 v-model 附加到动态字段

c# - GetElementByID.GetElementsByTagName 返回 null

python - 一种在 python 中制作函数列表的优雅方法

flutter - 如果我在 Flutter 中只使用一些 Statefulwidgets 会怎样?

flutter - 在 Flutter 中禁用 `semantics` 系统?

javascript - React 上下文初始状态正在发生变化 - JavaScript/React