Flattern Sie anfängliche Routen mit Parametern


Chris

Ich muss ein Argument für meine übergeben initialRoute. Ich habe dieses Problem gefunden und es so versucht:

    initialRoute: AuthService.isLoggedIn() ? Views.home : Views.firstStart,
    onGenerateInitialRoutes: (String initialRouteName) {
      return [
        AppRouter.generateRoute(
          RouteSettings(
            name: AuthService.isLoggedIn() ? Views.home : Views.firstStart,
            arguments: notificationPayloadThatLaunchedApp,
          ),
        ),
      ];
    },
    onGenerateRoute: AppRouter.generateRoute,

Das funktioniert fast . Das Problem, das ich habe, ist, dass irgendwie nachdem ich hier angerufen habe...

Navigator.pushReplacementNamed(
    context,
    Views.loading,
);

... my Multiprovider, das ein Elternteil von mir GetMaterialAppist, wird erneut aufgerufen, was meine App zum Absturz brachte, weil ich beim Initialisieren meiner Provider eine Funktion aufrufe:

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (context) {
            var dataProvider = DataProvider();
            dataProvider.init( // <- this is called again which should not happen
              context,
            );
            return dataProvider;
          },
        ),
      ],
      child: GetMaterialApp(
        title: 'Flutter Boilerplate',
        navigatorKey: Get.key,
        initialRoute: AuthService.isLoggedIn() ? Views.home : Views.firstStart,
        onGenerateInitialRoutes: (String initialRouteName) {
          return [
            AppRouter.generateRoute(
              RouteSettings(
                name: AuthService.isLoggedIn() ? Views.home : Views.firstStart,
                arguments: notificationPayloadThatLaunchedApp,
              ),
            ),
          ];
        },
        onGenerateRoute: AppRouter.generateRoute,
      ),
    );
  }

Ich habe das Gefühl, dass die Art und Weise, wie ich das anfängliche Argument weitergebe, falsch ist. Gibt es eine andere/bessere Möglichkeit, dies zu erledigen? Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen!

Epool Ranggi

Ich glaube, Sie missverstehen die Verwendung der neuen API onGenerateInitialRoutes , weil sie durch den Namen geladen werden soll, ohne dass aufgerufen wird

Navigator.pushReplacementNamed(
    context,
    Views.loading,
);

API überhaupt. Wenn Sie diese Route von einem anderen Widget aus aufrufen, bedeutet dies, dass dies bereits die zweite Route ist. Dies sollte die Standardroute für Ihre Anwendung sein. Es macht also keinen Sinn, einer anfänglichen Route überhaupt einen Parameter zu geben.

Da Sie das Provider-Paket verwendet haben, ist es besser, einfach das Argument (den Parameter) abzurufen, das Sie über die Provider-API selbst senden möchten.

Wenn Sie fest codierte Daten angeben möchten, behandeln Sie sie einfach als normale Widget-Klasse.

home: MyHomePage(name:"Parametername",data:DataHome()), :

GetMaterialApp(
        title: 'Flutter Boilerplate',
        navigatorKey: Get.key,
        home: MyHomePage(name:"parameter name",data:DataHome()),
        onGenerateRoute: AppRouter.generateRoute,
      );

Beachten Sie, dass beim Aufrufen von Navigator.pushReplacementNamed API . Ihr Anbieter wird wegen des Flutter-Widget-Baums weg sein. Die meisten Navigator-APIs erstellen eine neue Widget-Baumebene von der Wurzel aus. da der Anbieter nur für alle seine Kinder sorgt. Sie können also keine Anbieterdaten verwenden, da Sie einen anderen Vorfahren haben.

Wenn Sie also nur eine Seite vor sich haben, schlage ich vor, dass Sie das home- Attribut in der MaterialApp - API verwenden, da es Ihre erste Seite als untergeordnete Seite behandelt und die Provider-API die Daten empfangen kann, da sie oben im Widget-Baum eine Vorfahren-Provider-API hat:

MultiProvider(
      providers: [
        ChangeNotifierProvider(

wenn Sie nach der Hauptseite mit dem Navigator zwischen den Seiten wechseln möchten. erwägen Sie die Verwendung von NestedNavigator , damit Flutter keine neue Route aus dem Stamm des Widget-Baums erstellt. Sie können also weiterhin auf die Daten der Provider-API zugreifen.

Erraten von Ihrem Variablennamen. Ich nehme an, dass Sie ein Benachrichtigungsrouting handhaben möchten, überprüfen Sie diesen Deeplink

Verwandte Artikel


Routen mit falschen Parametern

Luis E. Ich habe folgenden Weg: resources :users, only: [] do resources :events, only: %i[index] delete :close_account, on: :member end Aus irgendeinem Grund werden Routen mit unterschiedlichen Parametern generiert: GET /backoffice/users/:user

Fügen Sie Routen einen Bereich mit optionalen Parametern hinzu

Urmurmur Ich möchte keine Administratorgerüste für neue Ressourcen erstellen. Aber ich möchte, dass meine Modelle von gesteuert werden Admin::VariousResourcesController. Ich möchte einen :classParameter an diesen Controller übergeben, um diese Klasse zu instan

Routen mit optionalen Parametern in Suave

Dustinmoris Ich habe einen Webdienst mit einem Hallo-Welt-Endpunkt wie diesem: let app = choose [ GET >=> choose [ path "/hello" >=> OK "Hello World!" pathScan "/hello/%s" (fun name -> OK (sprintf "Hello World from %s" na