mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

"showSnackBar()" is now a feature of a Scaffold. To get to a Scaffold you either use a global key (`scaffoldKey.currentState.showSnackBar(...)`), or you use `Scaffold.of(context)`. Snack bars no longer have a route. They are entirely managed by the Scaffold. Fixes #432. Snack bars now queue up when you have several of them. Fixes #374. Snack bars now auto-size themselves around their contents. This is step one towards implementing multiline snack bars. Snack bars now self-dismiss after some per-snackbar configurable period. The self-dismissing pauses while a dialog is up above the snackbar (or anything that uses ModalRoute). To enable this, there's now a `ModalRoute.of(context)` API that returns the current ModalRoute, and you will be rebuilt if you asked for this and the route's "current" status changes. To implement this, the Navigator now rebuilds unconditionally any time it pushes or pops a route. Snack bars now use the curves that Android uses for snack bars. Snack bar contents now fade in.
149 lines
6.5 KiB
Dart
149 lines
6.5 KiB
Dart
// Copyright 2015 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
import 'widget_tester.dart';
|
|
|
|
class Builder extends StatelessComponent {
|
|
Builder({ this.builder });
|
|
final WidgetBuilder builder;
|
|
Widget build(BuildContext context) => builder(context);
|
|
}
|
|
|
|
void main() {
|
|
test('SnackBar control test', () {
|
|
testWidgets((WidgetTester tester) {
|
|
String helloSnackBar = 'Hello SnackBar';
|
|
Key tapTarget = new Key('tap-target');
|
|
tester.pumpWidget(new MaterialApp(
|
|
routes: <String, RouteBuilder>{
|
|
'/': (RouteArguments args) {
|
|
return new Scaffold(
|
|
body: new Builder(
|
|
builder: (BuildContext context) {
|
|
return new GestureDetector(
|
|
onTap: () {
|
|
Scaffold.of(context).showSnackBar(new SnackBar(
|
|
content: new Text(helloSnackBar),
|
|
duration: new Duration(seconds: 2)
|
|
));
|
|
},
|
|
behavior: HitTestBehavior.opaque,
|
|
child: new Container(
|
|
height: 100.0,
|
|
width: 100.0,
|
|
key: tapTarget
|
|
)
|
|
);
|
|
}
|
|
)
|
|
);
|
|
}
|
|
}
|
|
));
|
|
expect(tester.findText(helloSnackBar), isNull);
|
|
tester.tap(tester.findElementByKey(tapTarget));
|
|
expect(tester.findText(helloSnackBar), isNull);
|
|
tester.pump(); // schedule animation
|
|
expect(tester.findText(helloSnackBar), isNotNull);
|
|
tester.pump(); // begin animation
|
|
expect(tester.findText(helloSnackBar), isNotNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 0.75s // animation last frame; two second timer starts here
|
|
expect(tester.findText(helloSnackBar), isNotNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 1.50s
|
|
expect(tester.findText(helloSnackBar), isNotNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 2.25s
|
|
expect(tester.findText(helloSnackBar), isNotNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 3.00s // timer triggers to dismiss snackbar, reverse animation is scheduled
|
|
tester.pump(); // begin animation
|
|
expect(tester.findText(helloSnackBar), isNotNull); // frame 0 of dismiss animation
|
|
tester.pump(new Duration(milliseconds: 750)); // 3.75s // last frame of animation, snackbar removed from build
|
|
expect(tester.findText(helloSnackBar), isNull);
|
|
});
|
|
});
|
|
|
|
test('SnackBar twice test', () {
|
|
testWidgets((WidgetTester tester) {
|
|
int snackBarCount = 0;
|
|
Key tapTarget = new Key('tap-target');
|
|
tester.pumpWidget(new MaterialApp(
|
|
routes: <String, RouteBuilder>{
|
|
'/': (RouteArguments args) {
|
|
return new Scaffold(
|
|
body: new Builder(
|
|
builder: (BuildContext context) {
|
|
return new GestureDetector(
|
|
onTap: () {
|
|
snackBarCount += 1;
|
|
Scaffold.of(context).showSnackBar(new SnackBar(
|
|
content: new Text("bar$snackBarCount"),
|
|
duration: new Duration(seconds: 2)
|
|
));
|
|
},
|
|
behavior: HitTestBehavior.opaque,
|
|
child: new Container(
|
|
height: 100.0,
|
|
width: 100.0,
|
|
key: tapTarget
|
|
)
|
|
);
|
|
}
|
|
)
|
|
);
|
|
}
|
|
}
|
|
));
|
|
expect(tester.findText('bar1'), isNull);
|
|
expect(tester.findText('bar2'), isNull);
|
|
tester.tap(tester.findElementByKey(tapTarget)); // queue bar1
|
|
tester.tap(tester.findElementByKey(tapTarget)); // queue bar2
|
|
expect(tester.findText('bar1'), isNull);
|
|
expect(tester.findText('bar2'), isNull);
|
|
tester.pump(); // schedule animation for bar1
|
|
expect(tester.findText('bar1'), isNotNull);
|
|
expect(tester.findText('bar2'), isNull);
|
|
tester.pump(); // begin animation
|
|
expect(tester.findText('bar1'), isNotNull);
|
|
expect(tester.findText('bar2'), isNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 0.75s // animation last frame; two second timer starts here
|
|
expect(tester.findText('bar1'), isNotNull);
|
|
expect(tester.findText('bar2'), isNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 1.50s
|
|
expect(tester.findText('bar1'), isNotNull);
|
|
expect(tester.findText('bar2'), isNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 2.25s
|
|
expect(tester.findText('bar1'), isNotNull);
|
|
expect(tester.findText('bar2'), isNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 3.00s // timer triggers to dismiss snackbar, reverse animation is scheduled
|
|
tester.pump(); // begin animation
|
|
expect(tester.findText('bar1'), isNotNull);
|
|
expect(tester.findText('bar2'), isNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 3.75s // last frame of animation, snackbar removed from build, new snack bar put in its place
|
|
expect(tester.findText('bar1'), isNull);
|
|
expect(tester.findText('bar2'), isNotNull);
|
|
tester.pump(); // begin animation
|
|
expect(tester.findText('bar1'), isNull);
|
|
expect(tester.findText('bar2'), isNotNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 4.50s // animation last frame; two second timer starts here
|
|
expect(tester.findText('bar1'), isNull);
|
|
expect(tester.findText('bar2'), isNotNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 5.25s
|
|
expect(tester.findText('bar1'), isNull);
|
|
expect(tester.findText('bar2'), isNotNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 6.00s
|
|
expect(tester.findText('bar1'), isNull);
|
|
expect(tester.findText('bar2'), isNotNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 6.75s // timer triggers to dismiss snackbar, reverse animation is scheduled
|
|
tester.pump(); // begin animation
|
|
expect(tester.findText('bar1'), isNull);
|
|
expect(tester.findText('bar2'), isNotNull);
|
|
tester.pump(new Duration(milliseconds: 750)); // 7.50s // last frame of animation, snackbar removed from build, new snack bar put in its place
|
|
expect(tester.findText('bar1'), isNull);
|
|
expect(tester.findText('bar2'), isNull);
|
|
});
|
|
});
|
|
}
|