【问题标题】:Flutter: GetX - How navigate to different Views with same Controller class using Get.toNamed()?Flutter:GetX - 如何使用 Get.toNamed() 导航到具有相同控制器类的不同视图?
【发布时间】:2021-10-31 05:55:22
【问题描述】:

我正在尝试在以下代码中实现 GetX 导航:

import 'package:flutter/material.dart';
import 'package:get/get.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      initialRoute: '/',
      getPages: [
        GetPage(name: '/', page: () => HomeScreen()),
        GetPage(name: '/second', page: () => SecondScreen())
      ],
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
              onPressed: () => Get.toNamed('/second', arguments: 'A'),
              child: Text('Second Screen A')),
          ElevatedButton(
              onPressed: () => Get.toNamed('/second', arguments: 'B'),
              child: Text('Second Screen B'))
        ],
      ),
    ));
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var controller =
        Get.put(SecondScreenController(), tag: Get.arguments);
    return Scaffold(
        body: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text(controller.text),
          ElevatedButton(
              onPressed: () => Get.toNamed('/second',
                  arguments: controller.text == 'A' ? 'B' : 'A'),
              child: controller.text == 'A'
                  ? Text('Switch to other second screen B')
                  : Text('Switch to other second screen A'))
        ],
      ),
    ));
  }
}

class SecondScreenController extends GetxController {
  final text = Get.arguments;
}

HomeScreen 导航到SecondScreen 工作正常。只有当我在 SecondScreen 中时,我才能再次导航到同一个屏幕,用 不同 arguments'B''A')包含在 same 中控制器类。当放置控制器指定here时,我尝试使用tag属性,但它没有帮助。我的猜测是我的SecondScreen 根本不会重建,因为 Flutter 认为它(或附加的controller)已经存在。如何在路由方法Get.toNamed() 中指定tag 以告诉Flutter SecondScreen 需要重建?

也许我做的事情完全错误,而我想要实现的目标实际上是不同的。我很高兴得到任何建议和帮助!

【问题讨论】:

    标签: flutter navigation flutter-getx


    【解决方案1】:

    我不知道您为什么会出现一种奇怪的导航行为,即再次导航同一屏幕(/秒 -> / 秒)。但是,如果您坚持要这样做,默认情况下 Getx 会阻止您推送您已经进入的同一条路线。如果您仍然想推送,请将 [preventDuplicates] 设置为 false

    Get.toNamed('/second', arguments: controller.text == 'A' ? 'B' : 'A', preventDuplicates = false);
    

    对了,你也可以考虑使用Getx dynamic URLs来实现你的用例。

    Map<String, String> parameters = {
      'argument': 'A',
    };
    Get.toNamed('/second', arguments: controller.text == 'A' ? 'B' : 'A', preventDuplicates: false, parameters: parameters);
    
    // To retrieve the parameter in your next screen's controller
    final String argument = Get.parameters['argument']!;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多