0

对此有最佳做法吗?(我使用这个 Todo 示例,因为它更容易在这里解释我的问题)

  1. TodoOverviewPage(显示所有待办事项)
  2. TodoAddPage(添加待办事项的页面)

每个页面都有自己的 Bloc。

脚步:

  1. 从 TodoOverviewPage 我将 wuth pushNamed 导航到 TodoAddPage。
  2. 在 TodoAddPage 我添加了几个 Todos。
  3. 使用导航返回按钮返回 TodoOverviewPage

问题:我应该如何通知 TodoOverviewPage 有新的 Todos?

我不确定这是否是正确的方法。解决方案:

  1. 覆盖 TodoAddPage 中的后退按钮。添加“刷新=真”属性。
  2. 将 Bloc 从 TodoOverviewPage 添加到 TodoAddPage。并将状态设置为 TodoOverviewPage 将在构建后重新加载待办事项。

感谢您的阅读。

编辑1:

  • 添加我的临时解决方案,直到我找到更让我满意的东西。
4

2 回答 2

1

您可以通过不同的方式实现

  1. 继承小部件
  2. TodoAddPage 中的 ValueCallback

例如:

class Item {
   String reference;

   Item(this.reference);
}

class _MyInherited extends InheritedWidget {
  _MyInherited({
    Key key,
    @required Widget child,
    @required this.data,
  }) : super(key: key, child: child);

  final MyInheritedWidgetState data;

  @override
  bool updateShouldNotify(_MyInherited oldWidget) {
    return true;
  }
}

class MyInheritedWidget extends StatefulWidget {
  MyInheritedWidget({
    Key key,
    this.child,
  }): super(key: key);

  final Widget child;

  @override
  MyInheritedWidgetState createState() => new MyInheritedWidgetState();

  static MyInheritedWidgetState of(BuildContext context){
    return (context.inheritFromWidgetOfExactType(_MyInherited) as _MyInherited).data;
  }
}

class MyInheritedWidgetState extends State<MyInheritedWidget>{
  /// List of Items
  List<Item> _items = <Item>[];

  /// Getter (number of items)
  int get itemsCount => _items.length;

  /// Helper method to add an Item
  void addItem(String reference){
    setState((){
      _items.add(new Item(reference));
    });
  }

  @override
  Widget build(BuildContext context){
    return new _MyInherited(
      data: this,
      child: widget.child,
    );
  }
}

class MyTree extends StatefulWidget {
  @override
  _MyTreeState createState() => new _MyTreeState();
}

class _MyTreeState extends State<MyTree> {
  @override
  Widget build(BuildContext context) {
    return new MyInheritedWidget(
      child: new Scaffold(
        appBar: new AppBar(
          title: new Text('Title'),
        ),
        body: new Column(
          children: <Widget>[
            new WidgetA(),
            new Container(
              child: new Row(
                children: <Widget>[
                  new Icon(Icons.shopping_cart),
                  new WidgetB(),
                  new WidgetC(),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class WidgetA extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final MyInheritedWidgetState state = MyInheritedWidget.of(context);
    return new Container(
      child: new RaisedButton(
        child: new Text('Add Item'),
        onPressed: () {
          state.addItem('new item');
        },
      ),
    );
  }
}

class WidgetB extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final MyInheritedWidgetState state = MyInheritedWidget.of(context);
    return new Text('${state.itemsCount}');
  }
}

class WidgetC extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Text('I am Widget C');
  }
}
于 2019-03-24T14:40:46.697 回答
0

临时解决方案:

每个具有 Bloc 的(根)页面现在总是在构建时重新加载。

Bloc 负责缓存。

Widget build(BuildContext context) {
    final PageBloc pBloc = BlocProvider.of<PageBloc >(context);
    bool isNewBuild = true;

    return Scaffold(
    ...
        body: BlocBuilder<PageBlocEvent, PageBlocState>(
            if (isNewBuild) {
                pBloc.dispatch(PageBlocEvent(PageBlocEventType.GETALL));
                isNewBuild = false;
                return CircularProgressIndicator();
            } else {
                // Draw data
                ...
    ...
}
于 2019-03-25T11:09:31.010 回答