Flutter应用导航管理插件flutter_app_navigator的使用

Flutter应用导航管理插件flutter_app_navigator的使用

flutter_app_navigator 是一个用于管理应用导航、路由和屏幕切换的库。

使用示例

以下是 flutter_app_navigator 的基本使用示例。该示例展示了如何创建一个简单的应用,并使用该库进行页面之间的导航。

import 'package:flutter/material.dart';
import 'package:flutter_app_navigator/app_navigator.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: '自定义页面过渡应用',
      initialRoute: "page_1",
      onGenerateRoute: AppRouter.I.generate,
    );
  }
}

class AppRouter extends AppRouteGenerator {
  const AppRouter._();

  static AppRouter get I => const AppRouter._();

  /// 可选配置
  [@override](/user/override)
  AppRouteConfig get config {
    return const AppRouteConfig(
      animationTime: 300,
      animationType: AnimationType.slideRight,
    );
  }

  [@override](/user/override)
  Map<String, RouteBuilder> routes() {
    return {
      "page_1": page1,
      "page_2": page2,
    };
  }

  [@override](/user/override)
  Widget onDefault(BuildContext context, Object? data) => page2(context, data);

  Widget page1(BuildContext context, Object? data) {
    return const Page1();
  }

  Widget page2(BuildContext context, Object? data) {
    return Page2(
      data: data?.get("data"),
    );
  }
}

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

  [@override](/user/override)
  State<Page1> createState() => _Page1State();
}

class _Page1State extends State<Page1> {
  Object? result;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('首页'),
      ),
      backgroundColor: Colors.white,
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(
              "数据 : $result",
              style: const TextStyle(fontSize: 24),
            ),
            const SizedBox(height: 24),
            ElevatedButton(
              onPressed: () async {
                result = await AppNavigator.load(
                  context,
                  "page_2",
                  // arguments: {
                  //   "data": "Hi, I'm from Home...!",
                  // },
                  animationType: AnimationType.zoom,
                );
                setState(() {});
              },
              child: const Text('前往第二个页面'),
            ),
          ],
        ),
      ),
    );
  }
}

class Page2 extends StatelessWidget {
  final Object? data;

  const Page2({
    super.key,
    required this.data,
  });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('第二个页面'),
      ),
      backgroundColor: Colors.blue,
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(
              "$data",
              style: const TextStyle(fontSize: 24),
            ),
            const SizedBox(height: 24),
            ElevatedButton(
              onPressed: () {
                AppNavigator.terminate(
                  context,
                  result: "Hey, I'm back...!",
                );
              },
              child: const Text('返回'),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter应用导航管理插件flutter_app_navigator的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用导航管理插件flutter_app_navigator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_app_navigator 是一个用于简化 Flutter 应用导航管理的插件。它提供了一种简洁的方式来处理页面之间的导航、参数传递以及路由管理。以下是如何使用 flutter_app_navigator 插件的详细步骤:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 flutter_app_navigator 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_app_navigator: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 初始化导航器

在你的应用中,初始化 flutter_app_navigator。通常,你可以在 main.dart 文件中进行初始化:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter App Navigator Example',
      navigatorKey: AppNavigator.navigatorKey,  // 使用 AppNavigator 的 navigatorKey
      onGenerateRoute: AppNavigator.onGenerateRoute,  // 使用 AppNavigator 的 onGenerateRoute
      home: HomeScreen(),
    );
  }
}

3. 定义路由

AppNavigator 中定义你的应用路由。你可以创建一个单独的文件来管理路由,例如 routes.dart

import 'package:flutter_app_navigator/flutter_app_navigator.dart';
import 'package:flutter/material.dart';
import 'home_screen.dart';
import 'detail_screen.dart';

class Routes {
  static const String home = '/';
  static const String detail = '/detail';

  static final Map<String, WidgetBuilder> routes = {
    home: (context) => HomeScreen(),
    detail: (context) => DetailScreen(),
  };
}

class AppNavigator extends BaseNavigator {
  static final navigatorKey = GlobalKey<NavigatorState>();

  static Route<dynamic> onGenerateRoute(RouteSettings settings) {
    final builder = Routes.routes[settings.name];
    if (builder != null) {
      return MaterialPageRoute(
        builder: builder,
        settings: settings,
      );
    }
    throw Exception('Unknown route: ${settings.name}');
  }
}

4. 页面导航

在你的页面中,使用 AppNavigator 来进行导航。例如,在 HomeScreen 中导航到 DetailScreen

import 'package:flutter/material.dart';
import 'package:flutter_app_navigator/flutter_app_navigator.dart';
import 'routes.dart';

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Screen'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            AppNavigator.pushNamed(Routes.detail);
          },
          child: Text('Go to Detail Screen'),
        ),
      ),
    );
  }
}

5. 传递参数

如果你需要在页面之间传递参数,可以在 pushNamed 方法中传递参数:

AppNavigator.pushNamed(Routes.detail, arguments: {'id': 123});

在目标页面(例如 DetailScreen)中,可以通过 ModalRoute.of(context) 获取参数:

class DetailScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final Map<String, dynamic> args = ModalRoute.of(context).settings.arguments;

    return Scaffold(
      appBar: AppBar(
        title: Text('Detail Screen'),
      ),
      body: Center(
        child: Text('ID: ${args['id']}'),
      ),
    );
  }
}

6. 返回上一页

使用 AppNavigator.pop() 返回到上一页:

AppNavigator.pop();
回到顶部