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
9cbac2a4
Unverified
Commit
9cbac2a4
authored
Jul 24, 2019
by
Tong Mu
Committed by
GitHub
Jul 24, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Revert "Dismiss modal with any button press (#32770)" (#36877)
This reverts commit
1aa4628f
.
parent
a7387b12
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
4 additions
and
156 deletions
+4
-156
modal_barrier.dart
packages/flutter/lib/src/widgets/modal_barrier.dart
+3
-104
modal_barrier_test.dart
packages/flutter/test/widgets/modal_barrier_test.dart
+1
-52
No files found.
packages/flutter/lib/src/widgets/modal_barrier.dart
View file @
9cbac2a4
...
...
@@ -3,9 +3,6 @@
// found in the LICENSE file.
import
'package:flutter/foundation.dart'
;
import
'package:flutter/gestures.dart'
show
PrimaryPointerGestureRecognizer
,
GestureDisposition
;
import
'basic.dart'
;
import
'container.dart'
;
...
...
@@ -84,11 +81,12 @@ class ModalBarrier extends StatelessWidget {
// On Android, the back button is used to dismiss a modal. On iOS, some
// modal barriers are not dismissible in accessibility mode.
excluding:
!
semanticsDismissible
||
!
modalBarrierSemanticsDismissible
,
child:
_ModalBarrier
GestureDetector
(
on
AnyTapDown:
(
)
{
child:
GestureDetector
(
on
TapDown:
(
TapDownDetails
details
)
{
if
(
dismissible
)
Navigator
.
maybePop
(
context
);
},
behavior:
HitTestBehavior
.
opaque
,
child:
Semantics
(
label:
semanticsDismissible
?
semanticsLabel
:
null
,
textDirection:
semanticsDismissible
&&
semanticsLabel
!=
null
?
Directionality
.
of
(
context
)
:
null
,
...
...
@@ -177,102 +175,3 @@ class AnimatedModalBarrier extends AnimatedWidget {
);
}
}
// Recognizes tap down by any pointer button unconditionally. When it receives a
// PointerDownEvent, it immediately claims victor of arena and calls
// [onAnyTapDown] without any checks.
//
// It is used by ModalBarrier to detect any taps on the overlay.
class
_AnyTapGestureRecognizer
extends
PrimaryPointerGestureRecognizer
{
_AnyTapGestureRecognizer
({
Object
debugOwner
,
this
.
onAnyTapDown
,
})
:
super
(
debugOwner:
debugOwner
);
VoidCallback
onAnyTapDown
;
bool
_sentTapDown
=
false
;
@override
void
addAllowedPointer
(
PointerDownEvent
event
)
{
super
.
addAllowedPointer
(
event
);
resolve
(
GestureDisposition
.
accepted
);
}
@override
void
handlePrimaryPointer
(
PointerEvent
event
)
{
if
(!
_sentTapDown
)
{
if
(
onAnyTapDown
!=
null
)
onAnyTapDown
();
_sentTapDown
=
true
;
}
}
@override
void
didStopTrackingLastPointer
(
int
pointer
)
{
super
.
didStopTrackingLastPointer
(
pointer
);
_sentTapDown
=
false
;
}
@override
String
get
debugDescription
=>
'any tap'
;
}
class
_ModalBarrierSemanticsDelegate
extends
SemanticsGestureDelegate
{
const
_ModalBarrierSemanticsDelegate
({
this
.
onAnyTapDown
});
final
VoidCallback
onAnyTapDown
;
@override
void
assignSemantics
(
RenderSemanticsGestureHandler
renderObject
)
{
renderObject
.
onTap
=
onAnyTapDown
;
}
}
class
_AnyTapGestureRecognizerFactory
extends
GestureRecognizerFactory
<
_AnyTapGestureRecognizer
>
{
const
_AnyTapGestureRecognizerFactory
({
this
.
onAnyTapDown
});
final
VoidCallback
onAnyTapDown
;
@override
_AnyTapGestureRecognizer
constructor
()
=>
_AnyTapGestureRecognizer
();
@override
void
initializer
(
_AnyTapGestureRecognizer
instance
)
{
instance
.
onAnyTapDown
=
onAnyTapDown
;
}
}
// A GestureDetector used by ModalBarrier. It only has one callback,
// [onAnyTapDown], which recognizes tap down unconditionally.
class
_ModalBarrierGestureDetector
extends
StatelessWidget
{
const
_ModalBarrierGestureDetector
({
Key
key
,
@required
this
.
child
,
@required
this
.
onAnyTapDown
,
})
:
assert
(
child
!=
null
),
assert
(
onAnyTapDown
!=
null
),
super
(
key:
key
);
/// The widget below this widget in the tree.
/// See [RawGestureDetector.child].
final
Widget
child
;
/// Immediately called when a pointer causes a tap down.
/// See [_AnyTapGestureRecognizer.onAnyTapDown].
final
VoidCallback
onAnyTapDown
;
@override
Widget
build
(
BuildContext
context
)
{
final
Map
<
Type
,
GestureRecognizerFactory
>
gestures
=
<
Type
,
GestureRecognizerFactory
>{
_AnyTapGestureRecognizer:
_AnyTapGestureRecognizerFactory
(
onAnyTapDown:
onAnyTapDown
),
};
return
RawGestureDetector
(
gestures:
gestures
,
behavior:
HitTestBehavior
.
opaque
,
semantics:
_ModalBarrierSemanticsDelegate
(
onAnyTapDown:
onAnyTapDown
),
child:
child
,
);
}
}
packages/flutter/test/widgets/modal_barrier_test.dart
View file @
9cbac2a4
...
...
@@ -7,7 +7,6 @@ import 'package:flutter/foundation.dart';
import
'package:flutter/material.dart'
;
import
'package:flutter/rendering.dart'
;
import
'package:flutter/widgets.dart'
;
import
'package:flutter/gestures.dart'
show
kSecondaryButton
;
import
'semantics_tester.dart'
;
...
...
@@ -61,7 +60,7 @@ void main() {
reason:
'because the tap is not prevented by ModalBarrier'
);
});
testWidgets
(
'ModalBarrier pops the Navigator when dismissed
by primay tap
'
,
(
WidgetTester
tester
)
async
{
testWidgets
(
'ModalBarrier pops the Navigator when dismissed'
,
(
WidgetTester
tester
)
async
{
final
Map
<
String
,
WidgetBuilder
>
routes
=
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
=>
FirstWidget
(),
'/modal'
:
(
BuildContext
context
)
=>
SecondWidget
(),
...
...
@@ -86,56 +85,6 @@ void main() {
reason:
'The route should have been dismissed by tapping the barrier.'
);
});
testWidgets
(
'ModalBarrier pops the Navigator when dismissed by primary tap down'
,
(
WidgetTester
tester
)
async
{
final
Map
<
String
,
WidgetBuilder
>
routes
=
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
=>
FirstWidget
(),
'/modal'
:
(
BuildContext
context
)
=>
SecondWidget
(),
};
await
tester
.
pumpWidget
(
MaterialApp
(
routes:
routes
));
// Initially the barrier is not visible
expect
(
find
.
byKey
(
const
ValueKey
<
String
>(
'barrier'
)),
findsNothing
);
// Tapping on X routes to the barrier
await
tester
.
tap
(
find
.
text
(
'X'
));
await
tester
.
pump
();
// begin transition
await
tester
.
pump
(
const
Duration
(
seconds:
1
));
// end transition
// Tap on the barrier to dismiss it
await
tester
.
press
(
find
.
byKey
(
const
ValueKey
<
String
>(
'barrier'
)));
await
tester
.
pump
();
// begin transition
await
tester
.
pump
(
const
Duration
(
seconds:
1
));
// end transition
expect
(
find
.
byKey
(
const
ValueKey
<
String
>(
'barrier'
)),
findsNothing
,
reason:
'The route should have been dismissed by tapping the barrier.'
);
});
testWidgets
(
'ModalBarrier pops the Navigator when dismissed by non-primary tap down'
,
(
WidgetTester
tester
)
async
{
final
Map
<
String
,
WidgetBuilder
>
routes
=
<
String
,
WidgetBuilder
>{
'/'
:
(
BuildContext
context
)
=>
FirstWidget
(),
'/modal'
:
(
BuildContext
context
)
=>
SecondWidget
(),
};
await
tester
.
pumpWidget
(
MaterialApp
(
routes:
routes
));
// Initially the barrier is not visible
expect
(
find
.
byKey
(
const
ValueKey
<
String
>(
'barrier'
)),
findsNothing
);
// Tapping on X routes to the barrier
await
tester
.
tap
(
find
.
text
(
'X'
));
await
tester
.
pump
();
// begin transition
await
tester
.
pump
(
const
Duration
(
seconds:
1
));
// end transition
// Tap on the barrier to dismiss it
await
tester
.
press
(
find
.
byKey
(
const
ValueKey
<
String
>(
'barrier'
)),
buttons:
kSecondaryButton
);
await
tester
.
pump
();
// begin transition
await
tester
.
pump
(
const
Duration
(
seconds:
1
));
// end transition
expect
(
find
.
byKey
(
const
ValueKey
<
String
>(
'barrier'
)),
findsNothing
,
reason:
'The route should have been dismissed by tapping the barrier.'
);
});
testWidgets
(
'ModalBarrier does not pop the Navigator with a WillPopScope that returns false'
,
(
WidgetTester
tester
)
async
{
bool
willPopCalled
=
false
;
final
Map
<
String
,
WidgetBuilder
>
routes
=
<
String
,
WidgetBuilder
>{
...
...
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