it-swarm.com.de

Wie erhalte ich den aktuellen Routenpfad in Flutter?

Während der Implementierung von dauerhafte untere Leiste , vorherige Route muss wiederhergestellt werden , wenn auf eine Schaltfläche in ntere Leiste geklickt wurde.

Wenn Sie auf eine Schaltfläche in der unteren Leiste klicken, wird der aktuelle Routenpfad ( / a/b/c ) gespeichert und die zuvor gespeicherte Route wird entsprechend dem Klicken auf die Schaltfläche wiederhergestellt.

Konzeptionell betrachtet der Benutzer jede Schaltfläche als Arbeitsbereich und ihr Status geht niemals verloren (einschließlich des Backstacks). Der Benutzer kann sicher von einem Arbeitsbereich zu einem anderen wechseln.

Wie erhalte ich den aktuellen Routenpfad in Flutter, wenn das Routing Zurückspulen auf Root ist?

17
Kyaw Tun

NavigatorState macht keine API verfügbar, um den Pfad der aktuellen Route abzurufen, und Route macht auch keine API verfügbar, um den Pfad einer Route zu bestimmen. Routen können anonym sein (und sind es oft). Mit der Route -Methode können Sie herausfinden, ob sich ein bestimmtes isCurrent oben auf dem Navigatorstapel befindet. Dies ist jedoch für Ihre Verwendung nicht sehr praktisch Fall.

Ich würde empfehlen, dass Sie eine andere Herangehensweise an dieses Problem wählen und überhaupt nicht zum Stamm zurückspulen. Verwenden Sie stattdessen ein anderes Navigator Widget für jeden Bereich des BottomNavigationBar. Auf diese Weise müssen Sie den Stapel nicht zurückspulen, wenn Sie zwischen den Fenstern wechseln. Sie können Ihre Widgets Navigator in die Widgets Opacity und IgnorePointer einschließen, um sie auszublenden, wenn dies nicht erwünscht ist sichtbar sein, ohne ihren Stapel zu zerstören.

app video

import 'package:flutter/material.Dart';

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new MyHomePage(),
    );
  }
}

class SecurePage extends StatelessWidget {
  final int index;

  SecurePage(this.index);

  Widget build(BuildContext context) {
    return new Material(
      color: Colors.amber,
      child: new InkWell(
        child: new Center(
          child: new Icon(
            Icons.security,
            color: Colors.white,
            size: index * 100.0 + 20.0,
          ),
        ),
        onTap: () {
          Navigator.of(context).Push(
            new MaterialPageRoute(
              builder: (BuildContext context) {
                return new SecurePage(index + 1);
              },
            ),
          );
        },
      ),
    );
  }
}

class VerifiedPage extends StatelessWidget {
  final int index;

  VerifiedPage(this.index);

  Widget build(BuildContext context) {
    return new Material(
      color: Colors.green,
      child: new InkWell(
        child: new Center(
          child: new Icon(
            Icons.verified_user,
            color: Colors.white,
            size: index * 100.0 + 20.0,
          ),
        ),
        onTap: () {
          Navigator.of(context).Push(
            new MaterialPageRoute(
              builder: (BuildContext context) {
                return new VerifiedPage(index + 1);
              },
            ),
          );
        },
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  State createState() => new MyHomePageState();
}

class MyHomePageState extends State<MyHomePage> {
  int _page = 0;
  List<Widget> initialWidgets = <Widget>[
    new SecurePage(0),
    new VerifiedPage(0),
  ];

  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Stack(
        children: new List<Widget>.generate(initialWidgets.length, (int index) {
          return new IgnorePointer(
            ignoring: index != _page,
            child: new Opacity(
              opacity: _page == index ? 1.0 : 0.0,
              child: new Navigator(
                onGenerateRoute: (RouteSettings settings) {
                  return new MaterialPageRoute(
                    builder: (_) => initialWidgets[index],
                  );
                },
              ),
            ),
          );
        }),
      ),
      bottomNavigationBar: new BottomNavigationBar(
        currentIndex: _page,
        onTap: (int index) {
          setState(() {
            _page = index;
          });
        },
        items: <BottomNavigationBarItem>[
          new BottomNavigationBarItem(
            icon: new Icon(Icons.security),
            title: new Text('Secure'),
          ),
          new BottomNavigationBarItem(
            icon: new Icon(Icons.verified_user),
            title: new Text('Verified'),
          ),
        ],
      ),
    );
  }
}
10
Collin Jackson

Dies sollte Ihnen den genauen Routennamen geben

import 'package:path/path.Dart';

ModalRoute.of(context).settings.name
10
ikben

Diese Antwort wird hauptsächlich zu Archivierungszwecken gesendet. Wie @ikben bereits erwähnt, ist ModalRoute.of(context) eine Möglichkeit, die aktuelle Route und alle ihre Eigenschaften abzurufen. Dies gibt ein ModalRoute zurück, das trotz seines Namens für die meisten Navigator.Push Anrufe, nicht nur showDialog. Hilfreiche Eigenschaften sind Route.settings , Route.navigator und Route.isFirst .

2
Levi Lesches