Flutter之GetX之路由管理

发布时间 2023-04-05 14:16:43作者: R1cardo

GetX之路由管理

GetX有一套完整的路由管理,并且不需要context上下文,API非常简洁

直接导航

导航到新的页面

Get.to(NextScreen());

返回,此方法可以用于关闭SnackBars、Dialogs、BottomSheets或任何你通常会用Navigator.pop(context)关闭的东西。

Get.back();

进入下一个页面并将上一个页面移除

Get.off(NextScreen());

进入下一个页面并将之前所有的路由移除

Get.offAll(NextScreen());

带参数

从A页面到B页面

Get.to(B(), arguments: "data")

在B页面接收参数

final data = Get.parameters

回传数据到A页面

Get.back(result: "result")

在A页面接收从B页面传回来的数据,因为Get.to本身是一个Future,可以通过await或者.then方法获取

final res = await Get.to(const WNEmptyPage());

或者

Get.to(const WNEmptyPage())?.then((value) { print(value); });

和原生API的对比


// 默认的Flutter导航
Navigator.of(context).push(
  context,
  MaterialPageRoute(
    builder: (BuildContext context) {
      return HomePage();
    },
  ),
);

// 使用Flutter语法获得,而不需要context。
navigator.push(
  MaterialPageRoute(
    builder: (_) {
      return HomePage();
    },
  ),
);

// get语法 (这要好得多)
Get.to(HomePage());

别名导航

可以创建一个路由表,给每一个页面创建一个别名

通过在GetMaterialAppgetPage添加

void main() {
  runApp(
    GetMaterialApp(
      initialRoute: '/',
      getPages: [
        GetPage(name: 'homePage', page: () => MyHomePage()),
      ],
    )
  );
}

也可以在onGenerateRoute中定义

onGenerateRoute: (settings) {
              final args = settings.arguments;
              switch (settings.name) {
                case "homePage":
                  return CupertinoPageRoute(
                      builder: (BuildContext context) => MyHomePage(),
                      settings: settings);
              }
            }           

此回调会带有一个setting参数,可以在里面获取对应路由的别名,传进来的参数等

使用就直接在之前的API上加上Named后缀

Get.to对应
Get.toNamed("/NextScreen");

Get.off对应
Get.offNamed("/NextScreen");

Get.offAll对应
Get.offAllNamed("/NextScreen");

如果找不到对应别名的路由,可能没有在路由表中没有注册,就可以在GetMaterialApp定义一个unknownPage

unknownRoute: GetPage(name: 'unknownPage', page: () => const UnknownPage())

或者是通过回调的方式

onUnknownRoute: (settings) {
    return CupertinoPageRoute(
                   builder: (BuildContext context) => const UnknownPage(),
                      settings: settings); 
}

传输数据也是差不多的

Get.toNamed("/NextScreen", arguments: 'Get is the best');

print(Get.arguments);
//Get is the best