web-dev-qa-db-fra.com

Comment un itinéraire nommé peut-il avoir des paramètres d'URL dans Flutter Web?

Je suis en train de créer une application Web qui doit avoir un itinéraire qui obtient un ID de publication, puis il récupérera la publication à l'aide de l'ID.

Comment puis-je avoir des arguments URL disons /post/:id donc id est l'argument

Mon application ressemble à ça actuellement:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title: "Paste",
      initialRoute: "/",
      theme: ThemeData(
          primarySwatch: Colors.green,
          primaryColor: Colors.blue
      ),
      routes: {
        "/": (context) => HomePage(),
        "/post": (context) => PastieRoute()
      },
      debugShowCheckedModeBanner: false
    );
  }
}

EDIT: C'est ce que j'ai essayé selon @BloodLoss et pour quelque raison que ce soit, je n'obtiens rien sur la console lors de l'accès à localhost:8080/post?id=123

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: "/",
      routes: {
        "/": (context) => HomePage(),
        "/post": (context) => PastieRoute()
      },
      onGenerateRoute: (settings) {
        if (settings.name == "/post") {
          print(settings.arguments); // Doesn't fire :(

          return MaterialPageRoute(
            builder: (context) {
              // TODO
            }
          );
        }
      },
      debugShowCheckedModeBanner: false
    );
  }
}
9
TheOnlyArtz

Voilà comment je l'ai fait. Vous pouvez le modifier selon vos besoins. Si vous voulez utiliser? Q = alors utilisez le split by ou regex en conséquence

Voici l'exemple de la transmission de l'argument ainsi que de la transmission de l'url en tant que/topic /: id

  Route<dynamic> generateRoute(RouteSettings settings) {
  List<String> pathComponents = settings.name.split('/');
  final Map<String, dynamic> arguments = settings.arguments;
  switch ("/"+pathComponents[1]) {
    case shareTopicView:
      return MaterialPageRoute(
          builder: (context) => TopicPageLayout(topicID: pathComponents[2]));
    case internalTopicView:
      return MaterialPageRoute(
          builder: (context) => TopicPageLayout(topicID: arguments['topicID']));
    default:
      return MaterialPageRoute(builder: (context) => LandingPage());
  }
}
0
Dheeraj Sarwaiya

Et voici une autre façon de le faire:

Mon modèle d'URL: www.app.com/#/xLZppqzSiSxaFu4PB7Ui

onGenerateRoute: (settings) {
          List<String> pathComponents = settings.name.split('/');
          if (pathComponents[1] == 'invoice') {
            return MaterialPageRoute(
              builder: (context) {
                return Invoice(arguments: pathComponents.last);
              },
            );
          } else
            return MaterialPageRoute(
              builder: (context) {
                return LandingPage();
              },
            );
          ;
        },
0
Svongripp