Flattern - Übergeben Sie Werte zwischen Routen mit pushReplacementNamed
Ich versuche, Werte zwischen Routen mit zu übergeben Navigator.pushReplacementNamed()
, aber ich verstehe es nicht.
Ich kann nicht herausfinden, in welcher Syntax und Logik die Daten korrekt sind pushReplacementNamed
und den routes
Schlüssel erhalten.
Können Sie mir helfen?
Geben Sie den folgenden Code ein, um das Verständnis zu erleichtern:
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(),
routes: <String, WidgetBuilder> {
'/form': (BuildContext context) => new FormPage(email: ???, header: {'auth': ???}),
},
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return new Scaffold(
floatingActionButton: new FloatingActionButton(
onPressed: () {
Navigator.pushReplacementNamed(context, '/form', {email: '[email protected]', header: {'auth': '1234'}});
},
child: new Icon(Icons.navigate_next),
),
);
}
}
class FormPage extends StatefulWidget {
FormPage({Key key, this.email, this.header}) : super(key: key);
String email;
Map header;
@override
FormPageState createState() => new FormPageState();
}
class FormPageState extends State<FormPage> {
@override
Widget build(BuildContext context) {
return new Container(
child: new Column(
children: <Widget>[
new Text(widget.email),
new Text(widget.header['auth'])
],
),
);
}
}
Nach der Korrektur:
Der Zweck des Versuchs pushReplacementNamed
bestand darin, den Routenverlauf zu entfernen. Wenn der Benutzer also die Zurück-Taste des Geräts drückt, um zur früheren Route zurückzukehren, ist die Route nicht mehr vorhanden. Referenz
Der Grund für diese Implementierung ist die Verwendung auf einer Anmeldeseite, wenn der Benutzer bereits authentifiziert wurde, indem google sign
er mit den Anmeldeparametern zur nächsten Seite weitergeleitet wird und nicht über die Zurück-Schaltfläche des Geräts zur Anmeldeseite zurückkehren konnte.
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(),
routes: <String, WidgetBuilder> {
'/form': (BuildContext context) => new FormPage(), //new
},
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return new Scaffold(
floatingActionButton: new FloatingActionButton(
onPressed: () {
Navigator.of(context).pushReplacement( //new
new MaterialPageRoute( //new
settings: const RouteSettings(name: '/form'), //new
builder: (context) => new FormPage(email: '[email protected]', header: {'auth': '1234'}) //new
) //new
); //new
},
child: new Icon(Icons.navigate_next),
),
);
}
}
class FormPage extends StatefulWidget {
FormPage({Key key, this.email, this.header}) : super(key: key);
String email;
Map header;
@override
FormPageState createState() => new FormPageState();
}
class FormPageState extends State<FormPage> {
@override
Widget build(BuildContext context) {
return new Container(
child: new Column(
children: <Widget>[
new Text(widget.email),
new Text(widget.header['auth'])
],
),
);
}
}
Ich denke, Sie werden möglicherweise nicht verstehen, wie das Ergebnis funktioniert. Das Ergebnis geht auf das vorherige Widget zurück, das die letzte Route verschoben hat, und wird await
für das Ergebnis des Future
vom vorherigen Aufruf an zurückgesendeten verwendet push
. Möchten Sie einfach eine Route mit Parametern starten? Dann können Sie dies tun.
Navigator.of(context).pushReplacement(new MaterialPageRoute(settings: const RouteSettings(name: '/form'), builder: (context) => new FormPage(email: '[email protected]', header: {'auth': '1234'})));