Flutter Appbar (действия) с дочерними вкладками

Я новичок во Flutter, и мне интересно, можете ли вы помочь мне найти решение моей проблемы.

У меня есть эшафот с вкладками, и я хочу сделать фильтр (кнопка действий) на главной панели приложений для управления вкладками.

И основной, и дочерний - это StatefulWidgets

вот мой код главной страницы:

Widget body = TabBarView(
      controller: tabController,
      children: <Widget>[
        new First(filter: filter),
        new Second(filter: filter);
        new Third(filter: filter);
      ],
    );
return Scaffold(
    appBar: AppBar(
           actions:[IconButton(icon: Icon(MdiIcons.filter),onPressed: 
           () {
              // Send info to child 
           })],
           bottom: new TabBar(
           controller: tabController,
           tabs: <Tab>[
             new Tab(text:"Tab1"),
             new Tab(text:"Tab2"),
             new Tab(text:"Tab3")
           ],
    body: new Builder(builder: (BuildContext context) {
      _scaffoldContext = context;
      return body;
    }));
));

Детская страница:

Widget body = Text("Filter name here");
return Scaffold(
  body: 
  new Builder(
    builder: (context) {
      snack = new DisplaySnackBar(context: context);
      return body;
    }),
);
}

Я не знаю, где разместить действия панели приложений, чтобы текст в теле ребенка изменялся с главной страницы.


person Simo.J    schedule 08.12.2018    source источник
comment
какой у вас - Первый (фильтр: фильтр),?   -  person anmol.majhail    schedule 08.12.2018
comment
Первый (filer: filter) - это первый дочерний элемент (Tab) class First extends StatefulWidget { final String filter; First({Key key, @required this.filter}) : super(key: key); @override FirstState createState() => FirstState(); }   -  person Simo.J    schedule 08.12.2018
comment
Какую информацию вы хотите отправить?   -  person anmol.majhail    schedule 09.12.2018
comment
Я хочу отправлять информацию (в данном случае строку) из диалогового окна alerttdialog в основном представлении (представление вкладок). AlertDialog взят из основного каркаса. Я обновил строку и отправил ее на вкладку, но не могу обновить вкладку, чтобы показать новое значение.   -  person Simo.J    schedule 09.12.2018


Ответы (1)


Я нашел решение, сделав свой родительский виджет InheritedWidget, чтобы я мог получить доступ к его данным из дочернего элемента.

Вот пример:

class MyStatefulWidget extends StatefulWidget{
@override
  MyStatefulWidgetState createState() => MyStatefulWidgetState();

  static MyStatefulWidgetState of(BuildContext context){
    return (context.inheritFromWidgetOfExactType(_MyInheritedStateContainer) as _MyInheritedStateContainer).data;
  }
}
class MyStatefulWidgetState extends State<MyStatefulWidget>{

String variableCalledHello = "Hello World";
@override
  void initState() {
    super.initState();
  }
 @override
  Widget build(BuildContext context) {
   return new _MyInheritedStateContainer(data:this,child:/* Body here */);
  }
}
class _MyInheritedStateContainer extends InheritedWidget{
    _MyInheritedStateContainer({
Key key,
    @required Widget child,
    @required this.data,
  }) : super(key: key, child: child);

final MyStatefulWidgetState data;

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

и для каждого ребенка:

тебе просто нужно позвонить MyStatefulWidgetState state = MyStatefulWidgetState.of(context);

пример :

@override
  Widget build(BuildContext context) {
   MyStatefulWidgetState state = MyStatefulWidgetState.of(context);

   print(state.variableCalledHello);

   return /* Container ... */;

}

Надеюсь, что это поможет кому-то решить его проблему.

Спасибо.

person Simo.J    schedule 25.12.2018