Как в GetX правильно прописывать маршруты навигации в строке URL если использовать Flutter Web?

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

начну с main.dart, вот что я прописываю:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      enableLog: false,
      debugShowCheckedModeBanner: false,
      title: 'WebSite',
      theme: ThemeData(
        appBarTheme: AppBarTheme(
          centerTitle: false,
        ),
        brightness: Brightness.light,
        primarySwatch: Colors.teal,
        primaryColor: Colors.white,
        accentColor: Colors.teal[900],
      ),
      darkTheme: ThemeData(
        appBarTheme: AppBarTheme(
          centerTitle: false,
        ),
        brightness: Brightness.dark,
        primarySwatch: Colors.teal,
        primaryColor: Colors.grey[800],
        accentColor: Colors.teal[900],
      ),
      getPages: PageList.list,
      initialRoute: "/",
    );
  }
}

в PageList.list я храню маршруты навигации:

class PageList {
  static List<GetPage> list = [
    GetPage(
      name: "/",
      page: () => Home(),
      binding: HomeBinding(),
      transition: Transition.noTransition,
    ),
    GetPage(
      name: "/profile",
      page: () => Container(),
      transition: Transition.noTransition,
    ),
    GetPage(
      name: "/favorites",
      page: () => Container(),
      transition: Transition.noTransition,
    ),
    GetPage(
      name: "/messages",
      page: () => Container(),
      transition: Transition.noTransition,
    ),
    GetPage(
      name: "/settings",
      page: () => Container(),
      transition: Transition.noTransition,
    ),
    GetPage(
      name: "/privacy",
      page: () => Container(),
      transition: Transition.noTransition,
    ),
    GetPage(
      name: "/about",
      page: () => Container(),
      transition: Transition.noTransition,
    ),
  ];
}

главный маршрут является Home(), и его контроллер - HomeController(),

Home:

class Home extends GetWidget<HomeController> {
  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async => true,
      child: Scaffold(
        appBar: AppBar(
          leading: IconButton(
            icon: Icon(Icons.menu),
            onPressed: controller.sideBarVisibleIO,
          ),
        ),
        body: Container(
          child: Row(
            children: [
              Obx(() {
                if (controller.sideBarVisible) {
                  return Drawer(
                    elevation: 5,
                    child: ListView(
                      children: [
                        Column(
                          mainAxisSize: MainAxisSize.min,
                          children: List.generate(
                            controller.navigationItems.length,
                            (index) => ListTile(
                              onTap: () => controller.selectItem(index),
                              leading: controller.navigationItems[index].icon,
                              title: Text(
                                controller.navigationItems[index].label,
                                style: controller.currentScreen == index
                                    ? TextStyle(
                                        fontWeight: FontWeight.bold,
                                      )
                                    : null,
                              ),
                              trailing: controller.currentScreen == index
                                  ? Icon(Icons.arrow_forward_ios_sharp)
                                  : null,
                            ),
                          ),
                        ),
                      ],
                    ),
                  );
                } else {
                  return Container();
                }
              }),
              Expanded(
                child: Center(
                  child: controller
                      .navigationItems[controller.currentScreen].screen,
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

HomeController:

class HomeController extends GetxController {
  RxBool _sideBarVisible = true.obs;

  RxInt _currentScreen = 0.obs;

  Rx<GlobalKey<NavigatorState>> naviKey = Rx<GlobalKey<NavigatorState>>();
  var key = Get.key;

  set setScreen(int value) => this._currentScreen.value = value;

  List<NavigationItem> navigationItems = [
    NavigationItem(
      routeName: "/",
      icon: Icon(Icons.library_books_sharp),
      label: "Главное",
      screen: Container(
        child: Center(child: Text("Главное")),
      ),
    ),
    NavigationItem(
      routeName: "/profile",
      icon: Icon(Icons.store_sharp),
      label: "Личный кабинет",
      screen: Container(
        child: Center(child: Text("Мои объявления")),
      ),
    ),
    NavigationItem(
      routeName: "/favorites",
      icon: Icon(Icons.bookmarks_sharp),
      label:"Избранные",
      screen: Container(
        child: Center(child: Text("Избранные")),
      ),
    ),
    NavigationItem(
      routeName: "/messages",
      icon: Icon(Icons.message_sharp),
      label: "Сообщения",
      screen: Container(
        child: Center(child: Text("Сообщения")),
      ),
    ),
    NavigationItem(
      routeName: "/settings",
      icon: Icon(Icons.settings),
      label: "Настройки",
      screen: Container(
        child: Center(child: Text("Настройки")),
      ),
    ),
    NavigationItem(
      routeName: "/privacy",
      icon: Icon(Icons.privacy_tip_sharp),
      label: "Политика конфиденциальности",
      screen: Container(
        child: Center(child: Text("Политика конфиденциальности")),
      ),
    ),
    NavigationItem(
      routeName: "/about",
      icon: Icon(
        Icons.info_sharp,
      ),
      label: "О приложении",
      screen: Container(
        child: Center(child: Text("О приложении")),
      ),
    ),
  ];

  bool get sideBarVisible => _sideBarVisible?.value;

  int get currentScreen => _currentScreen.value;

  void sideBarVisibleIO() {
    _sideBarVisible.value = !_sideBarVisible.value;
  }

  void selectItem(int screen) {
    _currentScreen.value = screen;
  }
}

введите сюда описание изображения

Вопрос, как при выборе, например, "Сообщения" прописывать в адресной строке браузера (URL) "/messages" и внутри этого виджета если выбрать какой нибудь элемент прописывать как "/messages/item1" для того чтобы можно было строку скопировать и вставлять в других браузерах и он открывался на этом же месте, и еще чтобы в истории браузера каждый переход хранился отдельно для того чтобы при переходе назад браузер знал какая ссылка была ранее?


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