Flutter - router 基本路由

Flutter中的路由通俗的讲就是页面跳转,在Flutter中通过Navigator组件管理路由导航,并提供了管理堆栈的方法.

  • Navigator.push() 页面跳转
  • Navigator.pop() 返回上一页
    Flutter中给我们提供了两种配置路由跳转的方式
    1.基本路由
    2.命名路由

基本路由的使用

1.需要在主页面中引入需要跳转的页面

import './NewsPage.dart';

2.在点击事件中写跳转
Navigator组件为我们提供了push()方法作为页面跳转使用.

Navigator.of(context).push(
  MaterialPageRoute(
    builder: (BuildContext context) {
      return NewsPage();
    }
  )
);

在这里还是踩了一个小坑的,通过编写主页面,然后引入NewsPage.dart页面后,发现点击跳转并不能实现跳转功能,并且控制台出现了报错

image.png

最后发现在主页面中,把主函数的Scaffold提取出来,就可以实现跳转了.错误原因是因为使用的context不包含Navigator实例作为父widget。也就是在所有的当前用到过的widget中,都没有以Navigator作为父widget的widge。
首先,MaterialApp作为根widget,判断是会能响应跳转页面事件的,其次查看官方文档,看到其中是有navigation相关的,判断MaterialApp是包含Navigator子widget的,能响应跳转事件,那说明在找widget的时候没有在MaterialApp中去找。
因此,我们把主页面的结构拆分开后的写法:

import 'package:flutter/material.dart';
import './NewsPage.dart';
void main() => runApp(MyIndex());
class MyIndex extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'beline App',
      home: homePage()
    );
  }
}
class homePage extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(title: Text('beline App')),
      body: Container(
        child: ListView(
          children: <Widget>[
            RaisedButton(
              child: Text('去新闻页'),
              onPressed: () {
                Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (BuildContext context) {
                      return NewsPage();
                    }
                  )
                );
              },
            ),
          ],
        ),
      )
    );
  }
}

NewsPage.dart

import 'package:flutter/material.dart';
class NewsPage extends StatelessWidget{
  const NewsPage({Key key}): super(key: key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('newspages')
      ),
      body: Center(
        child: Text('这里是新闻页内容区域'),
      ),
    );
  }

这样就可以正确跳转页面,实现基本路由功能了

路由跳转转传参

这里我们按照自己的思路来定义一个String类型的变量,给于一个初始值,不设置要求强制传参.(注意这是一个坑)

import 'package:flutter/material.dart';
class NewsPage extends StatelessWidget{
  String beline='新闻页';
  NewsPage({this.beline});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('newspages')
      ),
      body: Center(
        child: Text(this.beline),
      ),
    );
  }
}

我原本以为在调用时不传递任何参数的情况下,页面中间显示的内容为"新闻页".然而:GG了


image.png

报错内容:

 ════════ Exception caught by widgets library ═══════════════════════════════════

The following assertion was thrown building NewsPage(dirty):

A non-null String must be provided to a Text widget. 
'package:flutter/src/widgets/text.dart': 
Failed assertion: line 269 pos 10: 'data != null'

需要修改成这样就可以了:

import 'package:flutter/material.dart';
class NewsPage extends StatelessWidget{
  String beline;
  NewsPage({this.beline='新闻页'});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('newspages')
      ),
      body: Center(
        child: Text(this.beline),
      ),
    );
  }
}

我们这个时候把主页面需要传递的参数也加上,那么就实现了页面传参:

onPressed: () {
  Navigator.of(context).push(
    MaterialPageRoute(
      builder: (BuildContext context) {
        return NewsPage(beline: '这里是传入的页面名字');
      }
    )
  );
},
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容