Flutter 中 路由导航

131 阅读2分钟

Flutter中的路由导航是用于在应用程序的不同屏幕(或页面)之间进行导航的。Flutter提供了几种不同的路由导航方法,包括基本的Navigator、命名路由以及使用第三方路由包如go_routerauto_route。下面,我将详细介绍这些方法并提供示例代码。

1. 基本的Navigator.push和Navigator.pop

Navigator是Flutter中的路由管理器,可以使用Navigator.push将新的页面推到导航堆栈上,并使用Navigator.pop从导航堆栈中弹出页面。

示例代码:

import 'package:flutter/material.dart';

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

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

class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('First Page')),
      body: Center(
        child: ElevatedButton(
          child: Text('Go to Second Page'),
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => SecondPage()),
            );
          },
        ),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Second Page')),
      body: Center(
        child: ElevatedButton(
          child: Text('Back to First Page'),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
    );
  }
}

2. 命名路由

命名路由通过给每个路由分配一个名称(字符串)来管理路由。这种方法更适合于大型应用程序,特别是当需要在不同地方使用相同的路由时。

示例代码:

import 'package:flutter/material.dart';

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

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

class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('First Page')),
      body: Center(
        child: ElevatedButton(
          child: Text('Go to Second Page'),
          onPressed: () {
            Navigator.pushNamed(context, '/second');
          },
        ),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Second Page')),
      body: Center(
        child: ElevatedButton(
          child: Text('Back to First Page'),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
    );
  }
}

3. 使用第三方路由包(如go_router

go_router是一个功能强大的路由包,提供了一种声明式的方式来定义路由和导航。

示例代码:

首先,需要在pubspec.yaml中添加go_router依赖:

dependencies:
  flutter:
    sdk: flutter
  go_router: ^6.0.0  # 确保使用最新版本

然后,在代码中使用go_router进行路由管理:

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';

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

class MyApp extends StatelessWidget {
  final GoRouter _router = GoRouter(
    routes: [
      GoRoute(
        path: '/',
        builder: (context, state) => FirstPage(),
      ),
      GoRoute(
        path: '/second',
        builder: (context, state) => SecondPage(),
      ),
    ],
  );

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerDelegate: _router.routerDelegate,
      routeInformationParser: _router.routeInformationParser,
    );
  }
}

class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('First Page')),
      body: Center(
        child: ElevatedButton(
          child: Text('Go to Second Page'),
          onPressed: () {
            context.go('/second');
          },
        ),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Second Page')),
      body: Center(
        child: ElevatedButton(
          child: Text('Back to First Page'),
          onPressed: () {
            context.pop();
          },
        ),
      ),
    );
  }
}

总结

以上是Flutter中路由导航的三种主要方法:基本的Navigator、命名路由和使用第三方路由包(如go_router)。每种方法都有其适用的场景,可以根据具体需求选择合适的路由导航方式。