Skip to content

Commit e243ee4

Browse files
author
JZoom
committed
1.1.0
1 parent 89d692a commit e243ee4

14 files changed

+1025
-223
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
* Fix index change bug when switchStyle=DropdownMenuShowHideSwitchStyle.directHideAnimationShow
66
* Add index change swith animation style : DropdownMenuShowHideSwitchStyle.directHideDirectShow
77

8+
## [1.1.0] - [2018/05/27]
9+
* Add fix-head DorpdownMenu
10+
* Add scrollview DropdownMenu
811

912

1013

example/images/body.jpg

41.8 KB
Loading

example/images/header.jpg

113 KB
Loading

example/lib/main.dart

Lines changed: 287 additions & 118 deletions
Large diffs are not rendered by default.

example/pubspec.lock

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ packages:
9898
path: ".."
9999
relative: true
100100
source: path
101-
version: "1.0.0"
101+
version: "1.1.0"
102102
flutter:
103103
dependency: "direct main"
104104
description: flutter
@@ -402,4 +402,5 @@ packages:
402402
source: hosted
403403
version: "2.1.13"
404404
sdks:
405-
dart: ">=2.0.0-dev.28.0 <=2.0.0-edge.c080951d45e79cd25df98036c4be835b284a269c"
405+
dart: ">=2.0.0-dev.48.0 <=2.0.0-edge.c080951d45e79cd25df98036c4be835b284a269c"
406+
flutter: ">=0.1.4 <3.0.0"

example/pubspec.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ flutter:
3030
# the material Icons class.
3131
uses-material-design: true
3232

33+
assets:
34+
- images/header.jpg
35+
- images/body.jpg
3336
# To add assets to your application, add an assets section, like this:
3437
# assets:
3538
# - images/a_dot_burr.jpeg

flutter_dropdown_menu.iml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<excludeFolder url="file://$MODULE_DIR$/example/.dart_tool" />
1313
<excludeFolder url="file://$MODULE_DIR$/example/.pub" />
1414
<excludeFolder url="file://$MODULE_DIR$/example/build" />
15+
<excludeFolder url="file://$MODULE_DIR$/example/ios/Flutter/flutter_assets/packages" />
1516
</content>
1617
<orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
1718
<orderEntry type="sourceFolder" forTests="false" />

lib/drapdown_common.dart

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
import 'package:flutter/widgets.dart';
2+
import 'package:flutter/foundation.dart';
3+
4+
enum DropdownEvent {
5+
// the menu will hide
6+
HIDE,
7+
8+
// the menu will active
9+
ACTIVE,
10+
11+
// user has click menu item
12+
SELECT
13+
}
14+
15+
class DropdownMenuController extends ChangeNotifier {
16+
//user interaction event name
17+
DropdownEvent event;
18+
19+
// whitch menu index
20+
int menuIndex;
21+
22+
/// selected data
23+
dynamic data;
24+
25+
/// item index in list [TreeMenuList] or [MenuList] or your custom menu
26+
int index;
27+
28+
/// item index in sublist of [TreeMenuList]
29+
int subIndex;
30+
31+
void hide() {
32+
event = DropdownEvent.HIDE;
33+
notifyListeners();
34+
}
35+
36+
void show(int index) {
37+
event = DropdownEvent.ACTIVE;
38+
menuIndex = index;
39+
notifyListeners();
40+
}
41+
42+
void select(dynamic data, {int index, int subIndex}) {
43+
event = DropdownEvent.SELECT;
44+
this.data = data;
45+
this.index = index;
46+
this.subIndex = subIndex;
47+
notifyListeners();
48+
}
49+
}
50+
51+
typedef DropdownMenuOnSelected(
52+
{int menuIndex, int index, int subIndex, dynamic data});
53+
54+
class DefaultDropdownMenuController extends StatefulWidget {
55+
const DefaultDropdownMenuController({
56+
Key key,
57+
@required this.child,
58+
this.onSelected,
59+
}) : super(key: key);
60+
61+
final Widget child;
62+
63+
final DropdownMenuOnSelected onSelected;
64+
65+
static DropdownMenuController of(BuildContext context) {
66+
final _DropdownMenuControllerScope scope =
67+
context.inheritFromWidgetOfExactType(_DropdownMenuControllerScope);
68+
return scope?.controller;
69+
}
70+
71+
@override
72+
_DefaultDropdownMenuControllerState createState() =>
73+
new _DefaultDropdownMenuControllerState();
74+
}
75+
76+
class _DefaultDropdownMenuControllerState
77+
extends State<DefaultDropdownMenuController>
78+
with SingleTickerProviderStateMixin {
79+
DropdownMenuController _controller;
80+
81+
@override
82+
void initState() {
83+
super.initState();
84+
_controller = new DropdownMenuController();
85+
_controller.addListener(_onController);
86+
}
87+
88+
void _onController() {
89+
switch (_controller.event) {
90+
case DropdownEvent.SELECT:
91+
{
92+
//通知widget
93+
if (widget.onSelected == null) return;
94+
widget.onSelected(
95+
data: _controller.data,
96+
menuIndex: _controller.menuIndex,
97+
index: _controller.index,
98+
subIndex: _controller.subIndex);
99+
}
100+
break;
101+
case DropdownEvent.ACTIVE:
102+
break;
103+
case DropdownEvent.HIDE:
104+
break;
105+
}
106+
}
107+
108+
@override
109+
void dispose() {
110+
_controller.removeListener(_onController);
111+
_controller.dispose();
112+
super.dispose();
113+
}
114+
115+
@override
116+
Widget build(BuildContext context) {
117+
return new _DropdownMenuControllerScope(
118+
controller: _controller,
119+
enabled: TickerMode.of(context),
120+
child: widget.child,
121+
);
122+
}
123+
}
124+
125+
class _DropdownMenuControllerScope extends InheritedWidget {
126+
const _DropdownMenuControllerScope(
127+
{Key key, this.controller, this.enabled, Widget child})
128+
: super(key: key, child: child);
129+
130+
final DropdownMenuController controller;
131+
final bool enabled;
132+
133+
@override
134+
bool updateShouldNotify(_DropdownMenuControllerScope old) {
135+
return enabled != old.enabled || controller != old.controller;
136+
}
137+
}
138+
139+
abstract class DropdownWidget extends StatefulWidget {
140+
final DropdownMenuController controller;
141+
142+
DropdownWidget({Key key, this.controller}) : super(key: key);
143+
144+
@override
145+
DropdownState<DropdownWidget> createState();
146+
}
147+
148+
abstract class DropdownState<T extends DropdownWidget> extends State<T> {
149+
DropdownMenuController controller;
150+
151+
@override
152+
void dispose() {
153+
if (controller != null) {
154+
controller.removeListener(_onController);
155+
}
156+
super.dispose();
157+
}
158+
159+
@override
160+
void didChangeDependencies() {
161+
if (widget.controller == null) {
162+
controller = DefaultDropdownMenuController.of(context);
163+
} else {
164+
controller = widget.controller;
165+
}
166+
167+
if (controller != null) {
168+
controller.addListener(_onController);
169+
}
170+
super.didChangeDependencies();
171+
}
172+
173+
@override
174+
void didUpdateWidget(T oldWidget) {
175+
if (widget.controller != null) {
176+
if (controller != null) {
177+
controller.removeListener(_onController);
178+
}
179+
controller = widget.controller;
180+
controller.addListener(_onController);
181+
}
182+
183+
super.didUpdateWidget(oldWidget);
184+
}
185+
186+
void _onController() {
187+
onEvent(controller.event);
188+
}
189+
190+
void onEvent(DropdownEvent event);
191+
}
192+
193+
class DropdownMenuBuilder {
194+
final WidgetBuilder builder;
195+
final double height;
196+
197+
//if height == null , use [DropdownMenu.maxMenuHeight]
198+
DropdownMenuBuilder({@required this.builder, this.height})
199+
: assert(builder != null);
200+
}

0 commit comments

Comments
 (0)