Getx

https://pub.flutter-io.cn/pac...

vscode 插件

Android Studio/Intellij 插件

本节指标

  • GetPage 对象
  • 路由层级管制
  • 路由中间件、鉴权
  • 404 解决
  • 路由跳转、替换、革除
  • 路由传值、返回值
  • 路由转场动画

开发环境

  • Flutter 2.1.0-12.1.pre
  • Dart 2.13.0
  • get: ^3.26.0

参考

  • getx example
  • getx_pattern
  • GetX Snippets

视频

https://www.bilibili.com/vide...

代码

https://github.com/ducafecat/...

注释

初始 getx 我的项目

  • pubspec.yaml
dependencies:  ...  get: ^3.26.0
  • lib/pages/home/index.dart
import '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.dart
part of 'app_pages.dart';abstract class AppRoutes {  static const Home = '/home';}
  • lib/common/routes/app_pages.dart
import '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.dart
Future<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.dart
class 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.dart
class 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.dart
abstract 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 found

  • lib/pages/notfound/index.dart
class 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,    );  }

导航-中间件-认证 Auth

  • lib/pages/login/index.dart
class 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.dart
class 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.dart
class 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,  ),

© 猫哥

https://ducafecat.tech