【问题标题】:getting query parameter on initial route flutter获取初始路由颤动的查询参数
【发布时间】:2021-06-28 07:30:39
【问题描述】:

我正在开发一个主要用于网络的颤振应用程序,但我无法添加/获取查询 来自URL的参数,查询参数将包含一个id,这个id应该在app内部使用

这是我在应用状态下的路线设置:

  return MaterialApp(navigatorKey: key,  initialRoute: '/main',
        routes: {
          // When navigating to the "/" route, build the FirstScreen widget.
          '/main': (context) => Map_View(),
          // When navigating to the "/second" route, build the SecondScreen widget.
          '/second': (context) => TaskClosed(),
        },onGenerateRoute: RouteGenerator.generateRoute,);
  }


  class RouteGenerator{
    
      static Route<dynamic> generateRoute(RouteSettings settings){
        final args = settings.arguments;
        print(args);
        var routingData = settings.name;
      }}

settings.arguments 始终为空

那么我应该将什么传递给 initialRoute 以使其在第一个屏幕上接受参数 例如,调用 URL 应该是这样的:

https:example.com/main?123

那么如何从 URL 中获取这个参数

【问题讨论】:

标签: flutter dart web routes query-parameters


【解决方案1】:

我试过这段代码:

class RouteGenerator {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    String? route;
    Map? queryParameters;
    if (settings.name != null) {
      var uriData = Uri.parse(settings.name!);
      route = uriData.path;
      queryParameters = uriData.queryParameters;
    }
    var message =
        'generateRoute: Route $route, QueryParameters $queryParameters';
    print(message);
    return MaterialPageRoute(
      builder: (context) {
        return MyHomePage(title: message);
      },
      settings: settings,
    );
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Test App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      initialRoute: '/main',
      routes: {
        // '/': (context) {
        //   print('route: /');
        //   return MyHomePage(title: 'Home');
        // },
        '/main': (context) {
          print('route: /main');
          return MyHomePage(title: 'route: Main');
        },
        '/second': (context) {
          print('route: /second');
          return MyHomePage(title: 'route: Second');
        },
      },
      onGenerateRoute: RouteGenerator.generateRoute,
    );
  }
}

当我使用 URL http://localhost:55260/#/main?123 运行应用程序时,我得到以下输出:

generateRoute: Route /, QueryParameters {}
generateRoute: Route /main, QueryParameters {123: }

屏幕显示/main,并且URL显示正确。

【讨论】:

    【解决方案2】:

    抱歉,我误解了剧情。这是我的建议

    删除routes

      return MaterialApp(navigatorKey: key,  initialRoute: '/main',
            //routes: {
              // When navigating to the "/" route, build the FirstScreen widget.
              //'/main': (context) => Map_View(),
              // When navigating to the "/second" route, build the SecondScreen widget.
              //'/second': (context) => TaskClosed(),
              // },
           onGenerateRoute: RouteGenerator.generateRoute,);
      }
    

    然后改变

    class RouteGenerator {
      static Route<dynamic> generateRoute(RouteSettings settings) {
        final args = settings.arguments;
        print(args);
        var routingData = settings.name;
        switch (routingData) {
          case "/main":
            return MaterialPageRoute(
              builder: (context) {
                return Map_View();
              },
              settings: settings,
            );
            break;
          case "/second":
            return MaterialPageRoute(
              builder: (context) {
                return TaskClosed();
              },
              settings: settings,
            );
            break;
          default:
            return MaterialPageRoute(
              builder: (context) {
                return YouUnKnowPage();
              },
              settings: settings,
            );
        }
      }
    }
    

    当您致电Navigator.of(context).pushNamed("/main",arguments:"123"); 它将移动到TaskClosed 并在控制台中打印123

    另外,如果你直接输入https:example.com/main?123之类的链接 它将导致YouUnKnowPage 而不是Map_View,并且参数将是null。尝试使用Navigator.of(context).pushNamed("/main",arguments:"123");

    如果你坚持直接输入链接,你可以试试这个

    class RouteGenerator {
      static Route<dynamic> generateRoute(RouteSettings settings) {
          String routingData;
          var arguments;
          if (settings.name != null) {
              routingData = settings.name;
          }
          final args = settings.arguments;
    
          if (args != null) {
              arguments = args;
          } else {
              Uri settingsUri = Uri.parse(settings.name);
              if (settingsUri.hasQuery) {
                arguments = "${settingsUri.queryParameters}";
              }
              if (settingsUri.pathSegments.length > 1) {
              routingData =
                 "/" + settingsUri.pathSegments[settingsUri.pathSegments.length - 1];
              }
          }
        if (arguments != null) {
          print(arguments);
        }
         switch (routingData) {
          case "/main":
            return MaterialPageRoute(
              builder: (context) {
                return Map_View();
              },
              settings: settings,
            );
            break;
          case "/second":
            return MaterialPageRoute(
              builder: (context) {
                return TaskClosed();
              },
              settings: settings,
            );
            break;
          default:
            return MaterialPageRoute(
              builder: (context) {
                return YouUnKnowPage();
              },
              settings: settings,
            );
        }
      }
    }
    

    现在它将移动到TaskClosed 并在控制台中打印{123:}

    【讨论】:

    • 是的,我试过这种方式,我可以得到网址和查询参数,但它不会显示在网址上,重新加载页面后也不会收到,我认为应该有办法在初始路由上从 RouteGenerator 接收它
    • 这不是一个实际的答案
    猜你喜欢
    • 2016-11-24
    • 2018-06-25
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2018-05-18
    • 2020-05-23
    • 1970-01-01
    • 2012-07-26
    相关资源
    最近更新 更多