Flutter底部导航插件tn_bottom_sheet_navigator的使用
Flutter底部导航插件tn_bottom_sheet_navigator的使用
TnBottomSheetNavigator 是一个允许Flutter应用程序在模态底部导航栏中进行内部导航的插件,其高度可以根据内容进行调整。
平台支持
Android | iOS |
---|---|
✅ | ✅ |
要求
- Flutter >=3.3.0
- Dart >=2.18.0 <4.0.0
使用方法
初始化
你需要在主文件中初始化将在模态底部导航栏中使用的路由,必须在runApp
执行之前完成。
// 定义底部导航栏的路由
final bottomSheetRoutes = [
TnBottomSheetRoute(
path: 'signin',
builder: (context, params) => const SignInPage(),
),
TnBottomSheetRoute(
path: 'signup',
builder: (context, params) => const SignUpPage(),
),
TnBottomSheetRoute(
path: 'forgot-password',
builder: (context, params) => ForgotPasswordPage(
email: params['email'],
),
),
];
void main() {
// 设置路由
TnRouter()..setRoutes(bottomSheetRoutes);
runApp(app); // 启动应用
}
显示模态底部导航栏
一旦你设置了将要被模态底部导航栏消费的路由,你就可以打开底部导航栏。
// 打开底部导航栏的方法
void _onOpenBottomNav(BuildContext context) {
showTnBottomSheetNavigator(context, initialPath: 'signin');
}
// 或者使用BuildContext扩展
void _onOpenBottomNav(BuildContext context) {
context.showTnBottomSheetNav('signin');
}
这将打开具有默认设置(TnBottomSheetSettings)和没有参数的初始路径的模态底部导航栏。
// TnBottomSheetSettings 的选项
TnBottomSheetSettings(
bool isDismisable = false,
bool isScrollControlled = true,
bool useRootNavigator = true,
BoxConstraints? constraints,
)
导航
在页面内可以使用以下方法进行内部导航:
// 添加新路由到堆栈
context.tnPush('signup');
// 清除导航堆栈
context.tnGo('signup');
// 移除最后的路由
context.tnPop();
带参数的导航
你可以通过传递参数来导航:
// 推送带参数的路由
context.tnPush('forgot-password', params: { 'email': 'test@email.com' });
// 在初始路径上打开底部导航栏并传入参数
context.showTnBottomSheetNav('forgot-password', params: { 'email': 'test@email.com' });
TnBottomSheetScaffold
你可以使用自定义的scaffold来实现隐式导航控制:
return TnBottomSheetScaffold(
appBar: TnBottomSheetAppBar(title: 'Sign in'),
child: Container(...),
);
TnBottomSheetAppBar 可以自定义如下属性:
TnBottomSheetAppBar(
title: // 标题字符串
customTitle: // 自定义标题组件(如果需要更复杂的标题而不是简单的字符串)。如果传递了字符串标题,则不会显示customTitle
showCloseIcon: // 控制是否显示关闭图标(此图标可以关闭底部导航栏,不管dismissable值如何)
theme: // TnBottomSheetAppBarTheme 来自定义一些元素的样式
)
// TnBottomSheetAppBarTheme 的可定制属性
TnBottomSheetAppBarTheme(
closeIconSize: // 关闭图标的大小
titleTextTyle: // 字符串标题的文本样式
padding: // TnBottomSheetAppBar 的填充
)
自定义实现 (TnNavigatorBuilder)
如果你需要在对话框或其他地方进行导航,可以使用TnNavigatorBuilder:
TnNavigatorBuilder(
initialPath: 'signin',
params: {"key": "param"},
),
// 在对话框中使用
showDialog(
context: context,
builder: (context) => const AlertDialog(
content: Material(
color: Colors.transparent, // 避免对话框背景出现奇怪的外观
child: TnNavigatorBuilder(initialPath: 'signin'),
),
),
);
// 在Cupertino对话框中使用
showCupertinoDialog(
context: context,
builder: (context) => const CupertinoAlertDialog(
content: Material(
color: Colors.transparent, // 避免对话框背景出现奇怪的外观
child: TnNavigatorBuilder(initialPath: 'signin'),
),
),
);
完整示例Demo
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:tn_bottom_sheet_navigator/tn_bottom_sheet_navigator.dart';
import 'bottom_sheet_pages/forgot_password_page.dart';
import 'bottom_sheet_pages/signin_page.dart';
import 'bottom_sheet_pages/signup_page.dart';
void main() {
// 设置路由
TnRouter().setRoutes([
TnBottomSheetRoute(
path: 'forgot-password',
builder: (context, params) => ForgotPasswordPage(
email: params['email'],
),
),
TnBottomSheetRoute(
path: 'signin',
builder: (_, __) => SignInPage(),
),
TnBottomSheetRoute(
path: 'signup',
builder: (_, __) => const SignUpPage(),
),
]);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'TnBottomSheetNavigator Sample',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
primaryColor: Colors.lightBlue,
),
home: const AppContent(),
);
}
}
class AppContent extends StatelessWidget {
const AppContent({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('TnBottomSheetNavigator')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
child: const Text('Open Bottom Sheet Navigator'),
onPressed: () => context.showTnBottomSheetNav(
'signin',
settings: const TnBottomSheetSettings(
isDismisable: true,
),
),
),
const SizedBox(height: 20),
const Text('Custom Implementations',
style: TextStyle(
fontSize: 20,
)),
const SizedBox(height: 20),
ElevatedButton(
child: const Text('Cupertino Dialog'),
onPressed: () => showCupertinoDialog(
context: context,
builder: (context) => const CupertinoAlertDialog(
content: Material(
color: Colors
.transparent, // 避免对话框背景出现奇怪的外观
child: TnNavigatorBuilder(initialPath: 'signin'),
),
),
),
),
const SizedBox(height: 20),
ElevatedButton(
child: const Text('Dialog'),
onPressed: () => showDialog(
context: context,
builder: (context) => const AlertDialog(
content: Material(
color: Colors
.transparent, // 避免对话框背景出现奇怪的外观
child: TnNavigatorBuilder(initialPath: 'signin'),
),
),
),
),
],
),
),
);
}
}
更多关于Flutter底部导航插件tn_bottom_sheet_navigator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter底部导航插件tn_bottom_sheet_navigator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter中使用tn_bottom_sheet_navigator
插件的示例代码。这个插件通常用于实现底部导航栏和底部表单(Bottom Sheet)的导航功能。以下是一个基本的实现示例:
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加tn_bottom_sheet_navigator
依赖:
dependencies:
flutter:
sdk: flutter
tn_bottom_sheet_navigator: ^最新版本号 # 请替换为实际最新版本号
然后运行flutter pub get
来安装依赖。
2. 导入包
在你的Dart文件中导入该包:
import 'package:flutter/material.dart';
import 'package:tn_bottom_sheet_navigator/tn_bottom_sheet_navigator.dart';
3. 创建主应用
下面是一个简单的示例,展示了如何使用TnBottomSheetNavigator
来管理底部导航和底部表单:
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final TnBottomSheetNavigator _navigator = TnBottomSheetNavigator();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('TnBottomSheetNavigator Demo'),
),
body: Navigator(
onGenerateRoute: _navigator.generateRoute,
),
bottomNavigationBar: BottomNavigationBar(
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
label: 'Home',
),
BottomNavigationBarItem(
icon: Icon(Icons.settings),
label: 'Settings',
),
],
currentIndex: _navigator.currentIndex,
onTap: (index) {
_navigator.currentIndex = index;
_navigator.popUntil((route) => route.settings?.name == '/home' || route.settings?.name == '/settings');
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
_navigator.pushNamed('/bottom_sheet');
},
tooltip: 'Show Bottom Sheet',
child: Icon(Icons.add),
),
);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text('Home Screen'),
);
}
}
class SettingsScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text('Settings Screen'),
);
}
}
class BottomSheetScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
child: Center(
child: Text('Bottom Sheet Screen'),
),
);
}
}
void configureRoutes(TnBottomSheetNavigator navigator) {
navigator.define('/home', (context) => HomeScreen());
navigator.define('/settings', (context) => SettingsScreen());
navigator.define('/bottom_sheet', (context) => BottomSheet(
builder: (context) => BottomSheetScreen(),
backgroundColor: Colors.transparent,
elevation: 0,
));
}
4. 配置路由
在MyHomePage
的initState
方法中配置路由:
@override
void initState() {
super.initState();
configureRoutes(_navigator);
}
5. 运行应用
现在,你可以运行你的Flutter应用,并看到带有底部导航栏和浮动操作按钮(FAB)的主屏幕。点击FAB会显示一个底部表单,而底部导航栏将允许你在“Home”和“Settings”屏幕之间切换。
这个示例展示了如何使用tn_bottom_sheet_navigator
插件来管理Flutter应用中的导航。根据你的需求,你可以进一步自定义和扩展这个示例。