Flutter Bloc Design-告知页面有关更改的信息

时间:2019-03-24 12:57:13

标签: flutter bloc

是否有最佳实践? (我正在使用此Todo示例,因为它在这里更容易解释我的问题)

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

每个页面都有自己的Bloc。

步骤:

  1. 从TodoOverviewPage中,我将pushNamed导航到TodoAddPage。
  2. 在TodoAddPage中,我添加了几个Todo。
  3. 使用导航后退按钮返回TodoOverviewPage

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

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

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

感谢您阅读。

EDIT1:

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

2 个答案:

答案 0 :(得分:1)

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

  1. InheritedWidget
  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');
  }
}

答案 1 :(得分: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
                ...
    ...
}