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

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

这是最好的做法吗? (我使用这个Todo示例,因为这里更容易解释我的问题)

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

每个页面都有一个自己的Bloc。

脚步:

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

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

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

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

谢谢你的阅读。

EDIT1

  • 添加了我的临时解决方案,直到找到满足我的东西。
flutter bloc
2个回答
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');
  }
}

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
                ...
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.