美文网首页
Flutter -- static route and dyna

Flutter -- static route and dyna

作者: 我是一只不会飞的小小鸟 | 来源:发表于2020-12-10 17:26 被阅读0次

    前言
    每个应用都有很多个页面,在 Flutter中同样也有很多页面,被称之为路由(route),route 的管理是通过堆栈来实现的。也就是说,基本的使用方法是 push 和 pop。路由的类型分为 static route 和 dynamic route,下面我们分别对这两种 route 进行说明。

    static route

    顾名思义,static route 就是在知道明确跳往哪个界面时的情况下使用的。举个栗子,在MaterialApp构造函数中,我们可以定义 route 列表。具体代码如下:

    import 'package:flutter/material.dart';
    import 'package:route_flutter_app/page1.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Static routing',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          routes: {
            '/page1':(context)=>Page1(title: "Main page",),
            '/page2':(context)=>Page2(title: "Second page",),
            '/page3':(context)=>Page3(title: "Third page",),
            '/page4':(context)=>Page4(title: "Fourth page",),
          },
          home: Page1(title: "Main page",),
        );
      }
    }
    

    在上面的代码中,我们定义了 home 主页,routes 定义路由表。page1234 是我们的 static route,路由的参数为 Map 类型。

    通过上面对应的路由表,我们可以直接使用 Navigator 进行页面跳转。

    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    
    class Page1 extends StatelessWidget{
      final String title;
    
      Page1({Key key,@required this.title}):super(key:key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(this.title),
          ),
          body: Center(
            child: RaisedButton(
              child: Text("Jump to page2"),
              onPressed: (){
                Navigator.pushNamed(context, "/page2");
              },
            ),
          ),
        );
      }
    }
    
    class Page2 extends StatelessWidget{
      final String title;
    
      Page2({Key key,@required this.title}):super(key:key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(this.title),
          ),
          body: Center(
            child: RaisedButton(
              child: Text("Jump to page3"),
              onPressed: (){
                Navigator.pushNamed(context, "/page3");
              },
            ),
          ),
        );
      }
    }
    
    class Page3 extends StatelessWidget{
      final String title;
    
      Page3({Key key,@required this.title}):super(key:key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(this.title),
          ),
          body: Center(
            child: RaisedButton(
              child: Text("Jump to page4"),
              onPressed: (){
                Navigator.pushNamed(context, "/page4");
              },
            ),
          ),
        );
      }
    }
    
    class Page4 extends StatelessWidget{
      final String title;
    
      Page4({Key key,@required this.title}):super(key:key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(this.title),
          ),
          body: Center(
            child: Text(this.title,style: new TextStyle(fontSize: 50,color: Colors.red),)
          ),
        );
      }
    }
    
    

    以上是我定义的四个跳转接口,这些代码都是基本的代码,我这里不做过多的解释。实现效果如下:

    585b2b49ccfe6cf623d711c23ab63a32.jpg

    在 RaisedButtond 的onPress方法里 ,我们可以通过调用方法 Navigator.pushNamed(context, "/page2") 进行页面跳转。 当然,我们也可以使用push的方法:

    Navigator.of(context).push(
        new MaterialPageRoute(
            builder:(context){
                return new Page4()
                }
           )
    );
    

    dynamic route

    虽然静态路由可以进行页面的跳转,但在大多数项目中,我们需要携带参数在两个界面之间跳转,例如,许多新闻应用从列表跳转到 News details 界面。此时,动态路由就派上用场了。让我们看一看代码,看看动态路由是如何实现的。首先,我们定义一个用于列表的新闻类News:

    class News {
      final String title;
      final String description;
      
      News(this.title,this.description);
    }
    

    下面是编辑器定义的一个 News 类。News 类有两个变量,一个标题和一个细节。然后直接在主页面上修改page1的代码,如下图所示:

    class Page1 extends StatelessWidget{
      final String title;
    
      Page1({Key key,@required this.title}):super(key:key);
    
      final news=List<News>.generate(20, (i)=>News("Journalism $i","Journalism $i Details of"),);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(this.title),
          ),
          body: ListView.builder(itemBuilder: (context,index){
            return ListTile(
              title: Text(news[index].title),
              onTap: (){
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context)=>NewsDetail(s_new: news[index],),
                  )
                );
              },
            );
          },
            itemCount: news.length,
          ),
        );
      }
    }
    
    

    首先,在这里生成一个包含20个元素的新闻列表。list 可以通过 generate 方法快速创建,然后 ListView 可以生成列表, 每个列表都通过 onTap 可以进行点击事件的监听。在这里,单击的新闻类被传递到 NewsDetail 细节如下:

    class NewsDetail extends StatelessWidget{
      final News s_new;
    
      NewsDetail({Key key,@required this.s_new}):super(key:key);
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text(this.s_new.title),),
          body: Center(
            child: Text(this.s_new.description),
          ),
        );
      }
    
    }
    

    上面是一个常规代码片段,它定义了一个标题,并在中间显示新闻的详细信息。然后实现的效果如下。

    dbd23bf27f27b11f62e943d26071ebed.jpg

    相关文章

      网友评论

          本文标题:Flutter -- static route and dyna

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