Flutter状态路由管理插件tree_state_router的使用
Flutter状态路由管理插件tree_state_router的使用
tree_state_router
是一个为 Flutter 设计的路由包,它可以根据应用中的状态变化提供导航。它与 tree_state_machine
一起工作,使应用程序能够根据状态的变化进行声明性路由。
特点
- 基于 Router API 的 Flutter 路由器
- 支持基于
TreeStateMachine
活跃状态的声明性路由 - 支持嵌套路由器
- 支持 URL 路径和深度链接
文档
可以查看以下主题的 API 文档以获取更多详细信息:
声明性路由
在大多数情况下,使用 tree_state_router
进行声明性路由是最常用的方法。但是,你也可以通过 Navigator
推入和弹出路由。需要注意的是,任何导致新的 StateRoute
被激活的状态机转换会移除导航堆栈中的任何指令式路由。此外,不支持命名路由,如果调用了任何与命名路由相关的 Navigator
方法,则会抛出错误。
完整示例代码
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:tree_state_machine/delegate_builders.dart';
import 'package:tree_state_machine/delegate_builders.dart' as b;
import 'package:tree_state_machine/tree_state_machine.dart';
import 'package:tree_state_router/tree_state_router.dart';
// 初始化日志记录
void _initLogging() {
hierarchicalLoggingEnabled = true;
}
// 定义简单状态树
class States {
static const state1 = StateKey('state1');
static const state2 = StateKey('state2');
}
class AMessage {}
StateTree simpleStateTree() {
return StateTree(
InitialChild(States.state1), // 初始状态为 state1
childStates: [
b.State(
States.state1,
onMessage: (ctx) => switch (ctx.message) {
AMessage() => ctx.goTo(States.state2), // 接收到 AMessage 后跳转到 state2
_ => ctx.unhandled() // 其他情况忽略
},
),
b.State(States.state2), // 状态 state2
],
);
}
// 定义与状态树中的状态对应的路由
var router = TreeStateRouter(
stateMachine: TreeStateMachine(simpleStateTree()), // 使用定义好的状态树
defaultScaffolding: (_, pageContent) => Scaffold(body: pageContent), // 默认的 Scaffold
enableDeveloperLogging: true, // 开发者日志
routes: [
StateRoute(
States.state1,
path: RoutePath('s1'), // 路径为 /s1
routeBuilder: (BuildContext ctx, StateRoutingContext stateCtx) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('这是状态 1'), // 显示文本 "这是状态 1"
ElevatedButton(
onPressed: () => stateCtx.currentState.post(AMessage()), // 发送 AMessage 到状态机
child: const Text('发送消息'), // 按钮文本为 "发送消息"
)
],
),
);
},
),
StateRoute(
States.state2,
path: RoutePath('s2'), // 路径为 /s2
routeBuilder: (BuildContext ctx, StateRoutingContext stateCtx) {
return const Center(child: Text('这是状态 2')); // 显示文本 "这是状态 2"
},
),
],
);
// 创建一个基于 Material 的应用程序,并使用 TreeStateRouter
class MainApp extends StatelessWidget {
const MainApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp.router(
routerConfig: router, // 使用定义好的路由器
);
}
}
void main() {
_initLogging(); // 初始化日志
runApp(const MainApp()); // 运行应用程序
}
更多关于Flutter状态路由管理插件tree_state_router的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter状态路由管理插件tree_state_router的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
tree_state_router
是一个用于 Flutter 的状态路由管理插件,它结合了状态管理和路由管理,允许你以声明式的方式管理应用的路由和状态。这个插件特别适合那些需要复杂状态管理和路由导航的应用程序。
安装
首先,你需要在 pubspec.yaml
文件中添加 tree_state_router
依赖:
dependencies:
flutter:
sdk: flutter
tree_state_router: ^1.0.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
基本用法
-
定义状态和路由
你可以通过定义状态和路由来管理应用的不同页面和状态。
import 'package:flutter/material.dart'; import 'package:tree_state_router/tree_state_router.dart'; // 定义状态 enum AppState { home, details } // 定义路由 final appRouter = TreeStateRouter<AppState>( stateRoutes: { AppState.home: StateRoute( builder: (context) => HomeScreen(), ), AppState.details: StateRoute( builder: (context) => DetailsScreen(), ), }, ); // 主应用 void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: TreeStateRouterBuilder<AppState>( router: appRouter, initialState: AppState.home, ), ); } } // 首页 class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Home')), body: Center( child: ElevatedButton( onPressed: () { // 导航到详情页 TreeStateRouter.of<AppState>(context).go(AppState.details); }, child: Text('Go to Details'), ), ), ); } } // 详情页 class DetailsScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Details')), body: Center( child: ElevatedButton( onPressed: () { // 返回首页 TreeStateRouter.of<AppState>(context).go(AppState.home); }, child: Text('Back to Home'), ), ), ); } }
-
状态管理
tree_state_router
允许你在状态之间传递数据。你可以通过StateRoute
的data
参数来传递数据。final appRouter = TreeStateRouter<AppState>( stateRoutes: { AppState.home: StateRoute( builder: (context) => HomeScreen(), ), AppState.details: StateRoute( builder: (context) { final data = TreeStateRouter.of<AppState>(context).routeData; return DetailsScreen(data: data); }, ), }, ); // 在导航时传递数据 TreeStateRouter.of<AppState>(context).go(AppState.details, data: 'Some data');
-
嵌套路由
tree_state_router
支持嵌套路由,你可以定义多个层级的路由。final appRouter = TreeStateRouter<AppState>( stateRoutes: { AppState.home: StateRoute( builder: (context) => HomeScreen(), children: { AppState.details: StateRoute( builder: (context) => DetailsScreen(), ), }, ), }, );
-
监听状态变化
你可以通过
TreeStateRouterBuilder
的onStateChanged
回调来监听状态的变化。TreeStateRouterBuilder<AppState>( router: appRouter, initialState: AppState.home, onStateChanged: (newState) { print('State changed to $newState'); }, );