Flutter路由生命周期管理插件route_life的使用

Flutter路由生命周期管理插件route_life的使用

如果你希望在小部件中监听路由生命周期,这是一个方法。

使用方法

  1. 导入route_life.dart

    import 'package:route_life/route_life.dart';
    
  2. 设置navigatorObservers

    RouteLifeObserver routeLifeObserver = RouteLifeObserver();
    
    MaterialApp(
      navigatorObservers: [
        routeLifeObserver
      ],
    );
    
  3. 使用RouteLifeMixin或AppLifeMixin

    class _GamePageState extends State<GamePage> with RouteLifeMixin, AppLifeMixin {
      [@override](/user/override)
      void initState() {
        super.initState();
        _playGamePageMusic();
      }
    
      [@override](/user/override)
      void dispose() {
        _stopGamePageMusic();
        super.dispose();
      }
    
      [@override](/user/override)
      void onRoutePause(Route nextRoute) {
        _pauseGamePageMusic();
      }
    
      [@override](/user/override)
      void onRouteResume(Route nextRoute) {
        _resumeGamePageMusic();
      }
    
      [@override](/user/override)
      void onAppLifeChanged(bool resume) {
        if (!isRouteShowing) {
          return;
        }
        if (resume) {
          _resumeGamePageMusic();
        } else {
          _pauseGamePageMusic();
        }
      }
    }
    

完整示例Demo

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

RouteLifeObserver routeLifeObserver = RouteLifeObserver();

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: {
        "/home": (context) => const HomePage(),
        "/game": (context) => const GamePage(),
        "/page1": (context) => const Page1(),
      },
      initialRoute: "/home",
      navigatorObservers: [
        routeLifeObserver
      ],
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with RouteLifeMixin {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text("Home Page"),
            SizedBox(height: 50),
            ElevatedButton(
              onPressed: () {
                Navigator.pushNamed(context, '/game');
              },
              child: Text("Go Game Page"),
            ),
          ],
        ),
      ),
    );
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    _playHomeMusic();
  }

  [@override](/user/override)
  void dispose() {
    _stopHomeMusic();
    super.dispose();
  }

  [@override](/user/override)
  void onRoutePause(Route nextRoute) {
    _pauseHomeMusic();
  }

  [@override](/user/override)
  void onRouteResume(Route nextRoute) {
    _resumeHomeMusic();
  }

  void _playHomeMusic() {
    print("play home music");
  }

  void _pauseHomeMusic() {
    print("pause home music");
  }

  void _resumeHomeMusic() {
    print("resume home music");
  }

  void _stopHomeMusic() {
    print("stop home music");
  }
}

class GamePage extends StatefulWidget {
  const GamePage({Key? key}) : super(key: key);

  [@override](/user/override)
  _GamePageState createState() => _GamePageState();
}

class _GamePageState extends State<GamePage> with RouteLifeMixin, AppLifeMixin {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text("Game Page"),
            SizedBox(height: 50),
            ElevatedButton(
              onPressed: () {
                Navigator.pushNamed(context, '/page1');
              },
              child: Text("next page"),
            ),
            SizedBox(height: 50),
            ElevatedButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: Text("close page"),
            ),
          ],
        ),
      ),
    );
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    _playGamePageMusic();
  }

  [@override](/user/override)
  void dispose() {
    _stopGamePageMusic();
    super.dispose();
  }

  [@override](/user/override)
  void onRoutePause(Route nextRoute) {
    _pauseGamePageMusic();
  }

  [@override](/user/override)
  void onRouteResume(Route nextRoute) {
    _resumeGamePageMusic();
  }

  [@override](/user/override)
  void onAppLifeChanged(bool resume) {
    if (!isRouteShowing) {
      return;
    }
    if (resume) {
      _resumeGamePageMusic();
    } else {
      _pauseGamePageMusic();
    }
  }

  void _playGamePageMusic() {
    print("play GamePage music");
  }

  void _pauseGamePageMusic() {
    print("pause GamePage music");
  }

  void _resumeGamePageMusic() {
    print("resume GamePage music");
  }

  void _stopGamePageMusic() {
    print("stop GamePage music");
  }
}

class Page1 extends StatelessWidget {
  const Page1({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text("Page1"),
            SizedBox(height: 50),
            ElevatedButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: Text("close page"),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter路由生命周期管理插件route_life的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter路由生命周期管理插件route_life的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


route_life 是一个用于 Flutter 的路由生命周期管理插件,它可以帮助开发者更好地管理和监听路由的生命周期事件。通过 route_life,你可以在路由的进入、退出等关键时刻执行特定的操作,例如数据加载、资源释放等。

安装 route_life

首先,你需要在 pubspec.yaml 文件中添加 route_life 依赖:

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

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

使用 route_life

1. 初始化 RouteLife

main.dart 中初始化 RouteLife

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorObservers: [RouteLifeObserver()],
      home: HomePage(),
    );
  }
}

2. 监听路由生命周期事件

你可以通过 RouteLife 来监听路由的生命周期事件。以下是一个简单的示例:

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

class HomePage extends StatefulWidget {
  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with RouteLifeMixin {
  [@override](/user/override)
  void onRoutePushed() {
    // 当路由被推入时调用
    print('HomePage pushed');
  }

  [@override](/user/override)
  void onRoutePopped() {
    // 当路由被弹出时调用
    print('HomePage popped');
  }

  [@override](/user/override)
  void onRouteActivated() {
    // 当路由变为活动状态时调用
    print('HomePage activated');
  }

  [@override](/user/override)
  void onRouteInactivated() {
    // 当路由变为非活动状态时调用
    print('HomePage inactivated');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => SecondPage()),
            );
          },
          child: Text('Go to Second Page'),
        ),
      ),
    );
  }
}

class SecondPage extends StatefulWidget {
  [@override](/user/override)
  _SecondPageState createState() => _SecondPageState();
}

class _SecondPageState extends State<SecondPage> with RouteLifeMixin {
  [@override](/user/override)
  void onRoutePushed() {
    print('SecondPage pushed');
  }

  [@override](/user/override)
  void onRoutePopped() {
    print('SecondPage popped');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text('Go back'),
        ),
      ),
    );
  }
}
回到顶部