Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
d61f7809
Commit
d61f7809
authored
Apr 01, 2016
by
Andrew Wilson
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #3012 from apwilson/leave
Leave all entered targets when finishing.
parents
d8155347
f516dbcc
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
293 additions
and
320 deletions
+293
-320
drag_target.dart
packages/flutter/lib/src/widgets/drag_target.dart
+17
-15
draggable_test.dart
packages/flutter/test/widget/draggable_test.dart
+276
-305
No files found.
packages/flutter/lib/src/widgets/drag_target.dart
View file @
d61f7809
...
@@ -391,7 +391,7 @@ class _DragAvatar<T> extends Drag {
...
@@ -391,7 +391,7 @@ class _DragAvatar<T> extends Drag {
final
_OnDragEnd
onDragEnd
;
final
_OnDragEnd
onDragEnd
;
_DragTargetState
<
T
>
_activeTarget
;
_DragTargetState
<
T
>
_activeTarget
;
List
<
_DragTargetState
<
T
>>
_
last
Targets
=
<
_DragTargetState
<
T
>>[];
List
<
_DragTargetState
<
T
>>
_
entered
Targets
=
<
_DragTargetState
<
T
>>[];
Point
_position
;
Point
_position
;
Offset
_lastOffset
;
Offset
_lastOffset
;
OverlayEntry
_entry
;
OverlayEntry
_entry
;
...
@@ -422,12 +422,12 @@ class _DragAvatar<T> extends Drag {
...
@@ -422,12 +422,12 @@ class _DragAvatar<T> extends Drag {
List
<
_DragTargetState
<
T
>>
targets
=
_getDragTargets
(
result
.
path
).
toList
();
List
<
_DragTargetState
<
T
>>
targets
=
_getDragTargets
(
result
.
path
).
toList
();
bool
listsMatch
=
false
;
bool
listsMatch
=
false
;
if
(
targets
.
length
>=
_
lastTargets
.
length
&&
_last
Targets
.
isNotEmpty
)
{
if
(
targets
.
length
>=
_
enteredTargets
.
length
&&
_entered
Targets
.
isNotEmpty
)
{
listsMatch
=
true
;
listsMatch
=
true
;
Iterator
<
_DragTargetState
<
T
>>
iterator
=
targets
.
iterator
;
Iterator
<
_DragTargetState
<
T
>>
iterator
=
targets
.
iterator
;
for
(
int
i
=
0
;
i
<
_
last
Targets
.
length
;
i
+=
1
)
{
for
(
int
i
=
0
;
i
<
_
entered
Targets
.
length
;
i
+=
1
)
{
iterator
.
moveNext
();
iterator
.
moveNext
();
if
(
iterator
.
current
!=
_
last
Targets
[
i
])
{
if
(
iterator
.
current
!=
_
entered
Targets
[
i
])
{
listsMatch
=
false
;
listsMatch
=
false
;
break
;
break
;
}
}
...
@@ -439,13 +439,11 @@ class _DragAvatar<T> extends Drag {
...
@@ -439,13 +439,11 @@ class _DragAvatar<T> extends Drag {
return
;
return
;
// Leave old targets.
// Leave old targets.
for
(
int
i
=
0
;
i
<
_lastTargets
.
length
;
i
+=
1
)
_leaveAllEntered
();
_lastTargets
[
i
].
didLeave
(
data
);
_lastTargets
.
clear
();
// Enter new targets.
// Enter new targets.
_DragTargetState
<
T
>
newTarget
=
targets
.
firstWhere
((
_DragTargetState
<
T
>
target
)
{
_DragTargetState
<
T
>
newTarget
=
targets
.
firstWhere
((
_DragTargetState
<
T
>
target
)
{
_
last
Targets
.
add
(
target
);
_
entered
Targets
.
add
(
target
);
return
target
.
didEnter
(
data
);
return
target
.
didEnter
(
data
);
},
},
orElse:
()
=>
null
orElse:
()
=>
null
...
@@ -466,16 +464,20 @@ class _DragAvatar<T> extends Drag {
...
@@ -466,16 +464,20 @@ class _DragAvatar<T> extends Drag {
}
}
}
}
void
_leaveAllEntered
()
{
for
(
int
i
=
0
;
i
<
_enteredTargets
.
length
;
i
+=
1
)
_enteredTargets
[
i
].
didLeave
(
data
);
_enteredTargets
.
clear
();
}
void
finish
(
_DragEndKind
endKind
,
[
Velocity
velocity
])
{
void
finish
(
_DragEndKind
endKind
,
[
Velocity
velocity
])
{
bool
wasAccepted
=
false
;
bool
wasAccepted
=
false
;
if
(
_activeTarget
!=
null
)
{
if
(
endKind
==
_DragEndKind
.
dropped
&&
_activeTarget
!=
null
)
{
if
(
endKind
==
_DragEndKind
.
dropped
&&
_activeTarget
!=
null
)
{
_activeTarget
.
didDrop
(
data
);
_activeTarget
.
didDrop
(
data
);
wasAccepted
=
true
;
wasAccepted
=
true
;
}
else
{
_enteredTargets
.
remove
(
_activeTarget
);
_activeTarget
.
didLeave
(
data
);
}
}
}
_leaveAllEntered
();
_activeTarget
=
null
;
_activeTarget
=
null
;
_entry
.
remove
();
_entry
.
remove
();
_entry
=
null
;
_entry
=
null
;
...
...
packages/flutter/test/widget/draggable_test.dart
View file @
d61f7809
...
@@ -11,30 +11,22 @@ void main() {
...
@@ -11,30 +11,22 @@ void main() {
testWidgets
((
WidgetTester
tester
)
{
testWidgets
((
WidgetTester
tester
)
{
List
<
int
>
accepted
=
<
int
>[];
List
<
int
>
accepted
=
<
int
>[];
tester
.
pumpWidget
(
new
MaterialApp
(
tester
.
pumpWidget
(
new
MaterialApp
(
routes:
<
String
,
WidgetBuilder
>{
routes:
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
{
'/'
:
(
BuildContext
context
)
{
return
new
Column
(
return
new
Column
(
children:
<
Widget
>[
children:
<
Widget
>[
new
Draggable
<
int
>(
new
Draggable
<
int
>(
data:
1
,
data:
1
,
child:
new
Text
(
'Source'
),
child:
new
Text
(
'Source'
),
feedback:
new
Text
(
'Dragging'
)
feedback:
new
Text
(
'Dragging'
)),
),
new
DragTarget
<
int
>(
builder:
new
DragTarget
<
int
>(
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
builder:
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
return
new
Container
(
height:
100.0
,
child:
new
Text
(
'Target'
));
return
new
Container
(
},
onAccept:
(
int
data
)
{
height:
100.0
,
child:
new
Text
(
'Target'
)
);
},
onAccept:
(
int
data
)
{
accepted
.
add
(
data
);
accepted
.
add
(
data
);
}
}),
),
]);
]);
},
},
}
}));
));
expect
(
accepted
,
isEmpty
);
expect
(
accepted
,
isEmpty
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
...
@@ -74,44 +66,31 @@ void main() {
...
@@ -74,44 +66,31 @@ void main() {
List
<
String
>
events
=
<
String
>[];
List
<
String
>
events
=
<
String
>[];
Point
firstLocation
,
secondLocation
;
Point
firstLocation
,
secondLocation
;
tester
.
pumpWidget
(
new
MaterialApp
(
tester
.
pumpWidget
(
new
MaterialApp
(
routes:
<
String
,
WidgetBuilder
>{
routes:
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
{
'/'
:
(
BuildContext
context
)
{
return
new
Column
(
return
new
Column
(
children:
<
Widget
>[
children:
<
Widget
>[
new
Draggable
<
int
>(
new
Draggable
<
int
>(
data:
1
,
data:
1
,
child:
new
Text
(
'Source'
),
child:
new
Text
(
'Source'
),
feedback:
new
Text
(
'Dragging'
)
feedback:
new
Text
(
'Dragging'
)),
),
new
Stack
(
children:
<
Widget
>[
new
Stack
(
children:
<
Widget
>[
new
GestureDetector
(
new
GestureDetector
(
behavior:
HitTestBehavior
.
opaque
,
behavior:
HitTestBehavior
.
opaque
,
onTap:
()
{
onTap:
()
{
events
.
add
(
'tap'
);
events
.
add
(
'tap'
);
},
},
child:
new
Container
(
child:
new
Container
(
child:
new
Text
(
'Button'
))),
child:
new
Text
(
'Button'
)
new
DragTarget
<
int
>(
builder:
(
BuildContext
context
,
)
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
),
new
DragTarget
<
int
>(
builder:
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
return
new
IgnorePointer
(
return
new
IgnorePointer
(
child:
new
Container
(
child:
new
Container
(
child:
new
Text
(
'Target'
)));
child:
new
Text
(
'Target'
)
},
onAccept:
(
int
data
)
{
)
);
},
onAccept:
(
int
data
)
{
events
.
add
(
'drop'
);
events
.
add
(
'drop'
);
}
}),
),
]),
]
),
]);
]);
},
},
}
}));
));
expect
(
events
,
isEmpty
);
expect
(
events
,
isEmpty
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
...
@@ -172,10 +151,9 @@ void main() {
...
@@ -172,10 +151,9 @@ void main() {
List
<
String
>
events
=
<
String
>[];
List
<
String
>
events
=
<
String
>[];
Point
firstLocation
,
secondLocation
;
Point
firstLocation
,
secondLocation
;
tester
.
pumpWidget
(
new
MaterialApp
(
tester
.
pumpWidget
(
new
MaterialApp
(
routes:
<
String
,
WidgetBuilder
>{
routes:
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
{
'/'
:
(
BuildContext
context
)
{
return
new
Column
(
return
new
Column
(
children:
<
Widget
>[
children:
<
Widget
>[
new
Draggable
<
int
>(
new
Draggable
<
int
>(
data:
1
,
data:
1
,
child:
new
GestureDetector
(
child:
new
GestureDetector
(
...
@@ -183,24 +161,17 @@ void main() {
...
@@ -183,24 +161,17 @@ void main() {
onTap:
()
{
onTap:
()
{
events
.
add
(
'tap'
);
events
.
add
(
'tap'
);
},
},
child:
new
Container
(
child:
new
Container
(
child:
new
Text
(
'Button'
))),
child:
new
Text
(
'Button'
)
feedback:
new
Text
(
'Dragging'
)),
)
new
DragTarget
<
int
>(
builder:
),
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
feedback:
new
Text
(
'Dragging'
)
),
new
DragTarget
<
int
>(
builder:
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
return
new
Text
(
'Target'
);
return
new
Text
(
'Target'
);
},
},
onAccept:
(
int
data
)
{
onAccept:
(
int
data
)
{
events
.
add
(
'drop'
);
events
.
add
(
'drop'
);
}
}),
),
]);
]);
},
},
}
}));
));
expect
(
events
,
isEmpty
);
expect
(
events
,
isEmpty
);
expect
(
tester
.
findText
(
'Button'
),
isNotNull
);
expect
(
tester
.
findText
(
'Button'
),
isNotNull
);
...
@@ -224,7 +195,6 @@ void main() {
...
@@ -224,7 +195,6 @@ void main() {
tester
.
pump
();
tester
.
pump
();
expect
(
events
,
equals
(<
String
>[
'drop'
]));
expect
(
events
,
equals
(<
String
>[
'drop'
]));
events
.
clear
();
events
.
clear
();
});
});
});
});
...
@@ -233,27 +203,22 @@ void main() {
...
@@ -233,27 +203,22 @@ void main() {
List
<
String
>
events
=
<
String
>[];
List
<
String
>
events
=
<
String
>[];
Point
firstLocation
,
secondLocation
;
Point
firstLocation
,
secondLocation
;
tester
.
pumpWidget
(
new
MaterialApp
(
tester
.
pumpWidget
(
new
MaterialApp
(
routes:
<
String
,
WidgetBuilder
>{
routes:
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
{
'/'
:
(
BuildContext
context
)
{
return
new
Column
(
return
new
Column
(
children:
<
Widget
>[
children:
<
Widget
>[
new
LongPressDraggable
<
int
>(
new
LongPressDraggable
<
int
>(
data:
1
,
data:
1
,
child:
new
Text
(
'Source'
),
child:
new
Text
(
'Source'
),
feedback:
new
Text
(
'Dragging'
)
feedback:
new
Text
(
'Dragging'
)),
),
new
DragTarget
<
int
>(
builder:
new
DragTarget
<
int
>(
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
builder:
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
return
new
Text
(
'Target'
);
return
new
Text
(
'Target'
);
},
},
onAccept:
(
int
data
)
{
onAccept:
(
int
data
)
{
events
.
add
(
'drop'
);
events
.
add
(
'drop'
);
}
}),
),
]);
]);
},
},
}
}));
));
expect
(
events
,
isEmpty
);
expect
(
events
,
isEmpty
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
...
@@ -275,7 +240,6 @@ void main() {
...
@@ -275,7 +240,6 @@ void main() {
gesture
.
up
();
gesture
.
up
();
tester
.
pump
();
tester
.
pump
();
expect
(
events
,
isEmpty
);
expect
(
events
,
isEmpty
);
});
});
});
});
...
@@ -284,27 +248,22 @@ void main() {
...
@@ -284,27 +248,22 @@ void main() {
List
<
String
>
events
=
<
String
>[];
List
<
String
>
events
=
<
String
>[];
Point
firstLocation
,
secondLocation
;
Point
firstLocation
,
secondLocation
;
tester
.
pumpWidget
(
new
MaterialApp
(
tester
.
pumpWidget
(
new
MaterialApp
(
routes:
<
String
,
WidgetBuilder
>{
routes:
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
{
'/'
:
(
BuildContext
context
)
{
return
new
Column
(
return
new
Column
(
children:
<
Widget
>[
children:
<
Widget
>[
new
Draggable
<
int
>(
new
Draggable
<
int
>(
data:
1
,
data:
1
,
child:
new
Text
(
'Source'
),
child:
new
Text
(
'Source'
),
feedback:
new
Text
(
'Dragging'
)
feedback:
new
Text
(
'Dragging'
)),
),
new
DragTarget
<
int
>(
builder:
new
DragTarget
<
int
>(
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
builder:
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
return
new
Text
(
'Target'
);
return
new
Text
(
'Target'
);
},
},
onAccept:
(
int
data
)
{
onAccept:
(
int
data
)
{
events
.
add
(
'drop'
);
events
.
add
(
'drop'
);
}
}),
),
]);
]);
},
},
}
}));
));
expect
(
events
,
isEmpty
);
expect
(
events
,
isEmpty
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
...
@@ -331,44 +290,33 @@ void main() {
...
@@ -331,44 +290,33 @@ void main() {
});
});
});
});
test
(
'Drag and drop - horizontal and vertical draggables in vertical block'
,
()
{
test
(
'Drag and drop - horizontal and vertical draggables in vertical block'
,
()
{
testWidgets
((
WidgetTester
tester
)
{
testWidgets
((
WidgetTester
tester
)
{
List
<
String
>
events
=
<
String
>[];
List
<
String
>
events
=
<
String
>[];
Point
firstLocation
,
secondLocation
,
thirdLocation
;
Point
firstLocation
,
secondLocation
,
thirdLocation
;
tester
.
pumpWidget
(
new
MaterialApp
(
tester
.
pumpWidget
(
new
MaterialApp
(
routes:
<
String
,
WidgetBuilder
>{
routes:
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
{
'/'
:
(
BuildContext
context
)
{
return
new
Block
(
return
new
Block
(
children:
<
Widget
>[
children:
<
Widget
>[
new
DragTarget
<
int
>(
builder:
new
DragTarget
<
int
>(
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
builder:
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
return
new
Text
(
'Target'
);
return
new
Text
(
'Target'
);
},
},
onAccept:
(
int
data
)
{
onAccept:
(
int
data
)
{
events
.
add
(
'drop
$data
'
);
events
.
add
(
'drop
$data
'
);
}
}),
),
new
Container
(
height:
400.0
),
new
Container
(
height:
400.0
),
new
HorizontalDraggable
<
int
>(
new
HorizontalDraggable
<
int
>(
data:
1
,
data:
1
,
child:
new
Text
(
'H'
),
feedback:
new
Text
(
'Dragging'
)),
child:
new
Text
(
'H'
),
feedback:
new
Text
(
'Dragging'
)
),
new
VerticalDraggable
<
int
>(
new
VerticalDraggable
<
int
>(
data:
2
,
data:
2
,
child:
new
Text
(
'V'
),
feedback:
new
Text
(
'Dragging'
)),
child:
new
Text
(
'V'
),
feedback:
new
Text
(
'Dragging'
)
),
new
Container
(
height:
500.0
),
new
Container
(
height:
500.0
),
new
Container
(
height:
500.0
),
new
Container
(
height:
500.0
),
new
Container
(
height:
500.0
),
new
Container
(
height:
500.0
),
new
Container
(
height:
500.0
),
new
Container
(
height:
500.0
),
]
]);
);
},
},
}
}));
));
expect
(
events
,
isEmpty
);
expect
(
events
,
isEmpty
);
expect
(
tester
.
findText
(
'Target'
),
isNotNull
);
expect
(
tester
.
findText
(
'Target'
),
isNotNull
);
...
@@ -438,49 +386,36 @@ void main() {
...
@@ -438,49 +386,36 @@ void main() {
expect
(
events
,
equals
(<
String
>[]));
expect
(
events
,
equals
(<
String
>[]));
expect
(
tester
.
getCenter
(
tester
.
findText
(
'Target'
)).
y
,
lessThan
(
0.0
));
expect
(
tester
.
getCenter
(
tester
.
findText
(
'Target'
)).
y
,
lessThan
(
0.0
));
events
.
clear
();
events
.
clear
();
});
});
});
});
test
(
'Drag and drop - horizontal and vertical draggables in horizontal block'
,
()
{
test
(
'Drag and drop - horizontal and vertical draggables in horizontal block'
,
()
{
testWidgets
((
WidgetTester
tester
)
{
testWidgets
((
WidgetTester
tester
)
{
List
<
String
>
events
=
<
String
>[];
List
<
String
>
events
=
<
String
>[];
Point
firstLocation
,
secondLocation
,
thirdLocation
;
Point
firstLocation
,
secondLocation
,
thirdLocation
;
tester
.
pumpWidget
(
new
MaterialApp
(
tester
.
pumpWidget
(
new
MaterialApp
(
routes:
<
String
,
WidgetBuilder
>{
routes:
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
{
'/'
:
(
BuildContext
context
)
{
return
new
Block
(
return
new
Block
(
scrollDirection:
Axis
.
horizontal
,
children:
<
Widget
>[
scrollDirection:
Axis
.
horizontal
,
new
DragTarget
<
int
>(
builder:
children:
<
Widget
>[
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
new
DragTarget
<
int
>(
builder:
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
return
new
Text
(
'Target'
);
return
new
Text
(
'Target'
);
},
},
onAccept:
(
int
data
)
{
onAccept:
(
int
data
)
{
events
.
add
(
'drop
$data
'
);
events
.
add
(
'drop
$data
'
);
}
}),
),
new
Container
(
width:
400.0
),
new
Container
(
width:
400.0
),
new
HorizontalDraggable
<
int
>(
new
HorizontalDraggable
<
int
>(
data:
1
,
data:
1
,
child:
new
Text
(
'H'
),
feedback:
new
Text
(
'Dragging'
)),
child:
new
Text
(
'H'
),
feedback:
new
Text
(
'Dragging'
)
),
new
VerticalDraggable
<
int
>(
new
VerticalDraggable
<
int
>(
data:
2
,
data:
2
,
child:
new
Text
(
'V'
),
feedback:
new
Text
(
'Dragging'
)),
child:
new
Text
(
'V'
),
feedback:
new
Text
(
'Dragging'
)
),
new
Container
(
width:
500.0
),
new
Container
(
width:
500.0
),
new
Container
(
width:
500.0
),
new
Container
(
width:
500.0
),
new
Container
(
width:
500.0
),
new
Container
(
width:
500.0
),
new
Container
(
width:
500.0
),
new
Container
(
width:
500.0
),
]
]);
);
},
},
}
}));
));
expect
(
events
,
isEmpty
);
expect
(
events
,
isEmpty
);
expect
(
tester
.
findText
(
'Target'
),
isNotNull
);
expect
(
tester
.
findText
(
'Target'
),
isNotNull
);
...
@@ -550,42 +485,35 @@ void main() {
...
@@ -550,42 +485,35 @@ void main() {
expect
(
events
,
equals
(<
String
>[]));
expect
(
events
,
equals
(<
String
>[]));
expect
(
tester
.
getCenter
(
tester
.
findText
(
'Target'
)).
x
,
lessThan
(
0.0
));
expect
(
tester
.
getCenter
(
tester
.
findText
(
'Target'
)).
x
,
lessThan
(
0.0
));
events
.
clear
();
events
.
clear
();
});
});
});
});
test
(
'Drag and drop - onDraggableDropped not called if dropped on accepting target'
,
()
{
test
(
'Drag and drop - onDraggableDropped not called if dropped on accepting target'
,
()
{
testWidgets
((
WidgetTester
tester
)
{
testWidgets
((
WidgetTester
tester
)
{
List
<
int
>
accepted
=
<
int
>[];
List
<
int
>
accepted
=
<
int
>[];
bool
onDraggableCanceledCalled
=
false
;
bool
onDraggableCanceledCalled
=
false
;
tester
.
pumpWidget
(
new
MaterialApp
(
tester
.
pumpWidget
(
new
MaterialApp
(
routes:
<
String
,
WidgetBuilder
>{
routes:
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
{
'/'
:
(
BuildContext
context
)
{
return
new
Column
(
return
new
Column
(
children:
<
Widget
>[
children:
<
Widget
>[
new
Draggable
<
int
>(
new
Draggable
<
int
>(
data:
1
,
data:
1
,
child:
new
Text
(
'Source'
),
child:
new
Text
(
'Source'
),
feedback:
new
Text
(
'Dragging'
),
feedback:
new
Text
(
'Dragging'
),
onDraggableCanceled:
(
Velocity
velocity
,
Offset
offset
)
{
onDraggableCanceled:
(
Velocity
velocity
,
Offset
offset
)
{
onDraggableCanceledCalled
=
true
;
onDraggableCanceledCalled
=
true
;
}
}),
),
new
DragTarget
<
int
>(
builder:
new
DragTarget
<
int
>(
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
builder:
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
return
new
Container
(
height:
100.0
,
child:
new
Text
(
'Target'
));
return
new
Container
(
},
onAccept:
(
int
data
)
{
height:
100.0
,
child:
new
Text
(
'Target'
)
);
},
onAccept:
(
int
data
)
{
accepted
.
add
(
data
);
accepted
.
add
(
data
);
}
}),
),
]);
]);
},
},
}
}));
));
expect
(
accepted
,
isEmpty
);
expect
(
accepted
,
isEmpty
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
...
@@ -624,17 +552,18 @@ void main() {
...
@@ -624,17 +552,18 @@ void main() {
});
});
});
});
test
(
'Drag and drop - onDraggableDropped called if dropped on non-accepting target'
,
()
{
test
(
'Drag and drop - onDraggableDropped called if dropped on non-accepting target'
,
()
{
testWidgets
((
WidgetTester
tester
)
{
testWidgets
((
WidgetTester
tester
)
{
List
<
int
>
accepted
=
<
int
>[];
List
<
int
>
accepted
=
<
int
>[];
bool
onDraggableCanceledCalled
=
false
;
bool
onDraggableCanceledCalled
=
false
;
Velocity
onDraggableCanceledVelocity
;
Velocity
onDraggableCanceledVelocity
;
Offset
onDraggableCanceledOffset
;
Offset
onDraggableCanceledOffset
;
tester
.
pumpWidget
(
new
MaterialApp
(
tester
.
pumpWidget
(
new
MaterialApp
(
routes:
<
String
,
WidgetBuilder
>{
routes:
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
{
'/'
:
(
BuildContext
context
)
{
return
new
Column
(
return
new
Column
(
children:
<
Widget
>[
children:
<
Widget
>[
new
Draggable
<
int
>(
new
Draggable
<
int
>(
data:
1
,
data:
1
,
child:
new
Text
(
'Source'
),
child:
new
Text
(
'Source'
),
...
@@ -643,21 +572,17 @@ void main() {
...
@@ -643,21 +572,17 @@ void main() {
onDraggableCanceledCalled
=
true
;
onDraggableCanceledCalled
=
true
;
onDraggableCanceledVelocity
=
velocity
;
onDraggableCanceledVelocity
=
velocity
;
onDraggableCanceledOffset
=
offset
;
onDraggableCanceledOffset
=
offset
;
}
}),
),
new
DragTarget
<
int
>(
new
DragTarget
<
int
>(
builder:
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
builder:
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
return
new
Container
(
return
new
Container
(
height:
100.0
,
height:
100.0
,
child:
new
Text
(
'Target'
));
child:
new
Text
(
'Target'
)
);
},
},
onWillAccept:
(
int
data
)
=>
false
onWillAccept:
(
int
data
)
=>
false
),
),
]);
]);
},
},
}
}));
));
expect
(
accepted
,
isEmpty
);
expect
(
accepted
,
isEmpty
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
...
@@ -694,21 +619,23 @@ void main() {
...
@@ -694,21 +619,23 @@ void main() {
expect
(
tester
.
findText
(
'Target'
),
isNotNull
);
expect
(
tester
.
findText
(
'Target'
),
isNotNull
);
expect
(
onDraggableCanceledCalled
,
isTrue
);
expect
(
onDraggableCanceledCalled
,
isTrue
);
expect
(
onDraggableCanceledVelocity
,
equals
(
Velocity
.
zero
));
expect
(
onDraggableCanceledVelocity
,
equals
(
Velocity
.
zero
));
expect
(
onDraggableCanceledOffset
,
equals
(
new
Offset
(
secondLocation
.
x
,
secondLocation
.
y
)));
expect
(
onDraggableCanceledOffset
,
equals
(
new
Offset
(
secondLocation
.
x
,
secondLocation
.
y
)));
});
});
});
});
test
(
'Drag and drop - onDraggableDropped called if dropped on non-accepting target with correct velocity'
,
()
{
test
(
'Drag and drop - onDraggableDropped called if dropped on non-accepting target with correct velocity'
,
()
{
testWidgets
((
WidgetTester
tester
)
{
testWidgets
((
WidgetTester
tester
)
{
List
<
int
>
accepted
=
<
int
>[];
List
<
int
>
accepted
=
<
int
>[];
bool
onDraggableCanceledCalled
=
false
;
bool
onDraggableCanceledCalled
=
false
;
Velocity
onDraggableCanceledVelocity
;
Velocity
onDraggableCanceledVelocity
;
Offset
onDraggableCanceledOffset
;
Offset
onDraggableCanceledOffset
;
tester
.
pumpWidget
(
new
MaterialApp
(
tester
.
pumpWidget
(
new
MaterialApp
(
routes:
<
String
,
WidgetBuilder
>{
routes:
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
{
'/'
:
(
BuildContext
context
)
{
return
new
Column
(
return
new
Column
(
children:
<
Widget
>[
children:
<
Widget
>[
new
Draggable
<
int
>(
new
Draggable
<
int
>(
data:
1
,
data:
1
,
child:
new
Text
(
'Source'
),
child:
new
Text
(
'Source'
),
...
@@ -717,21 +644,17 @@ void main() {
...
@@ -717,21 +644,17 @@ void main() {
onDraggableCanceledCalled
=
true
;
onDraggableCanceledCalled
=
true
;
onDraggableCanceledVelocity
=
velocity
;
onDraggableCanceledVelocity
=
velocity
;
onDraggableCanceledOffset
=
offset
;
onDraggableCanceledOffset
=
offset
;
}
}),
),
new
DragTarget
<
int
>(
new
DragTarget
<
int
>(
builder:
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
builder:
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
return
new
Container
(
return
new
Container
(
height:
100.0
,
height:
100.0
,
child:
new
Text
(
'Target'
));
child:
new
Text
(
'Target'
)
);
},
},
onWillAccept:
(
int
data
)
=>
false
onWillAccept:
(
int
data
)
=>
false
),
),
]);
]);
},
},
}
}));
));
expect
(
accepted
,
isEmpty
);
expect
(
accepted
,
isEmpty
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
expect
(
tester
.
findText
(
'Source'
),
isNotNull
);
...
@@ -740,7 +663,7 @@ void main() {
...
@@ -740,7 +663,7 @@ void main() {
expect
(
onDraggableCanceledCalled
,
isFalse
);
expect
(
onDraggableCanceledCalled
,
isFalse
);
Point
flingStart
=
tester
.
getTopLeft
(
tester
.
findText
(
'Source'
));
Point
flingStart
=
tester
.
getTopLeft
(
tester
.
findText
(
'Source'
));
tester
.
flingFrom
(
flingStart
,
new
Offset
(
0.0
,
100.0
),
1000.0
);
tester
.
flingFrom
(
flingStart
,
new
Offset
(
0.0
,
100.0
),
1000.0
);
tester
.
pump
();
tester
.
pump
();
expect
(
accepted
,
isEmpty
);
expect
(
accepted
,
isEmpty
);
...
@@ -748,9 +671,14 @@ void main() {
...
@@ -748,9 +671,14 @@ void main() {
expect
(
tester
.
findText
(
'Dragging'
),
isNull
);
expect
(
tester
.
findText
(
'Dragging'
),
isNull
);
expect
(
tester
.
findText
(
'Target'
),
isNotNull
);
expect
(
tester
.
findText
(
'Target'
),
isNotNull
);
expect
(
onDraggableCanceledCalled
,
isTrue
);
expect
(
onDraggableCanceledCalled
,
isTrue
);
expect
(
onDraggableCanceledVelocity
.
pixelsPerSecond
.
dx
.
abs
(),
lessThan
(
0.0000001
));
expect
(
onDraggableCanceledVelocity
.
pixelsPerSecond
.
dx
.
abs
(),
expect
((
onDraggableCanceledVelocity
.
pixelsPerSecond
.
dy
-
1000.0
).
abs
(),
lessThan
(
0.0000001
));
lessThan
(
0.0000001
));
expect
(
onDraggableCanceledOffset
,
equals
(
new
Offset
(
flingStart
.
x
,
flingStart
.
y
)
+
new
Offset
(
0.0
,
100.0
)));
expect
((
onDraggableCanceledVelocity
.
pixelsPerSecond
.
dy
-
1000.0
).
abs
(),
lessThan
(
0.0000001
));
expect
(
onDraggableCanceledOffset
,
equals
(
new
Offset
(
flingStart
.
x
,
flingStart
.
y
)
+
new
Offset
(
0.0
,
100.0
)));
});
});
});
});
...
@@ -759,52 +687,36 @@ void main() {
...
@@ -759,52 +687,36 @@ void main() {
List
<
int
>
acceptedInts
=
<
int
>[];
List
<
int
>
acceptedInts
=
<
int
>[];
List
<
double
>
acceptedDoubles
=
<
double
>[];
List
<
double
>
acceptedDoubles
=
<
double
>[];
tester
.
pumpWidget
(
new
MaterialApp
(
tester
.
pumpWidget
(
new
MaterialApp
(
routes:
<
String
,
WidgetBuilder
>{
routes:
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
{
'/'
:
(
BuildContext
context
)
{
return
new
Column
(
return
new
Column
(
children:
<
Widget
>[
children:
<
Widget
>[
new
Draggable
<
int
>(
new
Draggable
<
int
>(
data:
1
,
data:
1
,
child:
new
Text
(
'IntSource'
),
child:
new
Text
(
'IntSource'
),
feedback:
new
Text
(
'IntDragging'
)
feedback:
new
Text
(
'IntDragging'
)),
),
new
Draggable
<
double
>(
new
Draggable
<
double
>(
data:
1.0
,
data:
1.0
,
child:
new
Text
(
'DoubleSource'
),
child:
new
Text
(
'DoubleSource'
),
feedback:
new
Text
(
'DoubleDragging'
)
feedback:
new
Text
(
'DoubleDragging'
)),
),
new
Stack
(
children:
[
new
Stack
(
children:
[
new
DragTarget
<
int
>(
builder:
(
BuildContext
context
,
new
DragTarget
<
int
>(
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
builder:
(
BuildContext
context
,
List
<
int
>
data
,
List
<
dynamic
>
rejects
)
{
return
new
IgnorePointer
(
child:
new
Container
(
return
new
IgnorePointer
(
height:
100.0
,
child:
new
Text
(
'Target1'
)));
child:
new
Container
(
},
onAccept:
(
int
data
)
{
height:
100.0
,
child:
new
Text
(
'Target1'
)
)
);
},
onAccept:
(
int
data
)
{
acceptedInts
.
add
(
data
);
acceptedInts
.
add
(
data
);
}
}),
),
new
DragTarget
<
double
>(
builder:
(
BuildContext
context
,
new
DragTarget
<
double
>(
List
<
double
>
data
,
List
<
dynamic
>
rejects
)
{
builder:
(
BuildContext
context
,
List
<
double
>
data
,
List
<
dynamic
>
rejects
)
{
return
new
IgnorePointer
(
child:
new
Container
(
return
new
IgnorePointer
(
height:
100.0
,
child:
new
Text
(
'Target2'
)));
child:
new
Container
(
},
onAccept:
(
double
data
)
{
height:
100.0
,
child:
new
Text
(
'Target2'
)
)
);
},
onAccept:
(
double
data
)
{
acceptedDoubles
.
add
(
data
);
acceptedDoubles
.
add
(
data
);
}
}),
),
])
])
]);
]);
},
},
}
}));
));
expect
(
acceptedInts
,
isEmpty
);
expect
(
acceptedInts
,
isEmpty
);
expect
(
acceptedDoubles
,
isEmpty
);
expect
(
acceptedDoubles
,
isEmpty
);
...
@@ -820,7 +732,8 @@ void main() {
...
@@ -820,7 +732,8 @@ void main() {
Point
targetLocation
=
tester
.
getCenter
(
tester
.
findText
(
'Target1'
));
Point
targetLocation
=
tester
.
getCenter
(
tester
.
findText
(
'Target1'
));
// Drag the double draggable.
// Drag the double draggable.
TestGesture
doubleGesture
=
tester
.
startGesture
(
doubleLocation
,
pointer:
7
);
TestGesture
doubleGesture
=
tester
.
startGesture
(
doubleLocation
,
pointer:
7
);
tester
.
pump
();
tester
.
pump
();
expect
(
acceptedInts
,
isEmpty
);
expect
(
acceptedInts
,
isEmpty
);
...
@@ -872,4 +785,62 @@ void main() {
...
@@ -872,4 +785,62 @@ void main() {
expect
(
tester
.
findText
(
'DoubleDragging'
),
isNull
);
expect
(
tester
.
findText
(
'DoubleDragging'
),
isNull
);
});
});
});
});
test
(
'Drag and drop - allow pass thru of unaccepted data twice test'
,
()
{
testWidgets
((
WidgetTester
tester
)
{
List
<
DragTargetData
>
acceptedDragTargetDatas
=
<
DragTargetData
>[];
List
<
ExtendedDragTargetData
>
acceptedExtendedDragTargetDatas
=
<
ExtendedDragTargetData
>[];
DragTargetData
dragTargetData
=
new
DragTargetData
();
tester
.
pumpWidget
(
new
MaterialApp
(
routes:
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
{
return
new
Column
(
children:
<
Widget
>[
new
Draggable
<
DragTargetData
>(
data:
dragTargetData
,
child:
new
Text
(
'Source'
),
feedback:
new
Text
(
'Dragging'
)),
new
Stack
(
children:
[
new
DragTarget
<
DragTargetData
>(
builder:
(
BuildContext
context
,
List
<
DragTargetData
>
data
,
List
<
dynamic
>
rejects
)
{
return
new
IgnorePointer
(
child:
new
Container
(
height:
100.0
,
child:
new
Text
(
'Target1'
)));
},
onAccept:
(
DragTargetData
data
)
{
acceptedDragTargetDatas
.
add
(
data
);
}),
new
DragTarget
<
ExtendedDragTargetData
>(
builder:
(
BuildContext
context
,
List
<
ExtendedDragTargetData
>
data
,
List
<
ExtendedDragTargetData
>
rejects
)
{
return
new
IgnorePointer
(
child:
new
Container
(
height:
100.0
,
child:
new
Text
(
'Target2'
)));
},
onAccept:
(
ExtendedDragTargetData
data
)
{
acceptedExtendedDragTargetDatas
.
add
(
data
);
}),
])
]);
},
}));
Point
dragTargetLocation
=
tester
.
getCenter
(
tester
.
findText
(
'Source'
));
Point
targetLocation
=
tester
.
getCenter
(
tester
.
findText
(
'Target1'
));
for
(
int
i
=
0
;
i
<
2
;
i
+=
1
)
{
TestGesture
gesture
=
tester
.
startGesture
(
dragTargetLocation
);
tester
.
pump
();
gesture
.
moveTo
(
targetLocation
);
tester
.
pump
();
gesture
.
up
();
tester
.
pump
();
expect
(
acceptedDragTargetDatas
,
equals
(<
DragTargetData
>[
dragTargetData
]));
expect
(
acceptedExtendedDragTargetDatas
,
isEmpty
);
acceptedDragTargetDatas
.
clear
();
tester
.
pump
();
}
});
});
}
class
DragTargetData
{
}
class
ExtendedDragTargetData
extends
DragTargetData
{
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment