Get current route name of CupertinoTabView in Flutter?

0

I'm using CupertinoTabScaffold and CupertinoTabView to build navigation bottom bar in my App. For one CupertinoTabView I go to others pushed routes name, I would like to get the current name of a CupertinoTabView, but I get Null

I define the routes in main like that

CupertinoApp(
        home: MyApp(),
        title: 'machin',
        routes: appRoutes,)

final appRoutes = {
  '/pushedName': (context) => PushedName(),
};

MyApp class //

final GlobalKey<NavigatorState> profileTabNavKey =
      GlobalKey<NavigatorState>();

 CupertinoTabScaffold(
          tabBar: CupertinoTabBar(

            activeColor: Color(0xff077018),
            border: Border.all(color: Color(0xffffffff)),
            currentIndex: widget.currentIndex,
            onTap: (index) {},
            items: <BottomNavigationBarItem>[....],
          ),
          tabBuilder: (BuildContext context, int index) {
            switch (index) {
              
     
              case 0:
                return CupertinoTabView(
                    navigatorKey: profileTabNavKey,
          
                     routes: appRoutes,
                    builder: (BuildContext context) =>
                  SettingsView());
                break;
              default:
                return HomePage();
            }
          },
        ),

In the SettingsView I pushed a named route by using

Navigator.pushNamed(context, '/pushedName')

I tried to get the route name in the my app class by using

print(ModalRoute.of(profileTabNavKey.currentContext).settings.name);

nb: in the pushedName View i get it perfectly any help , thanks in advance

flutter
dart
asked on Stack Overflow May 5, 2021 by Fatima ayaa • edited May 10, 2021 by John Brookfields

1 Answer

1

Just use the BuildContext from the build widget to get the ModalRoute data :

ModalRoute.of(context).settings.name

Working example :

import 'package:flutter/cupertino.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CupertinoApp(
      debugShowCheckedModeBanner: false,
      theme: CupertinoTheme.of(context).copyWith(
        brightness: Brightness.light,
      ),
      home: MainPage(),
    );
  }
}

class MainPage extends StatefulWidget {
  @override
  _MainPageState createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  int currentIndex = 0;
  @override
  Widget build(BuildContext context) {
    return CupertinoTabScaffold(
      tabBar: CupertinoTabBar(
        currentIndex: currentIndex,
        onTap: (index) {
          setState(() {
            currentIndex = index;
          });
        },
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            label: 'Home',
            icon: Icon(CupertinoIcons.home),
          ),
          BottomNavigationBarItem(
            label: 'Setting',
            icon: Icon(CupertinoIcons.settings),
          ),
        ],
      ),
      tabBuilder: (BuildContext context, int index) {
        switch (index) {
          case 1:
            return CupertinoTabView(
              routes: <String, WidgetBuilder>{
                '/setting': (context) => SettingsPage(),
                '/setting/2': (context) => SettingsPage(2),
                '/setting/2/3': (context) => SettingsPage(3),
              },
              builder: (context) => SettingsPage(),
            );
            break;
          default:
            return Center(
              child: Text('Home page'),
            );
        }
      },
    );
  }
}

class SettingsPage extends StatelessWidget {
  final int index;

  SettingsPage([this.index = 1]);

  @override
  Widget build(BuildContext context) {
    // here we go to get the current route name
    print(ModalRoute.of(context).settings.name);

    return CupertinoPageScaffold(
      navigationBar: CupertinoNavigationBar(
        backgroundColor: CupertinoColors.systemGrey.withOpacity(0.5),
        middle: Text(index > 1 ? 'Settings page - $index' : 'Settings page'),
      ),
      child: Center(
        child: CupertinoButton.filled(
          child: Text('Go'),
          onPressed: () {
            if (index == 1) {
              Navigator.pushNamed(context, '/setting/2');
            } else if (index == 2) {
              Navigator.pushNamed(context, '/setting/2/3');
            }
          },
        ),
      ),
    );
  }
}

Go to Dartpad

answered on Stack Overflow May 13, 2021 by Alann Maulana

User contributions licensed under CC BY-SA 3.0