Дизайн Flutter Bloc - информировать страницы об изменениях - PullRequest
0 голосов
/ 24 марта 2019

есть ли лучшая практика для этого? (Я использую этот пример Todo, так как здесь легче объяснить мою проблему)

  1. TodoOverviewPage (Показывает все задачи)
  2. TodoAddPage (Страница для добавления задач)

У каждой страницы есть свой блок.

Шаги:

  1. На странице TodoOverview я перехожу с pushNamed на TodoAddPage.
  2. В TodoAddPage я добавляю несколько Todo.
  3. Использование кнопки Назад для возврата на страницу TodoOverviewPage

Вопрос: Как мне сообщить TodoOverviewPage, что появились новые Todos?

Мои подходы, в которых я не уверен, что это правильный путь. Решения:

  1. Перезапись кнопки «Назад» в TodoAddPage. Чтобы добавить свойство «refresh = true».
  2. Добавление блока из TodoOverviewPage в TodoAddPage. И установив State для чего-то, что TodoOverviewPage перезагрузит задачи после сборки.

Спасибо за чтение.

EDIT1:

  • Добавил мое временное решение, пока я не найду что-то, что меня больше удовлетворяет.

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Вы можете достичь другим способом

  1. InheritedWidget
  2. ValueCallback в TodoAddPage

Например:

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 голосов
/ 25 марта 2019

Временное решение:

Каждая (корневая) страница с блоком теперь всегда перезагружается при сборке.

Блок заботится о кэшировании.

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