Флаттер, как изменить родительский индекс BottomNavigationBar из дочернего виджета - PullRequest
0 голосов
/ 08 февраля 2019

Итак, я недавно начал свой первый проект во флаттере, я выполнил полный макет пользовательского интерфейса и сейчас выполняю всю логическую часть внешнего интерфейса, большая часть моего поведения onTap работает, но я пришел к следующей ситуацииЯ не знаю, как решать.

У меня есть четыре файла, которые содержат весь пользовательский интерфейс.
widget0.dart
widget1.dart
widget2.dart

Каждый из этих файлов содержит StatefullWidget, который создается с помощью BottomNavigationBar.

main.dart
Этот файл содержит мой класс main () => runApp и функцию.Мой MaterialApp содержит эшафот с BottomNavigationBar.Это работает как задумано, и я могу переключаться между каждым из 3 виджетов.

Однако в моем файле widget0.dart у меня есть кнопка, которая должна изменить индекс BottomNavigationBar смой файл main.dart от 0 до 2 (для создания виджета из widget2.dart).

Я попытался обернуть значение, содержащее индекс для панели навигации, в отдельный статический класс, поэтому яможет setState((){ StaticClass.index = 2}) в кнопке onTap (), но это не работает, и фактически замораживает панель навигации к ее начальному значению.

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

Так какой же самый быстрый способ достичь моей цели?

Заранее спасибо.

1 Ответ

0 голосов
/ 08 февраля 2019

Вы можете передать функцию в качестве параметра в widget0, и в этой функции можно изменить значение индекса следующим образом:

class ParentWidgetState extends State<ParentWidget> {

  int _index = 0;

  void goToWidget2() {
    setState(() {
          _index = 2;
        });
  }

  Widget body() {
    switch(_index) {
      case 0: 
        return Widget0(goToWidget2);
        break;
      case 1: 
        return Widget1();
        break;
      case 2: 
        return Widget2();
        break;
    }
  }

  @override
    Widget build(BuildContext context) {
      return Scaffold(
        body: body(),
        bottomNavigationBar: BottomNavigationBar(
        currentIndex: _index,
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
          ),
        ],
      ),
      );
    }
}

class Widget0 extends StatelessWidget {
  Widget0(this.goToWidget2);
  final Function goToWidget2;
  @override
    Widget build(BuildContext context) {
      return Center(child: FlatButton(
        onPressed: goToWidget2,
        child: Text("Go To Widget 2"),
      ),);
    }
}
class Widget1 extends StatelessWidget {
  @override
    Widget build(BuildContext context) {
      return Center(child: Text("widget 1"),);
    }
}
class Widget2 extends StatelessWidget {
  @override
    Widget build(BuildContext context) {
      return Center(child: Text("widget 2"),);
    }
}
...