Flutter Intents/Navigator

作者: Air_w | 来源:发表于2019-07-04 15:22 被阅读541次

    Flutter Intents/Navigator

    在Android中,Intents有两个主要用例:在Activity之间导航,以及与组件通信。
    在Flutter中,没有Intent概念,在屏幕之间导航,使用Navigator和Routes。


    在Flutter中,导航屏幕有两种方式:1、先配置路由。2、后配置路由

    先配置路由
    1.1、配置路由
    1.2、使用路由导航屏幕
    后配置路由
    2、在使用路由时配置路由
    3、退出页面
    4、导航时携带数据

          Navigator.pop(context);
    

    先配置路由
    1.1、配置路由

          routes: {
            'secondPage': (BuildContext context) => SecondPage(),
            'sample page': (BuildContext context) => SecondPage(),
          },
    

    1.2、使用路由导航屏幕

      Navigator.pushNamed(context, 'secondPage');
    

    后配置路由
    2.1、在使用路由时配置路由

    //使用路由时创建路由
    Navigator.push(context, new MaterialPageRoute(builder: (context) => SecondPage()));
    

    3、退出页面

          Navigator.pop(context);
    

    全部示例

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
          routes: {
            'secondPage': (BuildContext context) => SecondPage(),
            'sample page': (BuildContext context) => SecondPage(),
          },
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void _incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.display1,
                ),
                RaisedButton(
                    color: Colors.blueAccent,
                    onPressed: () {
                      Navigator.pushNamed(context, 'secondPage');
                    },
                    textColor: Colors.white,
                    child: Text('go to new page!'),
                    shape: RoundedRectangleBorder(
                        borderRadius:BorderRadius.circular(10))
                )
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ), // This trailing comma makes auto-formatting nicer for build methods.
        );
      }
    }
    
    class SecondPage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('SecondPage'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                RaisedButton(
                    onPressed: () {
                      Navigator.pop(context);
                    },
                    child: Text('return'))
              ],
            ),
          ),
        );
      }
    }
    
    
    第一个页面 第二个页面

    4、导航时携带数据

    案例介绍:页面一跳转到页面2,在页面2填写数据,点击按钮返回到页面1,在页面1接收数据后弹出对话框显示数据,对话框点击确定或取消按钮后关闭对话框。

    获取输入框数据

                TextField(
                  decoration: InputDecoration(
                      hasFloatingPlaceholder: true,
                      labelText: 'label',
                      border: OutlineInputBorder()),
                  onSubmitted: (content) {
                    //do something.
                  },
                  onChanged: (content) {
                    inputContent = content;
                  },
                ),
    

    将数据返回上个页面

                      Navigator.pop(context, [
                        {
                          'content': inputContent,
                          'tip': 'hello'
                        }
                      ]);
    

    接收数据显示对话框

                      Navigator.push(
                              context,
                              new MaterialPageRoute(
                                  builder: (context) => SecondPage()))
                          .then<Map>((value) {
                        /*
                        接收数据
                        弹出对话框
                        */
                        showDialog(
                          context: context,
                          child: AlertDialog(
                            title: Text('从上个页面返回的数据'),
                            content: Text('${value.toString()}'),
                            contentPadding: EdgeInsets.all(10),
                            actions: <Widget>[
                              RaisedButton(
                                  color: Colors.blue,
                                  textColor: Colors.white,
                                  onPressed: () {
                                    Navigator.pop(context);
                                  },
                                  child: Text('确定'),
                                  shape: RoundedRectangleBorder(
                                      borderRadius: BorderRadius.circular(10))),
                              RaisedButton(
                                  color: Colors.grey,
                                  textColor: Colors.white,
                                  onPressed: () {
                                    Navigator.of(context).pop();
                                  },
                                  child: Text('取消'),
                                  shape: RoundedRectangleBorder(
                                      borderRadius: BorderRadius.circular(10))),
                            ],
                          ),
                        );
    

    关闭对话框

                                    //关闭对话框
                                    Navigator.of(context).pop();
    
    页面1 页面2
    填写数据并回传 对话框显示数据

    未完待续。。。

    相关文章

      网友评论

        本文标题:Flutter Intents/Navigator

        本文链接:https://www.haomeiwen.com/subject/mdclhctx.html