Flutter -- static route and dyna

2020-12-10  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读