【问题标题】:Is there any way to handle List in app state in Flutter?有什么办法可以在 Flutter 中处理应用状态的 List 吗?
【发布时间】:2019-08-12 13:57:04
【问题描述】:

我想要几个Lists,我可以使用provider 包中的Provider 提供。我可以添加或删除每个元素。这些列表的元素也是可以更改的对象。我希望我的应用程序能够对所有这些更改做出反应。

现在我需要为每个列表创建单独的类。他们每个人都有一个带有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),
                  ),
                );
              },
            );
          },
        ),
      ),
    ],
  );
}

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

【问题讨论】:

    标签: list flutter state-management


    【解决方案1】:

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

    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
      }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 2023-02-06
      • 1970-01-01
      • 2015-07-13
      相关资源
      最近更新 更多