我正在尝试使用传递路线之间的值Navigator.pushReplacementNamed(),但我没有得到。
我无法弄清楚数据将退出pushReplacementNamed并获取routes密钥的正确语法和逻辑。
你能帮助我吗?
输入以下代码以帮助理解:
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: 'myemail@flutter.com', 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'])
],
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
校正后:
尝试使用的目的pushReplacementNamed是删除路由历史记录,因此,如果用户按下设备的后退按钮以返回到先前的路由,则该路由将不再存在。参考
如果用户已经通过身份验证,则将在登录页面上使用此实现的原因,即用户google sign将通过登录参数重定向到下一个页面,并且无法通过设备的后退按钮返回到登录页面。
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: 'myemail@flutter.com', 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'])
],
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
Navigator.of(context).pushReplacementNamed('/route', arguments: 'Test String');将任何对象作为参数从第一个小部件传递。String s = ModalRoute.of(context).settings.arguments;解析initState()方法之后的参数,例如didChangeDependencies()或build(BuildContext context)在第二个小部件中。例如:
@override
void didChangeDependencies() {
RouteSettings settings = ModalRoute.of(context)!.settings;
if (settings.arguments != null) {
CustomObject obj = settings.arguments as CustomObject;
}
super.didChangeDependencies();
}
Run Code Online (Sandbox Code Playgroud)
而不是第 2 步。您还可以通过onGenerateRoute: (settings) {}在您的App小部件中使用这些参数来初始化小部件类。例如:
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
/*...*/
routes: {
/*Don't add those routes with arguments here..*/
},
onGenerateRoute: (settings) {
if (settings.name == SECOND_SCREEN_ROUTE) {
if (settings.arguments != null) {
CustomObject obj = settings.arguments as CustomObject;
return MaterialPageRoute(
builder: (context) {
return SecondScreen(obj);
},
);
}
}
assert(false, 'Need to implement ${settings.name}');
return null;
});
}
}
Run Code Online (Sandbox Code Playgroud)
我认为您可能会想念结果如何工作。结果返回到推入最后一条路线的前一个小部件,并await用于对Future的前一次调用发回的结果push。您是否只想使用参数启动路线?然后,您可以执行此操作。
Navigator.of(context).pushReplacement(new MaterialPageRoute(settings: const RouteSettings(name: '/form'), builder: (context) => new FormPage(email: 'myemail@flutter.com', header: {'auth': '1234'})));
| 归档时间: |
|
| 查看次数: |
3830 次 |
| 最近记录: |