dynamic_drawer.dart.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import 'package:flutter/material.dart';
  2. final _builderMap = <GlobalKey<ScaffoldState>, WidgetBuilder>{};
  3. class VDrawer extends StatelessWidget {
  4. final Widget? child;
  5. final double? width;
  6. final String? title;
  7. final GlobalKey<ScaffoldState>? scaffoldKey;
  8. final VoidCallback? onConfirm;
  9. const VDrawer({
  10. super.key,
  11. this.child,
  12. this.width,
  13. this.title,
  14. this.scaffoldKey,
  15. this.onConfirm,
  16. });
  17. @override
  18. Widget build(BuildContext context) {
  19. return Drawer(
  20. shadowColor: Colors.black.withOpacity(.1),
  21. backgroundColor: Colors.white,
  22. shape: RoundedRectangleBorder(
  23. borderRadius: BorderRadius.circular(16),
  24. ),
  25. elevation: 0,
  26. width: width,
  27. child: Container(
  28. alignment: Alignment.topLeft,
  29. padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 12),
  30. child: Column(
  31. mainAxisSize: MainAxisSize.min,
  32. children: _buildChildren(context),
  33. ),
  34. ),
  35. );
  36. }
  37. List<Widget> _buildChildren(BuildContext context) {
  38. final children = <Widget>[];
  39. final header = _buildHeader();
  40. if (header != null) {
  41. children.add(header);
  42. }
  43. if (child != null) {
  44. children.add(Expanded(child: child!));
  45. }
  46. return children;
  47. }
  48. Widget? _buildHeader() {
  49. final children = <Widget>[];
  50. const btnTextStyle = TextStyle(fontSize: 20);
  51. if (scaffoldKey != null) {
  52. children.add(
  53. TextButton(
  54. onPressed: () {
  55. scaffoldKey!.currentState?.closeEndDrawer();
  56. },
  57. child: const Text("取消", style: btnTextStyle),
  58. ),
  59. );
  60. }
  61. if (title != null) {
  62. children.add(Text(
  63. title!,
  64. style: TextStyle(color: Colors.grey.shade700, fontSize: 20),
  65. ));
  66. }
  67. if (onConfirm != null) {
  68. children.add(
  69. TextButton(
  70. onPressed: () {
  71. onConfirm?.call();
  72. },
  73. child: const Text("确定", style: btnTextStyle),
  74. ),
  75. );
  76. }
  77. if (children.isEmpty) return null;
  78. return Row(
  79. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  80. crossAxisAlignment: CrossAxisAlignment.center,
  81. children: children,
  82. );
  83. }
  84. }
  85. class VDynamicDrawerWrapper extends StatefulWidget {
  86. final GlobalKey<ScaffoldState> scaffoldKey;
  87. const VDynamicDrawerWrapper({super.key, required this.scaffoldKey});
  88. @override
  89. State<StatefulWidget> createState() => _VDynamicDrawerWrapperState();
  90. static void show({
  91. required GlobalKey<ScaffoldState> scaffoldKey,
  92. required WidgetBuilder builder,
  93. }) {
  94. _builderMap[scaffoldKey] = builder;
  95. scaffoldKey.currentState?.openEndDrawer();
  96. }
  97. static void hide({required GlobalKey<ScaffoldState> scaffoldKey}) {
  98. scaffoldKey.currentState?.closeEndDrawer();
  99. }
  100. }
  101. class _VDynamicDrawerWrapperState extends State<VDynamicDrawerWrapper> {
  102. @override
  103. Widget build(BuildContext context) {
  104. final builder = _builderMap[widget.scaffoldKey];
  105. if (builder != null) {
  106. return builder(context);
  107. }
  108. return const SizedBox();
  109. }
  110. }