如何使用 Getx 在 Flutter 中呈现具有不同转换(推送/模态)的页面?

sar*_*unw 7 flutter flutter-getx

我有一个页面,可以根据该页面的启动位置以两种方式呈现:模态和推送。

我曾经toNamed展示这些页面,但问题是我无法fullscreenDialog在调用站点传递标志。我期待这样的事情:

Get.toNamed('pageName', fullscreenDialog: false);
Run Code Online (Sandbox Code Playgroud)

那么,这种工作我需要两条路线和两个页面吗?像这样的东西:

GetPage(
  name: 'pageNameDialog',
  page: () => QuestionPage(),
  fullscreenDialog: true,
  binding: QuestionBinding(),
),

GetPage(
  name: 'pageNamePush',
  page: () => QuestionPage(),
  fullscreenDialog: false,
  binding: QuestionBinding(),
),
Run Code Online (Sandbox Code Playgroud)

我认为这应该是一个更好的方法,但我对 Flutter 和 getx 真的很陌生,不知道我应该搜索什么。有人有解决方案吗?否则,我可能不得不加倍我的路线和页面,这是相当多余的。

Nir*_*shi 6

创建一个这样的类

class Go {
  /// Similar to **Navigation.push()**
  static Future<T?> to<T>(dynamic page, {dynamic arguments, Transition? transition, bool? opaque}) async {
    return await Get.to<T>(page,
        arguments: arguments,
        transition: transition ?? Transition.rightToLeft,
        duration: const Duration(milliseconds: 350),
        opaque: opaque);
  }

  /// Similar to **Navigation.pushReplacement**
  static Future<dynamic> off(dynamic page, {dynamic arguments, Transition? transition}) async {
    Get.off(
      page,
      arguments: arguments,
      transition: transition ?? Transition.rightToLeft,
      duration: const Duration(milliseconds: 350),
    );
  }

  /// Similar to **Navigation.pushAndRemoveUntil()**
  static Future<dynamic> offUntil(dynamic page, {Transition? transition}) async {
    Get.offUntil(
        GetPageRoute(
          page: page,
          transition: transition ?? Transition.rightToLeft,
          transitionDuration: const Duration(milliseconds: 350),
        ),
        (route) => false);
  }
}

Run Code Online (Sandbox Code Playgroud)

然后在你的视图或控制器中

// BEST PRACTICE
// you can pass any object. 
var args = {'data': 'data that you want to pass'};
Go.to(() => const HomeView(), arguments: args);
Run Code Online (Sandbox Code Playgroud)

现在要获取您传递的值,HomeView请使用下面的代码。

class HomeController extends GetxController {

  @override
  void onInit() async {
    super.onInit();

    var args = Get.arguments['data'];
    
    // ... 

  }
}


Run Code Online (Sandbox Code Playgroud)

类似的方法也适用于其他人。


Kri*_*ali 0

您可以将标志作为参数传递,如下所示:

Get.toNamed('pageName', arguments: true);
Run Code Online (Sandbox Code Playgroud)

在您要去的页面上,您可以点击:

Get.arguments;
Run Code Online (Sandbox Code Playgroud)

这将在 pageName 上返回 true。

现在,参数参数类型是动态的,因此您可以传递任何参数,如果您想要多个参数,也可以传递 List 或 Map。

希望这是您想要实现的目标。