Flutter路由集成go_router

Flutter 路由插件 go_router 使用详解

基本使用

安装依赖

安装

dev_dependencies:
    go_router: ^16.2.1

引用

import 'package:go_router/go_router.dart';

新建路由页面

在 lib 目录下新建页面文件夹 pages 下分别建立以下页面

home.dart

import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('home page')),
      body: Center(child: Text('home')),
    );
  }
}

document.dart

import 'package:flutter/material.dart';

class DocumentPage extends StatefulWidget {
  const DocumentPage({super.key});

  @override
  State<DocumentPage> createState() => _DocumentPageState();
}

class _DocumentPageState extends State<DocumentPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('document page')),
      body: Center(child: Text('document')),
    );
  }
}

settings.dart

import 'package:flutter/material.dart';

class SettingsPage extends StatefulWidget {
  const SettingsPage({super.key});

  @override
  State<SettingsPage> createState() => _SettingsPageState();
}

class _SettingsPageState extends State<SettingsPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('settings page')),
      body: Center(child: Text('settings')),
    );
  }
}

user.dart

import 'package:flutter/material.dart';

class UserPage extends StatefulWidget {
  const UserPage({super.key});

  @override
  State<UserPage> createState() => _UserPageState();
}

class _UserPageState extends State<UserPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('User page')),
      body: Center(child: Text('user')),
    );
  }
}

新建路由表

在 lib 目录下新建 router 文件夹,在目录中新建 routes.dart pub 文档地址:https://pub.dev/packages/go_router/example

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:flutter_amap/pages/home.dart';
import 'package:flutter_amap/pages/document.dart';
import 'package:flutter_amap/pages/user.dart';
import 'package:flutter_amap/pages/settins.dart';

final GoRouter router = GoRouter(
  routes: <RouteBase>[
    GoRoute(
      path: '/',
      name: "home",
      builder: (BuildContext context, GoRouterState state) {
        return const HomePage();
      },
      routes: <RouteBase>[],
    ),
    GoRoute(
      path: '/user',
      name: "user",
      builder: (BuildContext context, GoRouterState state) {
        return const UserPage();
      },
    ),
    GoRoute(
      path: '/settings',
      name: "settings",
      builder: (BuildContext context, GoRouterState state) {
        return const SettingsPage();
      },
    ),
    GoRoute(
      path: '/document',
      name: "document",
      builder: (BuildContext context, GoRouterState state) {
        return const DocumentPage();
      },
    ),
  ],
);

main 入口设置路由

import 'package:flutter/material.dart';
import 'package:flutter_amap/router/routes.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      title: 'Material App',
      theme: ThemeData(primarySwatch: Colors.lightGreen),
      routerConfig: router,
    );
  }
}

路由跳转

在 home.dart 中引入 go_router,有三种方式实现跳转

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

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('home page')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                // context.push('/settings'); //路径跳转
                // context.pushNamed('settings'); //路由名跳转
                GoRouter.of(context).push("/settings");
                // GoRouter.of(context).pushNamed("settings");
              },
              child: Text("跳转到设置页面"),
            ),
          ],
        ),
      ),
    );
  }
}

路由 params 传参

需要更改三个地方,跳转传参,路由带传参,页面接收参数

跳转带参数

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

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('home page')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                context.pushNamed(
                  'user',
                  pathParameters: {"uid": "123  "},
                ); //路由名跳转
              },
              child: Text("跳转到user 传值"),
            ),
          ],
        ),
      ),
    );
  }
}

路由带传参

GoRoute(
    path: '/user/:uid',
    name: "user",
    builder: (BuildContext context, GoRouterState state) {
    return UserPage(uid: state.pathParameters["uid"]);
    },
),

接收参数

更改user.dart接收参数

import 'package:flutter/material.dart';

class UserPage extends StatefulWidget {
  String? uid;
  UserPage({super.key, this.uid});

  @override
  State<UserPage> createState() => _UserPageState();
}

class _UserPageState extends State<UserPage> {
  @override
  void initState() {
    super.initState();
    print(widget.uid);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('User page')),
      body: Center(child: Text('user')),
    );
  }
}

路由 query 传参

页面跳转带参

 ElevatedButton(
    onPressed: () {
    context.pushNamed(
        'user',
        queryParameters: {"aid": "123  "},
    ); //路由名跳转
    },
    child: Text("跳转到user 传值"),
),

路由传参

GoRoute(
    path: '/document',
    name: "document",
    builder: (BuildContext context, GoRouterState state) {
    final String? aid = state.uri.queryParameters['aid'];
    return DocumentPage(aid: aid as String);
    },

页面接收

import 'package:flutter/material.dart';

class DocumentPage extends StatefulWidget {
  String aid;
  DocumentPage({super.key, required this.aid});

  @override
  State<DocumentPage> createState() => _DocumentPageState();
}

class _DocumentPageState extends State<DocumentPage> {
  @override
  void initState() {
    super.initState();
    print(widget.aid);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('document page')),
      body: Center(child: Text('document')),
    );
  }
}
0%