一周掌握Flutter开发--4、导航与路由

文章目录

      • [4. 导航与路由](#4. 导航与路由)
      • 核心功能
        • [4.1 基础跳转:`Navigator.push` 和 `Navigator.pop`](#4.1 基础跳转:Navigator.pushNavigator.pop)
        • [4.2 命名路由:`routes` 和 `onGenerateRoute`](#4.2 命名路由:routesonGenerateRoute)
        • [4.3 路由传参和返回结果](#4.3 路由传参和返回结果)
      • 推荐工具:`go_router`
        • [4.4 `go_router` 的使用](#4.4 go_router 的使用)
      • 总结*

4. 导航与路由

导航与路由是 Flutter 应用中管理页面跳转的核心功能。Flutter 提供了多种方式来实现页面导航,从简单的跳转到复杂的路由管理,开发者可以根据需求选择合适的方式。


核心功能

  • Navigator.push:跳转到新页面。

    dart 复制代码
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => SecondScreen()),
    );
  • Navigator.pop:返回上一页。

    dart 复制代码
    Navigator.pop(context);
  • 示例

    dart 复制代码
    class HomeScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text('Home')),
          body: Center(
            child: ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => SecondScreen()),
                );
              },
              child: Text('Go to Second Screen'),
            ),
          ),
        );
      }
    }
    
    class SecondScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text('Second Screen')),
          body: Center(
            child: ElevatedButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: Text('Go Back'),
            ),
          ),
        );
      }
    }

4.2 命名路由:routesonGenerateRoute
  • 命名路由:通过预定义路由表来管理页面跳转,适合页面较多或需要集中管理的场景。

  • routes:定义路由表。

    dart 复制代码
    void main() {
      runApp(MaterialApp(
        initialRoute: '/',
        routes: {
          '/': (context) => HomeScreen(),
          '/second': (context) => SecondScreen(),
        },
      ));
    }
  • onGenerateRoute:动态生成路由,适合需要根据参数动态加载页面的场景。

    dart 复制代码
    void main() {
      runApp(MaterialApp(
        initialRoute: '/',
        onGenerateRoute: (settings) {
          if (settings.name == '/second') {
            return MaterialPageRoute(
              builder: (context) => SecondScreen(),
              settings: settings,
            );
          }
          return null;
        },
      ));
    }
  • 跳转到命名路由

    dart 复制代码
    Navigator.pushNamed(context, '/second');

4.3 路由传参和返回结果
  • 传递参数

    dart 复制代码
    Navigator.pushNamed(
      context,
      '/second',
      arguments: 'Hello from HomeScreen',
    );
    
    // 在目标页面接收参数
    class SecondScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        final String message = ModalRoute.of(context)!.settings.arguments as String;
        return Scaffold(
          appBar: AppBar(title: Text('Second Screen')),
          body: Center(child: Text(message)),
        );
      }
    }
  • 返回结果

    dart 复制代码
    // 跳转并等待结果
    final result = await Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => SecondScreen()),
    );
    
    // 返回结果
    Navigator.pop(context, 'Hello from SecondScreen');

推荐工具:go_router

go_router 是一个功能强大的第三方路由库,支持深度链接、嵌套路由和更复杂的路由场景。

4.4 go_router 的使用
  1. 添加依赖

    yaml 复制代码
    dependencies:
      go_router: ^6.0.0
  2. 定义路由

    dart 复制代码
    import 'package:go_router/go_router.dart';
    
    final GoRouter router = GoRouter(
      routes: [
        GoRoute(
          path: '/',
          builder: (context, state) => HomeScreen(),
        ),
        GoRoute(
          path: '/second',
          builder: (context, state) => SecondScreen(),
        ),
      ],
    );
  3. main.dart 中使用

    dart 复制代码
    void main() {
      runApp(MaterialApp.router(
        routerConfig: router,
      ));
    }
  4. 跳转和传参

    dart 复制代码
    context.go('/second', extra: 'Hello from HomeScreen');
  5. 深度链接

    dart 复制代码
    final GoRouter router = GoRouter(
      routes: [
        GoRoute(
          path: '/',
          builder: (context, state) => HomeScreen(),
        ),
        GoRoute(
          path: '/second/:id', // 动态参数
          builder: (context, state) {
            final String id = state.params['id']!;
            return SecondScreen(id: id);
          },
        ),
      ],
    );

总结*

  • 基础跳转 :使用 Navigator.pushNavigator.pop
  • 命名路由 :使用 routesonGenerateRoute 集中管理路由。
  • 路由传参和返回结果 :通过 argumentsawait 实现。
  • 推荐工具go_router 支持深度链接和嵌套路由,适合复杂应用。

掌握这些导航与路由的核心功能后,你可以轻松管理 Flutter 应用的页面跳转和路由逻辑。


结束语

Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!

相关推荐
每次的天空1 小时前
Android Jetpack学习总结(源码级理解)
android·学习·android jetpack
木子庆五1 小时前
Android设计模式之代理模式
android·设计模式·代理模式
在雨季等你2 小时前
创业之旅 - 反思 - 整改 - 新的方向 - 诚邀
android
Long_poem2 小时前
【自学笔记】PHP语言基础知识点总览-持续更新
android·笔记·php
fatiaozhang95273 小时前
晶晨S905L3A(B)-安卓9.0-开启ADB和ROOT-支持IPTV6-支持外置游戏系统-支持多种无线芯片-支持救砖-完美通刷线刷固件包
android·游戏·adb·华为·电视盒子·机顶盒rom·魔百盒固件
行墨4 小时前
Kotlin语言的==与===比较操作
android
圣火喵喵教4 小时前
Pixel 8 pro 刷AOSP源码 Debug 详细教程(含救砖)
android
星释4 小时前
鸿蒙Flutter实战:18-组合而非替换,现有插件快速鸿蒙化
flutter·华为·harmonyos
二流小码农5 小时前
鸿蒙开发:使用Ellipse绘制椭圆
android·ios·harmonyos
一人前行5 小时前
Flutter_学习记录_AppBar中取消leading的占位展示
flutter