[FLUTTER]: Как изменять Нижний ТабБар программно из Второго Экрана в Первый и наоборот?

Всем привет. Не могу понять, как программно получать доступ к телу _CustomNavigatorState класса CustomNavigator чтобы переключать ТабБар из Первой страницы (FirstScreen) на Вторую (SecondScreen) и наоборот. Как это сделать. Мой main.dart файл:

import 'package:flutter/material.dart';
import './screens/custom_navigator.dart';

void main() async {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
       title: 'App Name',
       home: CustomNavigator(),
    );
  }
}

Мой CustomNavigator Стейтфул класс, в котором мой приватный _CustomNavigatorState класс, где и меняется ТабБар с помощью Offstage.

import 'package:flutter/material.dart';

import './first_second.dart';
import './second_screen.dart';
import './third_screen.dart';

import '../widgets/tab_navigator.dart';

class CustomNavigator extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _CustomNavigatorState();
}

class _CustomNavigatorState extends State<CustomNavigator> {
  String _currentScreen = FirstScreen.route;
  List<String> _screenKeys = [
    FirstScreen.route,
    SecondScreen.route,
    ThirdScreen.route,
  ];
  Map<String, GlobalKey<NavigatorState>> _navigatorKeys = {
    FirstScreen.route: GlobalKey<NavigatorState>(),
    SecondScreen.route: GlobalKey<NavigatorState>(),
    ThirdScreen.route: GlobalKey<NavigatorState>(),
  };
  int _selectedIndex = 0;

  void changeTab(String tabItem, int index) {
    _selectedTab(tabItem, index);
  }

  void _selectedTab(String tabItem, int index) {
    if (tabItem == _currentScreen) {
      _navigatorKeys[tabItem].currentState.popUntil((route) => route.isFirst);
    } else {
      setState(() {
        _currentScreen = _screenKeys[index];
        _selectedIndex = index;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async {
        final isFirstRouteInCurrentTab =
            !await _navigatorKeys[_currentScreen].currentState.maybePop();
        if (isFirstRouteInCurrentTab) {
          if (_currentScreen != FirstScreen.route) {
            _selectedTab(FirstScreen.route, 1);
            return false;
          }
        }
        return isFirstRouteInCurrentTab;
      },
      child: Scaffold(
        resizeToAvoidBottomPadding: true,
        body: Stack(
          children: [
            _buildOffstageNavigator(FirstScreen.route),
            _buildOffstageNavigator(ScreenScreen.route),
            _buildOffstageNavigator(ThirdScreen.route),
          ],
        ),
        bottomNavigationBar: BottomNavigationBar(
          onTap: (index) {
            _selectedTab(_screenKeys[index], index);
          },
          currentIndex: _selectedIndex,
          items: [
            BottomNavigationBarItem(
              label: 'First',
            ),
            BottomNavigationBarItem(
              label: 'Second',
            ),
            BottomNavigationBarItem(
              label: 'Third',
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildOffstageNavigator(String tabItem) {
    return Offstage(
      offstage: _currentScreen != tabItem,
      child: TabNavigator(
        navigatorKey: _navigatorKeys[tabItem],
        tabItem: tabItem,
      ),
    );
  }
}

TabNavigator класс где я подключаю мои Три Страницы (FirstScreen, SecondScreen, ThirdScreen).

import 'package:flutter/material.dart';

import '../screens/first_screen.dart';
import '../screens/second_screen.dart';
import '../screens/third_screen.dart';

class TabNavigator extends StatelessWidget {
  final GlobalKey<NavigatorState> navigatorKey;
  final String tabItem;

  const TabNavigator({
    Key key,
    this.navigatorKey,
    this.tabItem,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    Widget child;

    if (tabItem == FirstScreen.route) {
      child = FirstScreen();
    } else if (tabItem == SecondScreen.route) {
      child = SecondScreen();
    } else if (tabItem == ThirdScreen.route) {
      child = ThirdScreen();
    }

    return Navigator(
      key: navigatorKey,
      onGenerateRoute: (routeSettings) {
        return MaterialPageRoute(
          builder: (context) => child,
        );
      },
    );
  }
}

Мне нужно, скажем, из SecondScreen программно, переключить ТабБар в FirstScreen. Не могу понять, как это сделать? Делаю это через:

Navigator.of(context).push(
   MaterialPageRoute(
     builder: (_) => SecondScreen(),
   ),
);
Navigator.of(context).pushNamed(SecondScreen.route);

У меня сам ТабБар не переключается, хотя я попадаю в нужную страницу, но страница появляется в том же Stack-е. А должно переключаться сам ТабБар. Надеюсь, что предложите пути решения. Спасибо:)


Ответы (0 шт):