Getx
https://pub.flutter-io.cn/pac...
vscode 插件
Android Studio/Intellij 插件
本节指标GetPage 对象路由层级管制路由中间件、鉴权404 解决路由跳转、替换、革除路由传值、返回值路由转场动画开发环境Flutter 2.1.0-12.1.preDart 2.13.0get: ^3.26.0参考getx examplegetx_patternGetX Snippets视频https://www.bilibili.com/vide...
代码https://github.com/ducafecat/...
注释初始 getx 我的项目pubspec.yamldependencies: ... get: ^3.26.0lib/pages/home/index.dartimport 'package:flutter/material.dart';import 'package:get/get.dart';class HomeView extends StatelessWidget { const HomeView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("首页"), ), body: ListView( children: [ // 路由&导航 Divider(), ], ), ); }}lib/common/routes/app_routes.dartpart of 'app_pages.dart';abstract class AppRoutes { static const Home = '/home';}lib/common/routes/app_pages.dartimport 'package:get/get.dart';part 'app_routes.dart';class AppPages { static const INITIAL = AppRoutes.Home; static final routes = [ GetPage( name: AppRoutes.Home, page: () => HomeView(), ), ];}lib/main.dartFuture<void> main() async { runApp(MyApp());}class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return GetMaterialApp( debugShowCheckedModeBanner: false, initialRoute: AppPages.INITIAL, getPages: AppPages.routes, ); }}编写 GetPage 定义lib/pages/list/index.dartclass ListView extends StatelessWidget { const ListView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("列表页"), ), ); }}lib/pages/list_detail/index.dartclass DetailView extends StatelessWidget { const DetailView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("详情页"), ), body: ListView( children: [ ListTile( title: Text("导航-返回"), subtitle: Text('Get.back()'), onTap: () => Get.back(), ), ], ), ); }}lib/common/routes/app_routes.dartabstract class AppRoutes { static const Home = '/home'; static const List = '/list'; static const Detail = '/detail';lib/common/routes/app_pages.dart GetPage( name: AppRoutes.Home, page: () => HomeView(), children: [ GetPage( name: AppRoutes.List, page: () => ListView(), children: [ GetPage( name: AppRoutes.Detail, page: () => DetailView(), ), ], ), ], ),导航操作 命名、视图对象lib/pages/home/index.dart ListTile( title: Text("导航-命名路由 home > list"), subtitle: Text('Get.toNamed("/home/list")'), onTap: () => Get.toNamed("/home/list"), ), ListTile( title: Text("导航-命名路由 home > list > detail"), subtitle: Text('Get.toNamed("/home/list/detail")'), onTap: () => Get.toNamed("/home/list/detail"), ), ListTile( title: Text("导航-类对象"), subtitle: Text("Get.to(DetailView())"), onTap: () => Get.to(DetailView()), ),导航-革除上一个lib/pages/home/index.dart ListTile( title: Text("导航-革除上一个"), subtitle: Text("Get.off(DetailView())"), onTap: () => Get.off(DetailView()), ),导航-革除所有lib/pages/home/index.dart ListTile( title: Text("导航-革除所有"), subtitle: Text("Get.offAll(DetailView())"), onTap: () => Get.offAll(DetailView()), ),导航-arguments 传值+返回值lib/pages/home/index.dart ListTile( title: Text("导航-arguments传值+返回值"), subtitle: Text( 'Get.toNamed("/home/list/detail", arguments: {"id": 999})'), onTap: () async { var result = await Get.toNamed("/home/list/detail", arguments: {"id": 999}); Get.snackbar("返回值", "success -> " + result["success"].toString()); }, ),lib/pages/list_detail/index.dart _buildBackListTileRow(Map? val) { return val == null ? Container() : ListTile( title: Text("传值 id = " + val["id"].toString()), subtitle: Text('Get.back(result: {"success": true}'), onTap: () => Get.back(result: {"success": true}), ); } @override Widget build(BuildContext context) { final details = Get.arguments as Map; final parameters = Get.parameters; return Scaffold( appBar: AppBar( title: Text("详情页"), ), body: ListView( children: [ ListTile( title: Text("导航-返回"), subtitle: Text('Get.back()'), onTap: () => Get.back(), ), _buildBackListTileRow(details), _buildBackListTileRow(parameters), ], ), ); }导航-parameters 传值+返回值lib/pages/home/index.dart ListTile( title: Text("导航-parameters传值+返回值"), subtitle: Text('Get.toNamed("/home/list/detail?id=666")'), onTap: () async { var result = await Get.toNamed("/home/list/detail?id=666"); Get.snackbar("返回值", "success -> " + result["success"].toString()); }, ),lib/pages/list_detail/index.dart @override Widget build(BuildContext context) { final parameters = Get.parameters;导航-参数传值+返回值lib/common/routes/app_routes.dart static const Detail_ID = '/detail/:id';lib/common/routes/app_pages.dart ... GetPage( name: AppRoutes.Detail_ID, page: () => DetailView(), ),lib/pages/home/index.dart ListTile( title: Text("导航-参数传值+返回值"), subtitle: Text('Get.toNamed("/home/list/detail/777")'), onTap: () async { var result = await Get.toNamed("/home/list/detail/777"); Get.snackbar("返回值", "success -> " + result["success"].toString()); }, ),导航-not foundlib/pages/notfound/index.dartclass NotfoundView extends StatelessWidget { const NotfoundView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("路由没有找到"), ), body: ListTile( title: Text("返回首页"), subtitle: Text('Get.offAllNamed(AppRoutes.Home)'), onTap: () => Get.offAllNamed(AppRoutes.Home), ), ); }}lib/common/routes/app_routes.dart static const NotFound = '/notfound';lib/common/routes/app_pages.dart static final unknownRoute = GetPage( name: AppRoutes.NotFound, page: () => NotfoundView(), );lib/main.dart @override Widget build(BuildContext context) { return GetMaterialApp( ... unknownRoute: AppPages.unknownRoute, ); }导航-中间件-认证 Authlib/pages/login/index.dartclass LoginView extends StatelessWidget { const LoginView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("登录"), ), body: ListTile( title: Text("返回首页"), subtitle: Text('Get.offAllNamed(AppRoutes.Home)'), onTap: () => Get.offAllNamed(AppRoutes.Home), ), ); }}lib/pages/my/index.dartclass MyView extends StatelessWidget { const MyView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("我的"), ), body: ListTile( title: Text("返回首页"), subtitle: Text('Get.offAllNamed(AppRoutes.Home)'), onTap: () => Get.offAllNamed(AppRoutes.Home), ), ); }}lib/common/routes/app_routes.dart static const Login = '/login'; static const My = '/my';lib/common/middleware/router_auth.dartclass RouteAuthMiddleware extends GetMiddleware { @override int priority = 0; RouteAuthMiddleware({required this.priority}); @override RouteSettings? redirect(String route) { Future.delayed(Duration(seconds: 1), () => Get.snackbar("提醒", "请先登录APP")); return RouteSettings(name: AppRoutes.Login); }}lib/common/routes/app_pages.dart // 白名单 GetPage( name: AppRoutes.Login, page: () => LoginView(), ), GetPage( name: AppRoutes.My, page: () => MyView(), middlewares: [ RouteAuthMiddleware(priority: 1), ], ),lib/pages/home/index.dart ListTile( title: Text("导航-中间件-认证Auth"), subtitle: Text('Get.toNamed(AppRoutes.My)'), onTap: () => Get.toNamed(AppRoutes.My), ),Transition 转场动画lib/common/routes/app_pages.dart GetPage( name: AppRoutes.Detail_ID, page: () => DetailView(), transition: Transition.downToUp, ),© 猫哥
...