在 Flutter 中Navigator.push 用于实现页面之间的导航

发布于:2025-04-06 ⋅ 阅读:(19) ⋅ 点赞:(0)

在 Flutter 中,Navigator.push 是一个非常重要的方法,用于实现页面之间的导航。通过 Navigator.push,你可以将一个新的页面(路由)推送到导航栈中,从而显示新的内容。

以下是一个详细的教程,帮助你理解如何使用 Navigator.push 进行页面跳转。


一、基本用法

Navigator.push 的基本语法如下:

Navigator.push(
  context,
  MaterialPageRoute(builder: (context) => TargetPage()),
);
参数说明:
  1. context:当前的 BuildContext,通常是从 StatelessWidgetStatefulWidgetbuild 方法中获取。
  2. MaterialPageRoute:定义了一个页面路由,builder 属性用于指定目标页面的内容。

二、完整示例

以下是一个完整的示例,演示如何从主页跳转到另一个页面。

示例代码:
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

// 主页
class HomePage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('主页')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 跳转到新页面
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => SecondPage()),
            );
          },
          child: Text('跳转到第二页'),
        ),
      ),
    );
  }
}

// 第二页
class SecondPage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('第二页')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 返回上一页
            Navigator.pop(context);
          },
          child: Text('返回主页'),
        ),
      ),
    );
  }
}
运行效果:
  1. 启动应用后,显示的是 HomePage
  2. 点击按钮后,跳转到 SecondPage
  3. SecondPage 中点击按钮,返回到 HomePage

三、带参数的页面跳转

有时你需要在页面之间传递数据。可以通过构造函数将参数传递给目标页面。

示例代码:
// 主页
class HomePage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('主页')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 跳转到新页面,并传递参数
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => SecondPage(message: '来自主页的消息'),
              ),
            );
          },
          child: Text('跳转到第二页'),
        ),
      ),
    );
  }
}

// 第二页
class SecondPage extends StatelessWidget {
  final String message;

  SecondPage({required this.message});

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('第二页')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('收到的消息:$message'),
            ElevatedButton(
              onPressed: () {
                // 返回上一页
                Navigator.pop(context);
              },
              child: Text('返回主页'),
            ),
          ],
        ),
      ),
    );
  }
}
说明:
  1. SecondPage 的构造函数中定义了一个 message 参数。
  2. 使用 Navigator.push 跳转时,通过构造函数传递参数。
  3. 在目标页面中,直接使用传递的参数即可。

四、返回值的页面跳转

有时你可能需要从目标页面返回一些数据。可以使用 Navigator.push 的返回值来实现。

示例代码:
// 主页
class HomePage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('主页')),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 跳转到新页面并等待返回值
            final result = await Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => SecondPage(),
              ),
            );

            // 显示返回值
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text('返回值:$result')),
            );
          },
          child: Text('跳转到第二页'),
        ),
      ),
    );
  }
}

// 第二页
class SecondPage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('第二页')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                // 返回数据
                Navigator.pop(context, '这是从第二页返回的数据');
              },
              child: Text('返回数据'),
            ),
          ],
        ),
      ),
    );
  }
}
说明:
  1. 使用 await Navigator.push 捕获目标页面返回的数据。
  2. 在目标页面中,通过 Navigator.pop(context, data) 返回数据。
  3. 在主页中,接收到返回值后,可以通过 SnackBar 或其他方式展示。

五、命名路由(Navigator.pushNamed

除了动态创建路由外,Flutter 还支持命名路由。这种方式更适用于大型项目,因为可以集中管理路由。

示例代码:
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: '/',
      routes: {
        '/': (context) => HomePage(),
        '/second': (context) => SecondPage(),
      },
    );
  }
}

// 主页
class HomePage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('主页')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 使用命名路由跳转
            Navigator.pushNamed(context, '/second');
          },
          child: Text('跳转到第二页'),
        ),
      ),
    );
  }
}

// 第二页
class SecondPage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('第二页')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 返回上一页
            Navigator.pop(context);
          },
          child: Text('返回主页'),
        ),
      ),
    );
  }
}
说明:
  1. MaterialApp 中定义了 routes,其中键是路由名称,值是对应的页面构建器。
  2. 使用 Navigator.pushNamed 跳转到指定的命名路由。

六、总结

  • Navigator.push:用于动态创建路由并跳转到新页面。
  • Navigator.pushNamed:通过命名路由跳转,适合管理复杂的应用。
  • 传递参数:通过构造函数或 ModalRoute.of(context) 获取参数。
  • 返回值:使用 Navigator.pop 返回数据,并通过 await 捕获返回值。