Как в 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" для того чтобы можно было строку скопировать и вставлять в других браузерах и он открывался на этом же месте, и еще чтобы в истории браузера каждый переход хранился отдельно для того чтобы при переходе назад браузер знал какая ссылка была ранее?
