Commit 1b9476c4 authored by Ian Hickson's avatar Ian Hickson

Hide routes from the API when they're not needed. (#3431)

The 'routes' table is a point of confusion with new developers. By
providing a 'home' argument that sets the '/' route, we can delay the
point at which we teach developers about 'routes' until the point where
they want to have a second route.
parent f7360126
...@@ -24,9 +24,7 @@ class ComplexLayoutAppState extends State<ComplexLayoutApp> { ...@@ -24,9 +24,7 @@ class ComplexLayoutAppState extends State<ComplexLayoutApp> {
return new MaterialApp( return new MaterialApp(
theme: lightTheme ? new ThemeData.light() : new ThemeData.dark(), theme: lightTheme ? new ThemeData.light() : new ThemeData.dark(),
title: 'Advanced Layout', title: 'Advanced Layout',
routes: <String, WidgetBuilder>{ home: new ComplexLayout()
'/': (BuildContext context) => new ComplexLayout(),
}
); );
} }
......
...@@ -465,8 +465,6 @@ class CardCollectionState extends State<CardCollection> { ...@@ -465,8 +465,6 @@ class CardCollectionState extends State<CardCollection> {
void main() { void main() {
runApp(new MaterialApp( runApp(new MaterialApp(
title: 'Cards', title: 'Cards',
routes: <String, WidgetBuilder>{ home: new CardCollection()
'/': (BuildContext context) => new CardCollection(),
}
)); ));
} }
...@@ -298,8 +298,6 @@ class DragAndDropAppState extends State<DragAndDropApp> { ...@@ -298,8 +298,6 @@ class DragAndDropAppState extends State<DragAndDropApp> {
void main() { void main() {
runApp(new MaterialApp( runApp(new MaterialApp(
title: 'Drag and Drop Flutter Demo', title: 'Drag and Drop Flutter Demo',
routes: <String, WidgetBuilder>{ home: new DragAndDropApp()
'/': (BuildContext context) => new DragAndDropApp()
}
)); ));
} }
...@@ -249,6 +249,6 @@ class _WindowManagerState extends State<WindowManager> { ...@@ -249,6 +249,6 @@ class _WindowManagerState extends State<WindowManager> {
void main() { void main() {
runApp(new MaterialApp( runApp(new MaterialApp(
title: 'Mozart', title: 'Mozart',
routes: <String, WidgetBuilder>{ '/': (_) => new WindowManager() } home: new WindowManager()
)); ));
} }
...@@ -201,8 +201,6 @@ void main() { ...@@ -201,8 +201,6 @@ void main() {
accentColor: Colors.redAccent[200] accentColor: Colors.redAccent[200]
), ),
title: 'Cards', title: 'Cards',
routes: <String, WidgetBuilder>{ home: new OverlayGeometryApp()
'/': (BuildContext context) => new OverlayGeometryApp()
}
)); ));
} }
...@@ -145,8 +145,6 @@ void main() { ...@@ -145,8 +145,6 @@ void main() {
primarySwatch: Colors.blue, primarySwatch: Colors.blue,
accentColor: Colors.redAccent[200] accentColor: Colors.redAccent[200]
), ),
routes: <String, WidgetBuilder>{ home: new PageableListApp()
'/': (BuildContext context) => new PageableListApp(),
}
)); ));
} }
...@@ -9,25 +9,19 @@ import 'package:sky_services/sky/input_event.mojom.dart' as mojom; ...@@ -9,25 +9,19 @@ import 'package:sky_services/sky/input_event.mojom.dart' as mojom;
GlobalKey _key = new GlobalKey(); GlobalKey _key = new GlobalKey();
void main() { void main() {
runApp( runApp(new MaterialApp(
new MaterialApp( title: "Hardware Key Demo",
title: "Hardware Key Demo", home: new Scaffold(
routes: <String, WidgetBuilder>{ appBar: new AppBar(
'/': (BuildContext context) { title: new Text("Hardware Key Demo")
return new Scaffold( ),
appBar: new AppBar( body: new Material(
title: new Text("Hardware Key Demo") child: new RawKeyboardDemo(
), key: _key
body: new Material( )
child: new RawKeyboardDemo( )
key: _key
)
)
);
}
}
) )
); ));
} }
class RawKeyboardDemo extends StatefulWidget { class RawKeyboardDemo extends StatefulWidget {
......
...@@ -301,11 +301,5 @@ class IsolateExampleState extends State<StatefulWidget> { ...@@ -301,11 +301,5 @@ class IsolateExampleState extends State<StatefulWidget> {
} }
void main() { void main() {
runApp( runApp(new MaterialApp(home: new IsolateExampleWidget()));
new MaterialApp(
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => new IsolateExampleWidget()
}
)
);
} }
...@@ -218,14 +218,9 @@ class _GestureDemoState extends State<GestureDemo> { ...@@ -218,14 +218,9 @@ class _GestureDemoState extends State<GestureDemo> {
void main() { void main() {
runApp(new MaterialApp( runApp(new MaterialApp(
theme: new ThemeData.dark(), theme: new ThemeData.dark(),
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) { appBar: new AppBar(title: new Text('Gestures Demo')),
return new Scaffold( body: new GestureDemo()
appBar: new AppBar( )
title: new Text('Gestures Demo')),
body: new GestureDemo()
);
}
}
)); ));
} }
...@@ -100,15 +100,11 @@ final List<String> _kNames = _initNames(); ...@@ -100,15 +100,11 @@ final List<String> _kNames = _initNames();
void main() { void main() {
runApp(new MaterialApp( runApp(new MaterialApp(
title: 'Media Query Example', title: 'Media Query Example',
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) { appBar: new AppBar(
return new Scaffold( title: new Text('Media Query Example')
appBar: new AppBar( ),
title: new Text('Media Query Example') body: new Material(child: new AdaptiveContainer(names: _kNames))
), )
body: new Material(child: new AdaptiveContainer(names: _kNames))
);
}
}
)); ));
} }
...@@ -153,16 +153,12 @@ class SectorAppState extends State<SectorApp> { ...@@ -153,16 +153,12 @@ class SectorAppState extends State<SectorApp> {
return new MaterialApp( return new MaterialApp(
theme: new ThemeData.light(), theme: new ThemeData.light(),
title: 'Sector Layout', title: 'Sector Layout',
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) { appBar: new AppBar(
return new Scaffold( title: new Text('Sector Layout in a Widget Tree')
appBar: new AppBar( ),
title: new Text('Sector Layout in a Widget Tree') body: buildBody()
), )
body: buildBody()
);
}
}
); );
} }
} }
......
...@@ -122,17 +122,14 @@ class _StyledTextDemoState extends State<StyledTextDemo> { ...@@ -122,17 +122,14 @@ class _StyledTextDemoState extends State<StyledTextDemo> {
void main() { void main() {
runApp(new MaterialApp( runApp(new MaterialApp(
theme: new ThemeData.light(), theme: new ThemeData.light(),
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) { appBar: new AppBar(
return new Scaffold( title: new Text('Hal and Dave')
appBar: new AppBar( ),
title: new Text('Hal and Dave')), body: new Material(
body: new Material( color: Colors.grey[50],
color: Colors.grey[50], child: new StyledTextDemo()
child: new StyledTextDemo() )
) )
);
}
}
)); ));
} }
...@@ -24,16 +24,14 @@ class GalleryAppState extends State<GalleryApp> { ...@@ -24,16 +24,14 @@ class GalleryAppState extends State<GalleryApp> {
title: 'Flutter Material Gallery', title: 'Flutter Material Gallery',
theme: _useLightTheme ? _kGalleryLightTheme : _kGalleryDarkTheme, theme: _useLightTheme ? _kGalleryLightTheme : _kGalleryDarkTheme,
showPerformanceOverlay: _showPerformanceOverlay, showPerformanceOverlay: _showPerformanceOverlay,
routes: { home: new GalleryHome(
'/': (BuildContext context) => new GalleryHome( useLightTheme: _useLightTheme,
useLightTheme: _useLightTheme, onThemeChanged: (bool value) { setState(() { _useLightTheme = value; }); },
onThemeChanged: (bool value) { setState(() { _useLightTheme = value; }); }, showPerformanceOverlay: _showPerformanceOverlay,
showPerformanceOverlay: _showPerformanceOverlay, onShowPerformanceOverlayChanged: (bool value) { setState(() { _showPerformanceOverlay = value; }); },
onShowPerformanceOverlayChanged: (bool value) { setState(() { _showPerformanceOverlay = value; }); }, timeDilation: timeDilation,
timeDilation: timeDilation, onTimeDilationChanged: (double value) { setState(() { timeDilation = value; }); }
onTimeDilationChanged: (double value) { setState(() { timeDilation = value; }); } )
)
}
); );
} }
} }
......
...@@ -36,10 +36,18 @@ const TextStyle _errorTextStyle = const TextStyle( ...@@ -36,10 +36,18 @@ const TextStyle _errorTextStyle = const TextStyle(
/// * [Scaffold] /// * [Scaffold]
/// * [MaterialPageRoute] /// * [MaterialPageRoute]
class MaterialApp extends WidgetsApp { class MaterialApp extends WidgetsApp {
/// Creates a MaterialApp.
///
/// At least one of [home], [routes], or [onGenerateRoute] must be
/// given. If only [routes] is given, it must include an entry for
/// the [Navigator.defaultRouteName] (`'/'`).
///
/// See also the [new WidgetsApp] constructor (which this extends).
MaterialApp({ MaterialApp({
Key key, Key key,
String title, String title,
ThemeData theme, ThemeData theme,
Widget home,
Map<String, WidgetBuilder> routes: const <String, WidgetBuilder>{}, Map<String, WidgetBuilder> routes: const <String, WidgetBuilder>{},
RouteFactory onGenerateRoute, RouteFactory onGenerateRoute,
LocaleChangedCallback onLocaleChanged, LocaleChangedCallback onLocaleChanged,
...@@ -48,6 +56,7 @@ class MaterialApp extends WidgetsApp { ...@@ -48,6 +56,7 @@ class MaterialApp extends WidgetsApp {
bool showSemanticsDebugger: false, bool showSemanticsDebugger: false,
bool debugShowCheckedModeBanner: true bool debugShowCheckedModeBanner: true
}) : theme = theme, }) : theme = theme,
home = home,
routes = routes, routes = routes,
super( super(
key: key, key: key,
...@@ -56,6 +65,8 @@ class MaterialApp extends WidgetsApp { ...@@ -56,6 +65,8 @@ class MaterialApp extends WidgetsApp {
color: theme?.primaryColor ?? Colors.blue[500], // blue[500] is the primary color of the default theme color: theme?.primaryColor ?? Colors.blue[500], // blue[500] is the primary color of the default theme
onGenerateRoute: (RouteSettings settings) { onGenerateRoute: (RouteSettings settings) {
WidgetBuilder builder = routes[settings.name]; WidgetBuilder builder = routes[settings.name];
if (builder == null && home != null && settings.name == Navigator.defaultRouteName)
builder = (BuildContext context) => home;
if (builder != null) { if (builder != null) {
return new MaterialPageRoute<Null>( return new MaterialPageRoute<Null>(
builder: builder, builder: builder,
...@@ -72,17 +83,45 @@ class MaterialApp extends WidgetsApp { ...@@ -72,17 +83,45 @@ class MaterialApp extends WidgetsApp {
debugShowCheckedModeBanner: debugShowCheckedModeBanner debugShowCheckedModeBanner: debugShowCheckedModeBanner
) { ) {
assert(debugShowMaterialGrid != null); assert(debugShowMaterialGrid != null);
assert(routes != null);
assert(!routes.containsKey(Navigator.defaultRouteName) || (home == null));
assert(routes.containsKey(Navigator.defaultRouteName) || (home != null) || (onGenerateRoute != null));
} }
/// The colors to use for the application's widgets. /// The colors to use for the application's widgets.
final ThemeData theme; final ThemeData theme;
/// The widget for the default route of the app
/// ([Navigator.defaultRouteName], which is `'/'`).
///
/// This is the page that is displayed first when the application is
/// started normally.
///
/// To be able to directly call [Theme.of], [MediaQuery.of],
/// [LocaleQuery.of], etc, in the code sets the [home] argument in
/// the constructor, you can use a [Builder] widget to get a
/// [BuildContext].
///
/// If this is not specified, then either the route with name `'/'`
/// must be given in [routes], or the [onGenerateRoute] callback
/// must be able to build a widget for that route.
final Widget home;
/// The application's top-level routing table. /// The application's top-level routing table.
/// ///
/// When a named route is pushed with [Navigator.pushNamed], the route name is /// When a named route is pushed with [Navigator.pushNamed], the route name is
/// looked up in this map. If the name is present, the associated /// looked up in this map. If the name is present, the associated
/// [WidgetBuilder] is used to construct a [MaterialPageRoute] that performs /// [WidgetBuilder] is used to construct a [MaterialPageRoute] that performs
/// an appropriate transition, including [Hero] animations, to the new route. /// an appropriate transition, including [Hero] animations, to the new route.
///
/// If the app only has one page, then you can specify it using [home] instead.
///
/// If [home] is specified, then it is an error to provide a route
/// in this map for the [Navigator.defaultRouteName] route (`'/'`).
///
/// If a route is requested that is not specified in this table (or
/// by [home]), then the [onGenerateRoute] callback is invoked to
/// build the page instead.
final Map<String, WidgetBuilder> routes; final Map<String, WidgetBuilder> routes;
/// Turns on a [GridPaper] overlay that paints a baseline grid /// Turns on a [GridPaper] overlay that paints a baseline grid
......
...@@ -66,9 +66,12 @@ class MaterialPageRoute<T> extends PageRoute<T> { ...@@ -66,9 +66,12 @@ class MaterialPageRoute<T> extends PageRoute<T> {
Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> forwardAnimation) { Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> forwardAnimation) {
Widget result = builder(context); Widget result = builder(context);
assert(() { assert(() {
if (result == null) if (result == null) {
debugPrint('The builder for route \'${settings.name}\' returned null. Route builders must never return null.'); throw new FlutterError(
assert(result != null && 'A route builder returned null. See the previous log message for details.' is String); 'The builder for route "${settings.name}" returned null.\n'
'Route builders must never return null.'
);
}
return true; return true;
}); });
return result; return result;
......
...@@ -12,30 +12,26 @@ void main() { ...@@ -12,30 +12,26 @@ void main() {
String helloSnackBar = 'Hello SnackBar'; String helloSnackBar = 'Hello SnackBar';
Key tapTarget = new Key('tap-target'); Key tapTarget = new Key('tap-target');
tester.pumpWidget(new MaterialApp( tester.pumpWidget(new MaterialApp(
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) { body: new Builder(
return new Scaffold( builder: (BuildContext context) {
body: new Builder( return new GestureDetector(
builder: (BuildContext context) { onTap: () {
return new GestureDetector( Scaffold.of(context).showSnackBar(new SnackBar(
onTap: () { content: new Text(helloSnackBar),
Scaffold.of(context).showSnackBar(new SnackBar( duration: new Duration(seconds: 2)
content: new Text(helloSnackBar), ));
duration: new Duration(seconds: 2) },
)); behavior: HitTestBehavior.opaque,
}, child: new Container(
behavior: HitTestBehavior.opaque, height: 100.0,
child: new Container( width: 100.0,
height: 100.0, key: tapTarget
width: 100.0, )
key: tapTarget );
) }
); )
} )
)
);
}
}
)); ));
expect(tester, doesNotHaveWidget(find.text(helloSnackBar))); expect(tester, doesNotHaveWidget(find.text(helloSnackBar)));
tester.tap(find.byKey(tapTarget)); tester.tap(find.byKey(tapTarget));
...@@ -63,31 +59,27 @@ void main() { ...@@ -63,31 +59,27 @@ void main() {
int snackBarCount = 0; int snackBarCount = 0;
Key tapTarget = new Key('tap-target'); Key tapTarget = new Key('tap-target');
tester.pumpWidget(new MaterialApp( tester.pumpWidget(new MaterialApp(
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) { body: new Builder(
return new Scaffold( builder: (BuildContext context) {
body: new Builder( return new GestureDetector(
builder: (BuildContext context) { onTap: () {
return new GestureDetector( snackBarCount += 1;
onTap: () { Scaffold.of(context).showSnackBar(new SnackBar(
snackBarCount += 1; content: new Text("bar$snackBarCount"),
Scaffold.of(context).showSnackBar(new SnackBar( duration: new Duration(seconds: 2)
content: new Text("bar$snackBarCount"), ));
duration: new Duration(seconds: 2) },
)); behavior: HitTestBehavior.opaque,
}, child: new Container(
behavior: HitTestBehavior.opaque, height: 100.0,
child: new Container( width: 100.0,
height: 100.0, key: tapTarget
width: 100.0, )
key: tapTarget );
) }
); )
} )
)
);
}
}
)); ));
expect(tester, doesNotHaveWidget(find.text('bar1'))); expect(tester, doesNotHaveWidget(find.text('bar1')));
expect(tester, doesNotHaveWidget(find.text('bar2'))); expect(tester, doesNotHaveWidget(find.text('bar2')));
...@@ -146,31 +138,27 @@ void main() { ...@@ -146,31 +138,27 @@ void main() {
int time; int time;
ScaffoldFeatureController<SnackBar, Null> lastController; ScaffoldFeatureController<SnackBar, Null> lastController;
tester.pumpWidget(new MaterialApp( tester.pumpWidget(new MaterialApp(
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) { body: new Builder(
return new Scaffold( builder: (BuildContext context) {
body: new Builder( return new GestureDetector(
builder: (BuildContext context) { onTap: () {
return new GestureDetector( snackBarCount += 1;
onTap: () { lastController = Scaffold.of(context).showSnackBar(new SnackBar(
snackBarCount += 1; content: new Text("bar$snackBarCount"),
lastController = Scaffold.of(context).showSnackBar(new SnackBar( duration: new Duration(seconds: time)
content: new Text("bar$snackBarCount"), ));
duration: new Duration(seconds: time) },
)); behavior: HitTestBehavior.opaque,
}, child: new Container(
behavior: HitTestBehavior.opaque, height: 100.0,
child: new Container( width: 100.0,
height: 100.0, key: tapTarget
width: 100.0, )
key: tapTarget );
) }
); )
} )
)
);
}
}
)); ));
expect(tester, doesNotHaveWidget(find.text('bar1'))); expect(tester, doesNotHaveWidget(find.text('bar1')));
expect(tester, doesNotHaveWidget(find.text('bar2'))); expect(tester, doesNotHaveWidget(find.text('bar2')));
...@@ -236,31 +224,27 @@ void main() { ...@@ -236,31 +224,27 @@ void main() {
int snackBarCount = 0; int snackBarCount = 0;
Key tapTarget = new Key('tap-target'); Key tapTarget = new Key('tap-target');
tester.pumpWidget(new MaterialApp( tester.pumpWidget(new MaterialApp(
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) { body: new Builder(
return new Scaffold( builder: (BuildContext context) {
body: new Builder( return new GestureDetector(
builder: (BuildContext context) { onTap: () {
return new GestureDetector( snackBarCount += 1;
onTap: () { Scaffold.of(context).showSnackBar(new SnackBar(
snackBarCount += 1; content: new Text("bar$snackBarCount"),
Scaffold.of(context).showSnackBar(new SnackBar( duration: new Duration(seconds: 2)
content: new Text("bar$snackBarCount"), ));
duration: new Duration(seconds: 2) },
)); behavior: HitTestBehavior.opaque,
}, child: new Container(
behavior: HitTestBehavior.opaque, height: 100.0,
child: new Container( width: 100.0,
height: 100.0, key: tapTarget
width: 100.0, )
key: tapTarget );
) }
); )
} )
)
);
}
}
)); ));
expect(tester, doesNotHaveWidget(find.text('bar1'))); expect(tester, doesNotHaveWidget(find.text('bar1')));
expect(tester, doesNotHaveWidget(find.text('bar2'))); expect(tester, doesNotHaveWidget(find.text('bar2')));
...@@ -286,31 +270,27 @@ void main() { ...@@ -286,31 +270,27 @@ void main() {
testWidgets((WidgetTester tester) { testWidgets((WidgetTester tester) {
int tapCount = 0; int tapCount = 0;
tester.pumpWidget(new MaterialApp( tester.pumpWidget(new MaterialApp(
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) { body: new Builder(
return new Scaffold( builder: (BuildContext context) {
body: new Builder( return new GestureDetector(
builder: (BuildContext context) { onTap: () {
return new GestureDetector( Scaffold.of(context).showSnackBar(new SnackBar(
onTap: () { content: new Text('I am a snack bar.'),
Scaffold.of(context).showSnackBar(new SnackBar( duration: new Duration(seconds: 2),
content: new Text('I am a snack bar.'), action: new SnackBarAction(
duration: new Duration(seconds: 2), label: 'ACTION',
action: new SnackBarAction( onPressed: () {
label: 'ACTION', ++tapCount;
onPressed: () { }
++tapCount; )
} ));
) },
)); child: new Text('X')
}, );
child: new Text('X') }
); )
} )
)
);
}
}
)); ));
tester.tap(find.text('X')); tester.tap(find.text('X'));
tester.pump(); // start animation tester.pump(); // start animation
......
...@@ -14,19 +14,15 @@ void main() { ...@@ -14,19 +14,15 @@ void main() {
int buildCount = 0; int buildCount = 0;
tester.pumpWidget(new MaterialApp( tester.pumpWidget(new MaterialApp(
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) { key: scaffoldKey,
return new Scaffold( body: new Center(child: new Text('body'))
key: scaffoldKey, )
body: new Center(child: new Text('body'))
);
}
}
)); ));
bottomSheet = scaffoldKey.currentState.showBottomSheet/*<Null>*/((_) { bottomSheet = scaffoldKey.currentState.showBottomSheet/*<Null>*/((_) {
return new Builder( return new Builder(
builder: (_) { builder: (BuildContext context) {
buildCount += 1; buildCount += 1;
return new Container(height: 200.0); return new Container(height: 200.0);
} }
......
...@@ -10,23 +10,23 @@ import 'package:test/test.dart'; ...@@ -10,23 +10,23 @@ import 'package:test/test.dart';
void main() { void main() {
test('Verify that a tap dismisses a modal BottomSheet', () { test('Verify that a tap dismisses a modal BottomSheet', () {
testWidgets((WidgetTester tester) { testWidgets((WidgetTester tester) {
BuildContext context; BuildContext savedContext;
bool showBottomSheetThenCalled = false; bool showBottomSheetThenCalled = false;
tester.pumpWidget(new MaterialApp( tester.pumpWidget(new MaterialApp(
routes: <String, WidgetBuilder>{ home: new Builder(
'/': (BuildContext ctx) { builder: (BuildContext context) {
context = ctx; savedContext = context;
return new Container(); return new Container();
}
} }
)
)); ));
tester.pump(); tester.pump();
expect(tester, doesNotHaveWidget(find.text('BottomSheet'))); expect(tester, doesNotHaveWidget(find.text('BottomSheet')));
showModalBottomSheet/*<Null>*/( showModalBottomSheet/*<Null>*/(
context: context, context: savedContext,
builder: (BuildContext context) => new Text('BottomSheet') builder: (BuildContext context) => new Text('BottomSheet')
).then((Null result) { ).then((Null result) {
expect(result, isNull); expect(result, isNull);
...@@ -46,7 +46,7 @@ void main() { ...@@ -46,7 +46,7 @@ void main() {
tester.pump(new Duration(seconds: 1)); // frame after the animation (sheet has been removed) tester.pump(new Duration(seconds: 1)); // frame after the animation (sheet has been removed)
expect(tester, doesNotHaveWidget(find.text('BottomSheet'))); expect(tester, doesNotHaveWidget(find.text('BottomSheet')));
showModalBottomSheet/*<Null>*/(context: context, builder: (BuildContext context) => new Text('BottomSheet')); showModalBottomSheet/*<Null>*/(context: savedContext, builder: (BuildContext context) => new Text('BottomSheet'));
tester.pump(); // bottom sheet show animation starts tester.pump(); // bottom sheet show animation starts
tester.pump(new Duration(seconds: 1)); // animation done tester.pump(new Duration(seconds: 1)); // animation done
expect(tester, hasWidget(find.text('BottomSheet'))); expect(tester, hasWidget(find.text('BottomSheet')));
...@@ -66,14 +66,10 @@ void main() { ...@@ -66,14 +66,10 @@ void main() {
bool showBottomSheetThenCalled = false; bool showBottomSheetThenCalled = false;
tester.pumpWidget(new MaterialApp( tester.pumpWidget(new MaterialApp(
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) { key: scaffoldKey,
return new Scaffold( body: new Center(child: new Text('body'))
key: scaffoldKey, )
body: new Center(child: new Text('body'))
);
}
}
)); ));
expect(showBottomSheetThenCalled, isFalse); expect(showBottomSheetThenCalled, isFalse);
......
...@@ -11,22 +11,25 @@ void main() { ...@@ -11,22 +11,25 @@ void main() {
testWidgets((WidgetTester tester) { testWidgets((WidgetTester tester) {
List<int> accepted = <int>[]; List<int> accepted = <int>[];
tester.pumpWidget(new MaterialApp(routes: <String, WidgetBuilder>{ tester.pumpWidget(new MaterialApp(
'/': (BuildContext context) { home: 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: ),
(BuildContext context, List<int> data, List<dynamic> rejects) { new DragTarget<int>(
return new Container(height: 100.0, child: new Text('Target')); builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
}, onAccept: (int data) { return new Container(height: 100.0, child: new Text('Target'));
accepted.add(data); },
}), onAccept: (int data) {
]); accepted.add(data);
}, }
})); ),
]
)
));
expect(accepted, isEmpty); expect(accepted, isEmpty);
expect(tester, hasWidget(find.text('Source'))); expect(tester, hasWidget(find.text('Source')));
...@@ -66,31 +69,38 @@ void main() { ...@@ -66,31 +69,38 @@ void main() {
List<String> events = <String>[]; List<String> events = <String>[];
Point firstLocation, secondLocation; Point firstLocation, secondLocation;
tester.pumpWidget(new MaterialApp(routes: <String, WidgetBuilder>{ tester.pumpWidget(new MaterialApp(
'/': (BuildContext context) { home: 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 GestureDetector( new Stack(
children: <Widget>[
new GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () { onTap: () {
events.add('tap'); events.add('tap');
}, },
child: new Container(child: new Text('Button'))), child: new Container(child: new Text('Button')
new DragTarget<int>(builder: (BuildContext context, )
List<int> data, List<dynamic> rejects) { ),
return new IgnorePointer( new DragTarget<int>(
child: new Container(child: new Text('Target'))); builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
}, onAccept: (int data) { return new IgnorePointer(
events.add('drop'); child: new Container(child: new Text('Target'))
}), );
]), },
]); onAccept: (int data) {
}, events.add('drop');
})); }),
]
),
]
)
));
expect(events, isEmpty); expect(events, isEmpty);
expect(tester, hasWidget(find.text('Source'))); expect(tester, hasWidget(find.text('Source')));
...@@ -151,27 +161,31 @@ void main() { ...@@ -151,27 +161,31 @@ void main() {
List<String> events = <String>[]; List<String> events = <String>[];
Point firstLocation, secondLocation; Point firstLocation, secondLocation;
tester.pumpWidget(new MaterialApp(routes: <String, WidgetBuilder>{ tester.pumpWidget(new MaterialApp(
'/': (BuildContext context) { home: 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(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () { onTap: () {
events.add('tap'); events.add('tap');
}, },
child: new Container(child: new Text('Button'))), child: new Container(child: new Text('Button'))
feedback: new Text('Dragging')), ),
new DragTarget<int>(builder: feedback: new Text('Dragging')
(BuildContext context, List<int> data, List<dynamic> rejects) { ),
return new Text('Target'); new DragTarget<int>(
}, onAccept: (int data) { builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
events.add('drop'); return new Text('Target');
}), },
]); onAccept: (int data) {
}, events.add('drop');
})); }
),
]
)
));
expect(events, isEmpty); expect(events, isEmpty);
expect(tester, hasWidget(find.text('Button'))); expect(tester, hasWidget(find.text('Button')));
...@@ -203,22 +217,25 @@ void main() { ...@@ -203,22 +217,25 @@ void main() {
List<String> events = <String>[]; List<String> events = <String>[];
Point firstLocation, secondLocation; Point firstLocation, secondLocation;
tester.pumpWidget(new MaterialApp(routes: <String, WidgetBuilder>{ tester.pumpWidget(new MaterialApp(
'/': (BuildContext context) { home: 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: ),
(BuildContext context, List<int> data, List<dynamic> rejects) { new DragTarget<int>(
return new Text('Target'); builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
}, onAccept: (int data) { return new Text('Target');
events.add('drop'); },
}), onAccept: (int data) {
]); events.add('drop');
}, }
})); ),
]
)
));
expect(events, isEmpty); expect(events, isEmpty);
expect(tester, hasWidget(find.text('Source'))); expect(tester, hasWidget(find.text('Source')));
...@@ -248,22 +265,25 @@ void main() { ...@@ -248,22 +265,25 @@ void main() {
List<String> events = <String>[]; List<String> events = <String>[];
Point firstLocation, secondLocation; Point firstLocation, secondLocation;
tester.pumpWidget(new MaterialApp(routes: <String, WidgetBuilder>{ tester.pumpWidget(new MaterialApp(
'/': (BuildContext context) { home: 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: ),
(BuildContext context, List<int> data, List<dynamic> rejects) { new DragTarget<int>(
return new Text('Target'); builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
}, onAccept: (int data) { return new Text('Target');
events.add('drop'); },
}), onAccept: (int data) {
]); events.add('drop');
}, }
})); ),
]
)
));
expect(events, isEmpty); expect(events, isEmpty);
expect(tester, hasWidget(find.text('Source'))); expect(tester, hasWidget(find.text('Source')));
...@@ -296,27 +316,35 @@ void main() { ...@@ -296,27 +316,35 @@ void main() {
List<String> events = <String>[]; List<String> events = <String>[];
Point firstLocation, secondLocation, thirdLocation; Point firstLocation, secondLocation, thirdLocation;
tester.pumpWidget(new MaterialApp(routes: <String, WidgetBuilder>{ tester.pumpWidget(new MaterialApp(
'/': (BuildContext context) { home: 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) { },
events.add('drop $data'); onAccept: (int data) {
}), events.add('drop $data');
}
),
new Container(height: 400.0), new Container(height: 400.0),
new HorizontalDraggable<int>( new HorizontalDraggable<int>(
data: 1, child: new Text('H'), feedback: new Text('Dragging')), data: 1,
child: new Text('H'),
feedback: new Text('Dragging')
),
new VerticalDraggable<int>( new VerticalDraggable<int>(
data: 2, child: new Text('V'), feedback: new Text('Dragging')), data: 2,
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, hasWidget(find.text('Target'))); expect(tester, hasWidget(find.text('Target')));
...@@ -395,27 +423,36 @@ void main() { ...@@ -395,27 +423,36 @@ void main() {
List<String> events = <String>[]; List<String> events = <String>[];
Point firstLocation, secondLocation, thirdLocation; Point firstLocation, secondLocation, thirdLocation;
tester.pumpWidget(new MaterialApp(routes: <String, WidgetBuilder>{ tester.pumpWidget(new MaterialApp(
'/': (BuildContext context) { home: 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>(
return new Text('Target'); builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
}, onAccept: (int data) { return new Text('Target');
events.add('drop $data'); },
}), onAccept: (int data) {
events.add('drop $data');
}
),
new Container(width: 400.0), new Container(width: 400.0),
new HorizontalDraggable<int>( new HorizontalDraggable<int>(
data: 1, child: new Text('H'), feedback: new Text('Dragging')), data: 1,
child: new Text('H'),
feedback: new Text('Dragging')
),
new VerticalDraggable<int>( new VerticalDraggable<int>(
data: 2, child: new Text('V'), feedback: new Text('Dragging')), data: 2,
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, hasWidget(find.text('Target'))); expect(tester, hasWidget(find.text('Target')));
...@@ -495,25 +532,28 @@ void main() { ...@@ -495,25 +532,28 @@ void main() {
List<int> accepted = <int>[]; List<int> accepted = <int>[];
bool onDraggableCanceledCalled = false; bool onDraggableCanceledCalled = false;
tester.pumpWidget(new MaterialApp(routes: <String, WidgetBuilder>{ tester.pumpWidget(new MaterialApp(
'/': (BuildContext context) { home: 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: ),
(BuildContext context, List<int> data, List<dynamic> rejects) { new DragTarget<int>(
return new Container(height: 100.0, child: new Text('Target')); builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
}, onAccept: (int data) { return new Container(height: 100.0, child: new Text('Target'));
accepted.add(data); },
}), onAccept: (int data) {
]); accepted.add(data);
}, }
})); ),
]
)
));
expect(accepted, isEmpty); expect(accepted, isEmpty);
expect(tester, hasWidget(find.text('Source'))); expect(tester, hasWidget(find.text('Source')));
...@@ -561,28 +601,31 @@ void main() { ...@@ -561,28 +601,31 @@ void main() {
Velocity onDraggableCanceledVelocity; Velocity onDraggableCanceledVelocity;
Offset onDraggableCanceledOffset; Offset onDraggableCanceledOffset;
tester.pumpWidget(new MaterialApp(routes: <String, WidgetBuilder>{ tester.pumpWidget(new MaterialApp(
'/': (BuildContext context) { home: 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;
onDraggableCanceledVelocity = velocity; onDraggableCanceledVelocity = velocity;
onDraggableCanceledOffset = offset; onDraggableCanceledOffset = offset;
}), }
),
new DragTarget<int>( new DragTarget<int>(
builder: (BuildContext context, List<int> data, builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
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, hasWidget(find.text('Source'))); expect(tester, hasWidget(find.text('Source')));
...@@ -633,28 +676,29 @@ void main() { ...@@ -633,28 +676,29 @@ void main() {
Velocity onDraggableCanceledVelocity; Velocity onDraggableCanceledVelocity;
Offset onDraggableCanceledOffset; Offset onDraggableCanceledOffset;
tester.pumpWidget(new MaterialApp(routes: <String, WidgetBuilder>{ tester.pumpWidget(new MaterialApp(
'/': (BuildContext context) { home: new Column(children: <Widget>[
return new Column(children: <Widget>[ new Draggable<int>(
new Draggable<int>( data: 1,
data: 1, child: new Text('Source'),
child: new Text('Source'), feedback: new Text('Source'),
feedback: new Text('Source'), onDraggableCanceled: (Velocity velocity, Offset offset) {
onDraggableCanceled: (Velocity velocity, Offset offset) { onDraggableCanceledCalled = true;
onDraggableCanceledCalled = true; onDraggableCanceledVelocity = velocity;
onDraggableCanceledVelocity = velocity; onDraggableCanceledOffset = offset;
onDraggableCanceledOffset = offset; }
}), ),
new DragTarget<int>( new DragTarget<int>(
builder: (BuildContext context, List<int> data, builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
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, hasWidget(find.text('Source'))); expect(tester, hasWidget(find.text('Source')));
...@@ -683,40 +727,56 @@ void main() { ...@@ -683,40 +727,56 @@ void main() {
}); });
test('Drag and drop - allow pass thru of unaccepted data test', () { test('Drag and drop - allow pass thru of unaccepted data test', () {
testWidgets((WidgetTester tester) { testWidgets((WidgetTester tester) {
List<int> acceptedInts = <int>[]; List<int> acceptedInts = <int>[];
List<double> acceptedDoubles = <double>[]; List<double> acceptedDoubles = <double>[];
tester.pumpWidget(new MaterialApp(routes: <String, WidgetBuilder>{ tester.pumpWidget(new MaterialApp(
'/': (BuildContext context) { home: 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 DragTarget<int>(builder: (BuildContext context, new Stack(
List<int> data, List<dynamic> rejects) { children: <Widget>[
return new IgnorePointer(child: new Container( new DragTarget<int>(
height: 100.0, child: new Text('Target1'))); builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
}, onAccept: (int data) { return new IgnorePointer(
acceptedInts.add(data); child: new Container(
}), height: 100.0,
new DragTarget<double>(builder: (BuildContext context, child: new Text('Target1')
List<double> data, List<dynamic> rejects) { )
return new IgnorePointer(child: new Container( );
height: 100.0, child: new Text('Target2'))); },
}, onAccept: (double data) { onAccept: (int data) {
acceptedDoubles.add(data); acceptedInts.add(data);
}), }
]) ),
]); new DragTarget<double>(
}, builder: (BuildContext context, List<double> data, List<dynamic> rejects) {
})); return new IgnorePointer(
child: new Container(
height: 100.0,
child: new Text('Target2')
)
);
},
onAccept: (double data) {
acceptedDoubles.add(data);
}
),
]
)
]
)
));
expect(acceptedInts, isEmpty); expect(acceptedInts, isEmpty);
expect(acceptedDoubles, isEmpty); expect(acceptedDoubles, isEmpty);
...@@ -791,32 +851,46 @@ void main() { ...@@ -791,32 +851,46 @@ void main() {
List<DragTargetData> acceptedDragTargetDatas = <DragTargetData>[]; List<DragTargetData> acceptedDragTargetDatas = <DragTargetData>[];
List<ExtendedDragTargetData> acceptedExtendedDragTargetDatas = <ExtendedDragTargetData>[]; List<ExtendedDragTargetData> acceptedExtendedDragTargetDatas = <ExtendedDragTargetData>[];
DragTargetData dragTargetData = new DragTargetData(); DragTargetData dragTargetData = new DragTargetData();
tester.pumpWidget(new MaterialApp(routes: <String, WidgetBuilder>{ tester.pumpWidget(new MaterialApp(
'/': (BuildContext context) { home: new Column(
return new Column(children: <Widget>[ children: <Widget>[
new Draggable<DragTargetData>( new Draggable<DragTargetData>(
data: dragTargetData, data: dragTargetData,
child: new Text('Source'), child: new Text('Source'),
feedback: new Text('Dragging')), feedback: new Text('Dragging')
new Stack(children: [ ),
new DragTarget<DragTargetData>(builder: (BuildContext context, new Stack(
List<DragTargetData> data, List<dynamic> rejects) { children: <Widget>[
return new IgnorePointer(child: new Container( new DragTarget<DragTargetData>(
height: 100.0, child: new Text('Target1'))); builder: (BuildContext context, List<DragTargetData> data, List<dynamic> rejects) {
}, onAccept: (DragTargetData data) { return new IgnorePointer(
acceptedDragTargetDatas.add(data); child: new Container(
}), height: 100.0,
new DragTarget<ExtendedDragTargetData>(builder: (BuildContext context, child: new Text('Target1')
List<ExtendedDragTargetData> data, List<ExtendedDragTargetData> rejects) { )
return new IgnorePointer(child: new Container( );
height: 100.0, child: new Text('Target2'))); }, onAccept: (DragTargetData data) {
}, onAccept: (ExtendedDragTargetData data) { acceptedDragTargetDatas.add(data);
acceptedExtendedDragTargetDatas.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(find.text('Source')); Point dragTargetLocation = tester.getCenter(find.text('Source'));
Point targetLocation = tester.getCenter(find.text('Target1')); Point targetLocation = tester.getCenter(find.text('Target1'));
......
...@@ -12,19 +12,19 @@ void main() { ...@@ -12,19 +12,19 @@ void main() {
test('Drawer control test', () { test('Drawer control test', () {
testWidgets((WidgetTester tester) { testWidgets((WidgetTester tester) {
GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>(); GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
BuildContext context; BuildContext savedContext;
tester.pumpWidget( tester.pumpWidget(
new MaterialApp( new MaterialApp(
routes: <String, WidgetBuilder>{ home: new Builder(
'/': (BuildContext ctx) { builder: (BuildContext context) {
context = ctx; savedContext = context;
return new Scaffold( return new Scaffold(
key: scaffoldKey, key: scaffoldKey,
drawer: new Text('drawer'), drawer: new Text('drawer'),
body: new Container() body: new Container()
); );
} }
} )
) )
); );
tester.pump(); // no effect tester.pump(); // no effect
...@@ -34,7 +34,7 @@ void main() { ...@@ -34,7 +34,7 @@ void main() {
expect(tester, hasWidget(find.text('drawer'))); expect(tester, hasWidget(find.text('drawer')));
tester.pump(new Duration(seconds: 1)); // animation done tester.pump(new Duration(seconds: 1)); // animation done
expect(tester, hasWidget(find.text('drawer'))); expect(tester, hasWidget(find.text('drawer')));
Navigator.pop(context); Navigator.pop(savedContext);
tester.pump(); // drawer should be starting to animate away tester.pump(); // drawer should be starting to animate away
expect(tester, hasWidget(find.text('drawer'))); expect(tester, hasWidget(find.text('drawer')));
tester.pump(new Duration(seconds: 1)); // animation done tester.pump(new Duration(seconds: 1)); // animation done
...@@ -47,15 +47,11 @@ void main() { ...@@ -47,15 +47,11 @@ void main() {
GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>(); GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
tester.pumpWidget( tester.pumpWidget(
new MaterialApp( new MaterialApp(
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) { key: scaffoldKey,
return new Scaffold( drawer: new Text('drawer'),
key: scaffoldKey, body: new Container()
drawer: new Text('drawer'), )
body: new Container()
);
}
}
) )
); );
tester.pump(); // no effect tester.pump(); // no effect
...@@ -85,27 +81,23 @@ void main() { ...@@ -85,27 +81,23 @@ void main() {
GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>(); GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
tester.pumpWidget( tester.pumpWidget(
new MaterialApp( new MaterialApp(
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) { key: scaffoldKey,
return new Scaffold( drawer: new Drawer(
key: scaffoldKey, child: new Block(
drawer: new Drawer( children: <Widget>[
child: new Block( new Text('drawer'),
children: <Widget>[ new Container(
new Text('drawer'), height: 1000.0,
new Container( decoration: new BoxDecoration(
height: 1000.0, backgroundColor: Colors.blue[500]
decoration: new BoxDecoration( )
backgroundColor: Colors.blue[500] ),
) ]
), )
] ),
) body: new Container()
), )
body: new Container()
);
}
}
) )
); );
expect(tester, doesNotHaveWidget(find.text('drawer'))); expect(tester, doesNotHaveWidget(find.text('drawer')));
......
...@@ -21,7 +21,7 @@ You can use [hyperlinks](hyperlink) in markdown ...@@ -21,7 +21,7 @@ You can use [hyperlinks](hyperlink) in markdown
## Code blocks ## Code blocks
Formatted Dart code looks really pretty too. This is an example of how to create your own Markdown widget: Formatted Dart code looks really pretty too. This is an example of how to create your own Markdown widget:
new Markdown(data: "Hello _world_!"); new Markdown(data: 'Hello _world_!');
Enjoy! Enjoy!
"""; """;
...@@ -29,11 +29,9 @@ Enjoy! ...@@ -29,11 +29,9 @@ Enjoy!
void main() { void main() {
runApp(new MaterialApp( runApp(new MaterialApp(
title: "Markdown Demo", title: "Markdown Demo",
routes: <String, WidgetBuilder>{ home: new Scaffold(
'/': (BuildContext context) => new Scaffold( appBar: new AppBar(title: new Text('Markdown Demo')),
appBar: new AppBar(title: new Text("Markdown Demo")), body: new Markdown(data: _kMarkdownData)
body: new Markdown(data: _kMarkdownData) )
)
}
)); ));
} }
...@@ -15,9 +15,7 @@ void main() { ...@@ -15,9 +15,7 @@ void main() {
theme: new ThemeData( theme: new ThemeData(
primarySwatch: Colors.blue primarySwatch: Colors.blue
), ),
routes: <String, WidgetBuilder>{ home: new FlutterDemo()
'/': (BuildContext context) => new FlutterDemo()
}
) )
); );
} }
......
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