Flutter底部抽屉导航插件flutter_bottom_drawer的使用
Flutter底部抽屉导航插件flutter_bottom_drawer的使用
简介
flutter_bottom_drawer
是一个用于在 Flutter 应用中实现底部抽屉导航功能的插件。与传统的底部抽屉不同,它不需要设置默认高度,并且可以动态调整高度以满足不同的需求。
如何使用
完整的使用示例可以在以下链接找到:example。
示例代码
以下是一个完整的示例代码,展示了如何使用 flutter_bottom_drawer
插件来创建一个底部抽屉导航。
import 'package:flutter/material.dart';
import 'package:flutter_bottom_drawer/flutter_bottom_drawer.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
textTheme: const TextTheme(
bodyMedium: TextStyle(fontSize: 16),
)),
debugShowCheckedModeBanner: false,
home: const ExamplePage());
}
}
class ExamplePage extends StatefulWidget {
const ExamplePage({Key? key}) : super(key: key);
[@override](/user/override)
State<ExamplePage> createState() => _ExamplePageState();
}
class _ExamplePageState extends State<ExamplePage> {
late DrawerMoveController drawerController;
double drawerHeight = 0;
DrawerState? drawerState;
bool isDark = false;
Color get backgroundColor =>
isDark ? Colors.grey.shade900 : Colors.grey.shade50;
Color get textColor =>
isDark ? Colors.white : Colors.black;
Color get drawerHandleColor =>
isDark ? Colors.grey.shade700 : Colors.grey.shade300;
Color get drawerBackgroundColor =>
isDark ? Colors.grey.shade800 : Colors.white;
Color get drawerShadowColor =>
isDark ? Colors.white24 : Colors.black26;
[@override](/user/override)
void initState() {
isDark =
WidgetsBinding.instance.window.platformBrightness == Brightness.dark;
super.initState();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Stack(children: [
Positioned.fill(child: _mainSection()),
_bottomDrawer(),
// _bottomDrawerWithListView(),
]);
}
Widget _mainSection() => Scaffold(
backgroundColor: backgroundColor,
body: Stack(children: [
Positioned.fill(bottom: drawerHeight, child: _contents()),
_fab(bottomMargin: 16 + drawerHeight),
]));
Widget _contents() => ListView.builder(
itemCount: 100,
itemBuilder: (context, index) => ListTile(
title: Text('item $index', style: TextStyle(color: textColor))));
Widget _fab({double rightMargin = 16, double bottomMargin = 16}) =>
Positioned(
right: rightMargin,
bottom: bottomMargin,
child: FloatingActionButton(
onPressed: bottomDrawerMove,
child: drawerState == DrawerState.opened ||
drawerState == DrawerState.closing
? const Icon(Icons.arrow_downward)
: const Icon(Icons.arrow_upward),
));
void bottomDrawerMove() {
drawerController.move(drawerState != DrawerState.opened);
setState(() {});
}
bool expanded = false;
Widget _bottomDrawer() => BottomDrawer(
expandedHeight: 500,
handleColor: drawerHandleColor,
backgroundColor: drawerBackgroundColor,
shadows: [
BoxShadow(
offset: const Offset(0, 2),
blurRadius: 4,
color: drawerShadowColor,
)
],
onReady: (controller) => drawerController = controller,
onStateChanged: (state) {
setState(() => drawerState = state);
},
onHeightChanged: (height) {
setState(() => drawerHeight = height);
},
builder: (state, setState, context) {
setStateOnDrawer = setState;
return Container(
padding: EdgeInsets.symmetric(
horizontal: 16, vertical: expanded ? 128 : 48),
child: Center(
child: Column(mainAxisSize: MainAxisSize.min, children: [
Text("state: $state", style: TextStyle(color: textColor)),
const SizedBox(height: 8),
Row(mainAxisSize: MainAxisSize.min, children: [
ElevatedButton(
onPressed: () {
setStateOnDrawer(() => expanded = !expanded);
},
child: Text(expanded ? 'flip' : 'expand')),
])
])));
});
late Function(Function()) setStateOnDrawer;
Widget _bottomDrawerWithListView() => BottomDrawer(
height: 300,
expandedHeight: 500,
handleColor: drawerHandleColor,
backgroundColor: drawerBackgroundColor,
onReady: (controller) => drawerController = controller,
onStateChanged: (state) => setState(() => drawerState = state),
onHeightChanged: (height) => setState(() => drawerHeight = height),
builder: (state, setState, context) {
setStateOnDrawer = setState;
return ListView.builder(
physics: state == DrawerState.opened
? const BouncingScrollPhysics()
: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) => ListTile(
onTap: () {},
title: Text(index == 0 ? state.toString() : 'item $index',
style: TextStyle(color: textColor)),
subtitle: Text('subtitle $index',
style: TextStyle(color: textColor.withOpacity(0.5))),
),
itemCount: 100,
);
});
}
更多关于Flutter底部抽屉导航插件flutter_bottom_drawer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter底部抽屉导航插件flutter_bottom_drawer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_bottom_drawer
是一个用于在 Flutter 应用中创建底部抽屉导航的插件。它允许用户从屏幕底部向上滑动以打开一个抽屉,通常用于显示额外的导航选项或内容。
安装
首先,你需要在 pubspec.yaml
文件中添加 flutter_bottom_drawer
依赖:
dependencies:
flutter:
sdk: flutter
flutter_bottom_drawer: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
使用
以下是一个简单的示例,展示如何使用 flutter_bottom_drawer
插件:
import 'package:flutter/material.dart';
import 'package:flutter_bottom_drawer/flutter_bottom_drawer.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Bottom Drawer Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: BottomDrawerExample(),
);
}
}
class BottomDrawerExample extends StatefulWidget {
[@override](/user/override)
_BottomDrawerExampleState createState() => _BottomDrawerExampleState();
}
class _BottomDrawerExampleState extends State<BottomDrawerExample> {
final BottomDrawerController _drawerController = BottomDrawerController();
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Bottom Drawer'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
_drawerController.open();
},
child: Text('Open Bottom Drawer'),
),
),
bottomNavigationBar: BottomDrawer(
controller: _drawerController,
header: Container(
height: 50,
color: Colors.blue,
child: Center(
child: Text(
'Header',
style: TextStyle(color: Colors.white, fontSize: 20),
),
),
),
body: ListView(
children: [
ListTile(
title: Text('Item 1'),
onTap: () {
print('Item 1 tapped');
_drawerController.close();
},
),
ListTile(
title: Text('Item 2'),
onTap: () {
print('Item 2 tapped');
_drawerController.close();
},
),
ListTile(
title: Text('Item 3'),
onTap: () {
print('Item 3 tapped');
_drawerController.close();
},
),
],
),
),
);
}
}