Flutter-使用pushReplacementNamed在路线之间传递值

raf*_*b21 0 dart flutter

我正在尝试使用传递路线之间的值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)

dee*_*raj 6

  1. 您可以使用 Navigator.of(context).pushReplacementNamed('/route', arguments: 'Test String');将任何对象作为参数从第一个小部件传递。
  2. 并用于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)
  1. 而不是第 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)


Sim*_*mon 5

我认为您可能会想念结果如何工作。结果返回到推入最后一条路线的前一个小部件,并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'})));