Commit 11fa80bb authored by Ian Hickson's avatar Ian Hickson Committed by GitHub

MediaQuery.of shouldn't give a default return value (#9596)

parent b432af51
......@@ -14,7 +14,7 @@ void main() {
// We press the "1" and the "2" buttons and check that the display
// reads "12".
testWidgets('Flutter calculator app smoke test', (WidgetTester tester) async {
await tester.pumpWidget(const CalculatorDemo());
await tester.pumpWidget(new MaterialApp(home: const CalculatorDemo()));
final Finder oneButton = find.widgetWithText(InkResponse, '1');
expect(oneButton, findsOneWidget);
......
......@@ -341,6 +341,7 @@ class _AppBarState extends State<AppBar> {
@override
Widget build(BuildContext context) {
assert(!widget.primary || debugCheckHasMediaQuery(context));
final ThemeData themeData = Theme.of(context);
IconThemeData appBarIconTheme = widget.iconTheme ?? themeData.primaryIconTheme;
......@@ -906,6 +907,7 @@ class _SliverAppBarState extends State<SliverAppBar> with TickerProviderStateMix
@override
Widget build(BuildContext context) {
assert(!widget.primary || debugCheckHasMediaQuery(context));
final double topPadding = widget.primary ? MediaQuery.of(context).padding.top : 0.0;
final double collapsedHeight = (widget.pinned && widget.floating && widget.bottom != null)
? widget.bottom.preferredSize.height + topPadding : null;
......
......@@ -72,6 +72,7 @@ class DrawerHeader extends StatelessWidget {
@override
Widget build(BuildContext context) {
assert(debugCheckHasMaterial(context));
assert(debugCheckHasMediaQuery(context));
final ThemeData theme = Theme.of(context);
final double statusBarHeight = MediaQuery.of(context).padding.top;
return new Container(
......
......@@ -769,6 +769,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin {
@override
Widget build(BuildContext context) {
assert(debugCheckHasMediaQuery(context));
EdgeInsets padding = MediaQuery.of(context).padding;
final ThemeData themeData = Theme.of(context);
if (!widget.resizeToAvoidBottomPadding)
......
......@@ -151,6 +151,7 @@ class _MaterialTextSelectionControls extends TextSelectionControls {
@override
Widget buildToolbar(
BuildContext context, Offset position, TextSelectionDelegate delegate) {
assert(debugCheckHasMediaQuery(context));
final Size screenSize = MediaQuery.of(context).size;
return new ConstrainedBox(
constraints: new BoxConstraints.loose(screenSize),
......
......@@ -5,7 +5,9 @@
import 'dart:collection';
import 'package:flutter/foundation.dart';
import 'framework.dart';
import 'media_query.dart';
import 'table.dart';
// Any changes to this file should be reflected in the debugAssertAllWidgetVarsUnset()
......@@ -153,6 +155,39 @@ bool debugCheckHasTable(BuildContext context) {
return true;
}
/// Asserts that the given context has a [MediaQuery] ancestor.
///
/// Used by various widgets to make sure that they are only used in an
/// appropriate context.
///
/// To invoke this function, use the following pattern, typically in the
/// relevant Widget's [build] method:
///
/// ```dart
/// assert(debugCheckHasMediaQuery(context));
/// ```
///
/// Does nothing if asserts are disabled. Always returns true.
bool debugCheckHasMediaQuery(BuildContext context) {
assert(() {
if (context.widget is! MediaQuery && context.ancestorWidgetOfExactType(MediaQuery) == null) {
final Element element = context;
throw new FlutterError(
'No MediaQuery widget found.\n'
'${context.widget.runtimeType} widgets require a MediaQuery widget ancestor.\n'
'The specific widget that could not find a MediaQuery ancestor was:\n'
' ${context.widget}\n'
'The ownership chain for the affected widget is:\n'
' ${element.debugGetCreatorChain(10)}\n'
'Typically, the MediaQuery widget is introduced by the MaterialApp or '
'WidgetsApp widget at the top of your application widget tree.'
);
}
return true;
});
return true;
}
/// Asserts that the `built` widget is not null.
///
/// Used when the given `widget` calls a builder function to check that the
......
......@@ -463,7 +463,7 @@ class EditableTextState extends State<EditableText> implements TextInputClient {
showCursor: _showCursor,
maxLines: widget.maxLines,
selectionColor: widget.selectionColor,
textScaleFactor: widget.textScaleFactor ?? MediaQuery.of(context).textScaleFactor,
textScaleFactor: widget.textScaleFactor ?? MediaQuery.of(context, nullOk: true)?.textScaleFactor ?? 1.0,
textAlign: widget.textAlign,
obscureText: widget.obscureText,
offset: offset,
......
......@@ -27,10 +27,10 @@ export 'package:flutter/services.dart' show
ImageConfiguration createLocalImageConfiguration(BuildContext context, { Size size }) {
return new ImageConfiguration(
bundle: DefaultAssetBundle.of(context),
devicePixelRatio: MediaQuery.of(context).devicePixelRatio,
devicePixelRatio: MediaQuery.of(context, nullOk: true)?.devicePixelRatio ?? 1.0,
// TODO(ianh): provide the locale
size: size,
platform: Platform.operatingSystem
platform: Platform.operatingSystem,
);
}
......
......@@ -26,6 +26,10 @@ enum Orientation {
/// To obtain the current [MediaQueryData] for a given [BuildContext], use the
/// [MediaQuery.of] function. For example, to obtain the size of the current
/// window, use `MediaQuery.of(context).size`.
///
/// If no [MediaQuery] is in scope then the [MediaQuery.of] method will throw an
/// exception, unless the `nullOk` argument is set to true, in which case it
/// returns null.
@immutable
class MediaQueryData {
/// Creates data for a media query with explicit values.
......@@ -40,6 +44,11 @@ class MediaQueryData {
});
/// Creates data for a media query based on the given window.
///
/// If you use this, you should ensure that you also register for
/// notifications so that you can update your [MediaQueryData] when the
/// window's metrics change. For example, see
/// [WidgetsBindingObserver.didChangeMetrics] or [ui.window.onMetricsChanged].
MediaQueryData.fromWindow(ui.Window window)
: size = window.physicalSize / window.devicePixelRatio,
devicePixelRatio = window.devicePixelRatio,
......@@ -117,6 +126,16 @@ class MediaQueryData {
/// Querying the current media using [MediaQuery.of] will cause your widget to
/// rebuild automatically whenever the [MediaQueryData] changes (e.g., if the
/// user rotates their device).
///
/// If no [MediaQuery] is in scope then the [MediaQuery.of] method will throw an
/// exception, unless the `nullOk` argument is set to true, in which case it
/// returns null.
///
/// See also:
///
/// * [WidgetsApp] and [MaterialApp], which introduce a [MediaQuery] and keep
/// it up to date with the current screen metrics as they change.
/// * [MediaQueryData], the data structure that represents the metrics.
class MediaQuery extends InheritedWidget {
/// Creates a widget that provides [MediaQueryData] to its descendants.
///
......@@ -135,7 +154,8 @@ class MediaQuery extends InheritedWidget {
/// height of the current window.
final MediaQueryData data;
/// The data from the closest instance of this class that encloses the given context.
/// The data from the closest instance of this class that encloses the given
/// context.
///
/// You can use this function to query the size an orientation of the screen.
/// When that information changes, your widget will be scheduled to be rebuilt,
......@@ -146,9 +166,27 @@ class MediaQuery extends InheritedWidget {
/// ```dart
/// MediaQueryData media = MediaQuery.of(context);
/// ```
static MediaQueryData of(BuildContext context) {
///
/// If there is no [MediaQuery] in scope, then this will throw an exception.
/// To return null if there is no [MediaQuery], then pass `nullOk: true`.
///
/// If you use this from a widget (e.g. in its build function), consider
/// calling [debugCheckHasMediaQuery].
static MediaQueryData of(BuildContext context, { bool nullOk: false }) {
final MediaQuery query = context.inheritFromWidgetOfExactType(MediaQuery);
return query?.data ?? new MediaQueryData.fromWindow(ui.window);
if (query != null)
return query.data;
if (nullOk)
return null;
throw new FlutterError(
'MediaQuery.of() called with a context that does not contain a MediaQuery.\n'
'No MediaQuery ancestor could be found starting from the context that was passed '
'to MediaQuery.of(). This can happen because you do not have a WidgetsApp or '
'MaterialApp widget (those widgets introduce a MediaQuery), or it can happen '
'if the context you use comes from a widget above those widgets.\n'
'The context used was:\n'
' $context'
);
}
@override
......
......@@ -203,7 +203,7 @@ class Text extends StatelessWidget {
textAlign: textAlign ?? defaultTextStyle.textAlign,
softWrap: softWrap ?? defaultTextStyle.softWrap,
overflow: overflow ?? defaultTextStyle.overflow,
textScaleFactor: textScaleFactor ?? MediaQuery.of(context).textScaleFactor,
textScaleFactor: textScaleFactor ?? MediaQuery.of(context, nullOk: true)?.textScaleFactor ?? 1.0,
maxLines: maxLines ?? defaultTextStyle.maxLines,
text: new TextSpan(
style: effectiveTextStyle,
......
......@@ -89,9 +89,13 @@ void main() {
]);
});
await tester.pumpWidget(const Center(
await tester.pumpWidget(
new MaterialApp(
home: const Center(
child: const LicensePage()
));
),
),
);
expect(licenseFuture, isNotNull);
await licenseFuture;
......
......@@ -8,7 +8,9 @@ import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
Widget buildSliverAppBarApp({ bool floating, bool pinned, double expandedHeight, bool snap: false }) {
return new Scaffold(
return new MediaQuery(
data: const MediaQueryData(),
child: new Scaffold(
body: new DefaultTabController(
length: 3,
child: new CustomScrollView(
......@@ -33,6 +35,7 @@ Widget buildSliverAppBarApp({ bool floating, bool pinned, double expandedHeight,
],
),
),
),
);
}
......@@ -246,7 +249,8 @@ void main() {
testWidgets('AppBar with no Scaffold', (WidgetTester tester) async {
await tester.pumpWidget(
new SizedBox(
new MaterialApp(
home: new SizedBox(
height: kToolbarHeight,
child: new AppBar(
leading: const Text('L'),
......@@ -254,6 +258,7 @@ void main() {
actions: <Widget>[const Text('A1'), const Text('A2')],
),
),
),
);
expect(find.text('L'), findsOneWidget);
......@@ -265,7 +270,8 @@ void main() {
testWidgets('AppBar render at zero size', (WidgetTester tester) async {
await tester.pumpWidget(
new Center(
new MaterialApp(
home: new Center(
child: new Container(
height: 0.0,
width: 0.0,
......@@ -276,6 +282,7 @@ void main() {
),
),
),
),
);
final Finder title = find.text('X');
......
......@@ -10,7 +10,8 @@ void main() {
int mutatedIndex;
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
bottomNavigationBar: new BottomNavigationBar(
items: <BottomNavigationBarItem>[
new BottomNavigationBarItem(
......@@ -27,6 +28,7 @@ void main() {
}
)
)
)
);
await tester.tap(find.text('Alarm'));
......@@ -36,7 +38,8 @@ void main() {
testWidgets('BottomNavigationBar content test', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
bottomNavigationBar: new BottomNavigationBar(
items: <BottomNavigationBarItem>[
new BottomNavigationBarItem(
......@@ -50,6 +53,7 @@ void main() {
]
)
)
)
);
final RenderBox box = tester.renderObject(find.byType(BottomNavigationBar));
......@@ -60,7 +64,8 @@ void main() {
testWidgets('BottomNavigationBar action size test', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
bottomNavigationBar: new BottomNavigationBar(
type: BottomNavigationBarType.shifting,
items: <BottomNavigationBarItem>[
......@@ -75,6 +80,7 @@ void main() {
]
)
)
)
);
Iterable<RenderBox> actions = tester.renderObjectList(find.byType(InkResponse));
......@@ -83,7 +89,8 @@ void main() {
expect(actions.elementAt(1).size.width, 105.6);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
bottomNavigationBar: new BottomNavigationBar(
currentIndex: 1,
type: BottomNavigationBarType.shifting,
......@@ -99,6 +106,7 @@ void main() {
]
)
)
)
);
await tester.pump(const Duration(milliseconds: 200));
......@@ -111,7 +119,8 @@ void main() {
testWidgets('BottomNavigationBar multiple taps test', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
bottomNavigationBar: new BottomNavigationBar(
type: BottomNavigationBarType.shifting,
items: <BottomNavigationBarItem>[
......@@ -134,6 +143,7 @@ void main() {
]
)
)
)
);
// We want to make sure that the last label does not get displaced,
......@@ -244,7 +254,8 @@ void main() {
testWidgets('BottomNavigationBar iconSize test', (WidgetTester tester) async {
double builderIconSize;
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
bottomNavigationBar: new BottomNavigationBar(
iconSize: 12.0,
items: <BottomNavigationBarItem>[
......@@ -267,6 +278,7 @@ void main() {
],
),
),
),
);
final RenderBox box = tester.renderObject(find.byType(Icon));
......
......@@ -10,24 +10,26 @@ void main() {
final Key containerKey = const Key('container');
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
drawer: new Drawer(
child: new ListView(
children: <Widget>[
new DrawerHeader(
child: new Container(
key: containerKey,
child: const Text('header')
)
child: const Text('header'),
),
),
const ListTile(
leading: const Icon(Icons.archive),
title: const Text('Archive')
)
]
)
)
)
title: const Text('Archive'),
),
],
),
),
),
),
);
expect(find.text('Archive'), findsNothing);
......
......@@ -172,7 +172,8 @@ void main() {
testWidgets('IconButton AppBar size', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
appBar: new AppBar(
actions: <Widget>[
new IconButton(
......@@ -183,6 +184,7 @@ void main() {
],
),
),
),
);
final RenderBox barBox = tester.renderObject(find.byType(AppBar));
......
// Copyright 2016 The Chromium Authors. All rights reserved.
// Copyright 2016 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.
......@@ -64,11 +64,13 @@ BorderRadius getBorderRadius(WidgetTester tester, int index) {
void main() {
testWidgets('MergeableMaterial empty', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: const MergeableMaterial()
)
)
),
),
),
);
final RenderBox box = tester.renderObject(find.byType(MergeableMaterial));
......@@ -77,7 +79,8 @@ void main() {
testWidgets('MergeableMaterial update slice', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -86,19 +89,21 @@ void main() {
child: const SizedBox(
width: 100.0,
height: 100.0
)
)
]
)
)
)
),
),
],
),
),
),
),
);
RenderBox box = tester.renderObject(find.byType(MergeableMaterial));
expect(box.size.height, equals(100.0));
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -107,12 +112,13 @@ void main() {
child: const SizedBox(
width: 100.0,
height: 200.0
)
)
]
)
)
)
),
),
],
),
),
),
),
);
box = tester.renderObject(find.byType(MergeableMaterial));
......@@ -121,7 +127,8 @@ void main() {
testWidgets('MergeableMaterial swap slices', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -137,12 +144,13 @@ void main() {
child: const SizedBox(
width: 100.0,
height: 100.0
)
)
]
)
)
)
),
),
],
),
),
),
),
);
RenderBox box = tester.renderObject(find.byType(MergeableMaterial));
......@@ -151,7 +159,8 @@ void main() {
matches(getBorderRadius(tester, 0), RadiusType.Round, RadiusType.Round);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -167,12 +176,13 @@ void main() {
child: const SizedBox(
width: 100.0,
height: 100.0
)
)
]
)
)
)
),
),
],
),
),
),
),
);
box = tester.renderObject(find.byType(MergeableMaterial));
......@@ -186,7 +196,8 @@ void main() {
testWidgets('MergeableMaterial paints shadows', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -195,12 +206,13 @@ void main() {
child: const SizedBox(
width: 100.0,
height: 100.0
)
)
]
)
)
)
),
),
],
),
),
),
),
);
final BoxShadow boxShadow = kElevationToShadow[2][0];
......@@ -215,7 +227,8 @@ void main() {
testWidgets('MergeableMaterial merge gap', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -234,12 +247,13 @@ void main() {
child: const SizedBox(
width: 100.0,
height: 100.0
)
)
]
)
)
)
),
),
],
),
),
),
),
);
final RenderBox box = tester.renderObject(find.byType(MergeableMaterial));
......@@ -249,7 +263,8 @@ void main() {
matches(getBorderRadius(tester, 1), RadiusType.Round, RadiusType.Round);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -265,12 +280,13 @@ void main() {
child: const SizedBox(
width: 100.0,
height: 100.0
)
)
]
)
)
)
),
),
],
),
),
),
),
);
await tester.pump(const Duration(milliseconds: 100));
......@@ -288,7 +304,8 @@ void main() {
testWidgets('MergeableMaterial separate slices', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -304,12 +321,13 @@ void main() {
child: const SizedBox(
width: 100.0,
height: 100.0
)
)
]
)
)
)
),
),
],
),
),
),
),
);
final RenderBox box = tester.renderObject(find.byType(MergeableMaterial));
......@@ -318,7 +336,8 @@ void main() {
matches(getBorderRadius(tester, 0), RadiusType.Round, RadiusType.Round);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -337,12 +356,13 @@ void main() {
child: const SizedBox(
width: 100.0,
height: 100.0
)
)
]
)
)
)
),
),
],
),
),
),
),
);
await tester.pump(const Duration(milliseconds: 100));
......@@ -360,7 +380,8 @@ void main() {
testWidgets('MergeableMaterial separate merge seaparate', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -382,6 +403,7 @@ void main() {
)
)
)
)
);
final RenderBox box = tester.renderObject(find.byType(MergeableMaterial));
......@@ -390,7 +412,8 @@ void main() {
matches(getBorderRadius(tester, 0), RadiusType.Round, RadiusType.Round);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -415,6 +438,7 @@ void main() {
)
)
)
)
);
await tester.pump(const Duration(milliseconds: 100));
......@@ -430,7 +454,8 @@ void main() {
matches(getBorderRadius(tester, 1), RadiusType.Round, RadiusType.Round);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -452,6 +477,7 @@ void main() {
)
)
)
)
);
await tester.pump(const Duration(milliseconds: 100));
......@@ -467,7 +493,8 @@ void main() {
matches(getBorderRadius(tester, 1), RadiusType.Sharp, RadiusType.Round);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -492,6 +519,7 @@ void main() {
)
)
)
)
);
await tester.pump(const Duration(milliseconds: 100));
......@@ -509,7 +537,8 @@ void main() {
testWidgets('MergeableMaterial insert slice', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -531,6 +560,7 @@ void main() {
)
)
)
)
);
final RenderBox box = tester.renderObject(find.byType(MergeableMaterial));
......@@ -539,7 +569,8 @@ void main() {
matches(getBorderRadius(tester, 0), RadiusType.Round, RadiusType.Round);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -568,6 +599,7 @@ void main() {
)
)
)
)
);
expect(box.size.height, equals(300));
......@@ -577,7 +609,8 @@ void main() {
testWidgets('MergeableMaterial remove slice', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -606,6 +639,7 @@ void main() {
)
)
)
)
);
final RenderBox box = tester.renderObject(find.byType(MergeableMaterial));
......@@ -614,7 +648,8 @@ void main() {
matches(getBorderRadius(tester, 0), RadiusType.Round, RadiusType.Round);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -636,6 +671,7 @@ void main() {
)
)
)
)
);
await tester.pump();
......@@ -646,7 +682,8 @@ void main() {
testWidgets('MergeableMaterial insert chunk', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -668,6 +705,7 @@ void main() {
)
)
)
)
);
final RenderBox box = tester.renderObject(find.byType(MergeableMaterial));
......@@ -676,7 +714,8 @@ void main() {
matches(getBorderRadius(tester, 0), RadiusType.Round, RadiusType.Round);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -711,6 +750,7 @@ void main() {
)
)
)
)
);
await tester.pump(const Duration(milliseconds: 100));
......@@ -730,7 +770,8 @@ void main() {
testWidgets('MergeableMaterial remove chunk', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -765,6 +806,7 @@ void main() {
)
)
)
)
);
final RenderBox box = tester.renderObject(find.byType(MergeableMaterial));
......@@ -775,7 +817,8 @@ void main() {
matches(getBorderRadius(tester, 2), RadiusType.Round, RadiusType.Round);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -797,6 +840,7 @@ void main() {
)
)
)
)
);
await tester.pump(const Duration(milliseconds: 100));
......@@ -814,7 +858,8 @@ void main() {
testWidgets('MergeableMaterial replace gap with chunk', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -839,6 +884,7 @@ void main() {
)
)
)
)
);
final RenderBox box = tester.renderObject(find.byType(MergeableMaterial));
......@@ -848,7 +894,8 @@ void main() {
matches(getBorderRadius(tester, 1), RadiusType.Round, RadiusType.Round);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -883,6 +930,7 @@ void main() {
)
)
)
)
);
await tester.pump(const Duration(milliseconds: 100));
......@@ -902,7 +950,8 @@ void main() {
testWidgets('MergeableMaterial replace chunk with gap', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -937,6 +986,7 @@ void main() {
)
)
)
)
);
final RenderBox box = tester.renderObject(find.byType(MergeableMaterial));
......@@ -947,7 +997,8 @@ void main() {
matches(getBorderRadius(tester, 2), RadiusType.Round, RadiusType.Round);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
children: <MergeableMaterialItem>[
......@@ -972,6 +1023,7 @@ void main() {
)
)
)
)
);
await tester.pump(const Duration(milliseconds: 100));
......@@ -1001,7 +1053,8 @@ void main() {
testWidgets('MergeableMaterial dividers', (WidgetTester tester) async {
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
hasDividers: true,
......@@ -1038,6 +1091,7 @@ void main() {
)
)
)
)
);
List<Widget> boxes = tester.widgetList(find.byType(DecoratedBox)).toList();
......@@ -1049,7 +1103,8 @@ void main() {
expect(isDivider(boxes[offset + 3], true, false), isTrue);
await tester.pumpWidget(
new Scaffold(
new MaterialApp(
home: new Scaffold(
body: new SingleChildScrollView(
child: new MergeableMaterial(
hasDividers: true,
......@@ -1089,6 +1144,7 @@ void main() {
)
)
)
)
);
// Wait for dividers to shrink.
......
......@@ -11,9 +11,16 @@ void main() {
final Key bodyKey = new UniqueKey();
await tester.pumpWidget(new Scaffold(
appBar: new AppBar(title: const Text('Title')),
body: new Container(key: bodyKey)
body: new Container(key: bodyKey),
));
expect(tester.takeException(), isFlutterError);
await tester.pumpWidget(new MaterialApp(
home: new Scaffold(
appBar: new AppBar(title: const Text('Title')),
body: new Container(key: bodyKey),
),
));
RenderBox bodyBox = tester.renderObject(find.byKey(bodyKey));
expect(bodyBox.size, equals(const Size(800.0, 544.0)));
......@@ -82,37 +89,37 @@ void main() {
});
testWidgets('Floating action animation', (WidgetTester tester) async {
await tester.pumpWidget(const Scaffold(
await tester.pumpWidget(new MaterialApp(home: const Scaffold(
floatingActionButton: const FloatingActionButton(
key: const Key('one'),
onPressed: null,
child: const Text("1")
)
));
)));
expect(tester.binding.transientCallbackCount, 0);
await tester.pumpWidget(const Scaffold(
await tester.pumpWidget(new MaterialApp(home: const Scaffold(
floatingActionButton: const FloatingActionButton(
key: const Key('two'),
onPressed: null,
child: const Text("2")
)
));
)));
expect(tester.binding.transientCallbackCount, greaterThan(0));
await tester.pumpWidget(new Container());
expect(tester.binding.transientCallbackCount, 0);
await tester.pumpWidget(const Scaffold());
await tester.pumpWidget(new MaterialApp(home: const Scaffold()));
expect(tester.binding.transientCallbackCount, 0);
await tester.pumpWidget(const Scaffold(
await tester.pumpWidget(new MaterialApp(home: const Scaffold(
floatingActionButton: const FloatingActionButton(
key: const Key('one'),
onPressed: null,
child: const Text("1")
)
));
)));
expect(tester.binding.transientCallbackCount, greaterThan(0));
});
......@@ -367,7 +374,14 @@ void main() {
testWidgets('body size with container', (WidgetTester tester) async {
final Key testKey = new UniqueKey();
await tester.pumpWidget(
new Scaffold(body: new Container(key: testKey))
new MediaQuery(
data: const MediaQueryData(),
child: new Scaffold(
body: new Container(
key: testKey,
),
),
),
);
expect(tester.element(find.byKey(testKey)).size, const Size(800.0, 600.0));
expect(tester.renderObject<RenderBox>(find.byKey(testKey)).localToGlobal(Offset.zero), const Offset(0.0, 0.0));
......@@ -376,7 +390,15 @@ void main() {
testWidgets('body size with sized container', (WidgetTester tester) async {
final Key testKey = new UniqueKey();
await tester.pumpWidget(
new Scaffold(body: new Container(key: testKey, height: 100.0))
new MediaQuery(
data: const MediaQueryData(),
child: new Scaffold(
body: new Container(
key: testKey,
height: 100.0,
),
),
),
);
expect(tester.element(find.byKey(testKey)).size, const Size(800.0, 100.0));
expect(tester.renderObject<RenderBox>(find.byKey(testKey)).localToGlobal(Offset.zero), const Offset(0.0, 0.0));
......@@ -385,7 +407,16 @@ void main() {
testWidgets('body size with centered container', (WidgetTester tester) async {
final Key testKey = new UniqueKey();
await tester.pumpWidget(
new Scaffold(body: new Center(child: new Container(key: testKey)))
new MediaQuery(
data: const MediaQueryData(),
child: new Scaffold(
body: new Center(
child: new Container(
key: testKey,
),
),
),
),
);
expect(tester.element(find.byKey(testKey)).size, const Size(800.0, 600.0));
expect(tester.renderObject<RenderBox>(find.byKey(testKey)).localToGlobal(Offset.zero), const Offset(0.0, 0.0));
......@@ -394,7 +425,16 @@ void main() {
testWidgets('body size with button', (WidgetTester tester) async {
final Key testKey = new UniqueKey();
await tester.pumpWidget(
new Scaffold(body: new FlatButton(key: testKey, onPressed: () { }, child: const Text('')))
new MediaQuery(
data: const MediaQueryData(),
child: new Scaffold(
body: new FlatButton(
key: testKey,
onPressed: () { },
child: const Text(''),
),
),
),
);
expect(tester.element(find.byKey(testKey)).size, const Size(88.0, 36.0));
expect(tester.renderObject<RenderBox>(find.byKey(testKey)).localToGlobal(Offset.zero), const Offset(0.0, 0.0));
......
......@@ -26,12 +26,15 @@ class MockClipboard {
}
Widget overlay(Widget child) {
return new Overlay(
return new MediaQuery(
data: const MediaQueryData(),
child: new Overlay(
initialEntries: <OverlayEntry>[
new OverlayEntry(
builder: (BuildContext context) => child,
),
],
),
);
}
......@@ -229,7 +232,9 @@ void main() {
final TextEditingController controller = new TextEditingController();
Widget builder() {
return new Overlay(
return new MediaQuery(
data: const MediaQueryData(),
child: new Overlay(
initialEntries: <OverlayEntry>[
new OverlayEntry(
builder: (BuildContext context) {
......@@ -243,6 +248,7 @@ void main() {
},
),
],
),
);
}
......
......@@ -13,7 +13,8 @@ void main() {
final Key avatarD = const Key('D');
await tester.pumpWidget(
new Material(
new MaterialApp(
home: new Material(
child: new Center(
child: new UserAccountsDrawerHeader(
currentAccountPicture: new CircleAvatar(
......@@ -41,6 +42,7 @@ void main() {
),
),
),
),
);
expect(find.text('A'), findsOneWidget);
......@@ -87,7 +89,8 @@ void main() {
VoidCallback onDetailsPressed,
EdgeInsets margin,
}) {
return new Material(
return new MaterialApp(
home: new Material(
child: new Center(
child: new UserAccountsDrawerHeader(
currentAccountPicture: currentAccountPicture,
......@@ -98,6 +101,7 @@ void main() {
margin: margin,
),
),
),
);
}
......
......@@ -8,21 +8,40 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
void main() {
testWidgets('MediaQuery has a default', (WidgetTester tester) async {
Size size;
testWidgets('MediaQuery does not have a default', (WidgetTester tester) async {
bool tested = false;
await tester.pumpWidget(
new Builder(
builder: (BuildContext context) {
tested = true;
MediaQuery.of(context); // should throw
return new Container();
}
)
);
expect(tested, isTrue);
expect(tester.takeException(), isFlutterError);
});
testWidgets('MediaQuery defaults to null', (WidgetTester tester) async {
bool tested = false;
await tester.pumpWidget(
new Builder(
builder: (BuildContext context) {
final MediaQueryData data = MediaQuery.of(context);
expect(data, hasOneLineDescription);
expect(data.hashCode, equals(data.copyWith().hashCode));
size = data.size;
final MediaQueryData data = MediaQuery.of(context, nullOk: true);
expect(data, isNull);
tested = true;
return new Container();
}
)
);
expect(tested, isTrue);
});
expect(size, equals(ui.window.physicalSize / ui.window.devicePixelRatio));
testWidgets('MediaQueryData is sane', (WidgetTester tester) async {
final MediaQueryData data = new MediaQueryData.fromWindow(ui.window);
expect(data, hasOneLineDescription);
expect(data.hashCode, equals(data.copyWith().hashCode));
expect(data.size, equals(ui.window.physicalSize / ui.window.devicePixelRatio));
});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment