Revert "Merge pull request #2639 from Hixie/always_specify_types"
This reverts commit f41b3411da35929b09009e47cb52474389e42874, reversing changes made to e33d8d96212f3e337a6660f1eb1118bffc945bf5. This was a bad check-in due to my mangling uploading a new version of the branch from a different machine. This reverts https://github.com/flutter/flutter/pull/2639 and will be replaced by https://github.com/flutter/flutter/pull/2640
This commit is contained in:
parent
f41b3411da
commit
43b0104114
@ -26,9 +26,9 @@ class CardCollectionState extends State<CardCollection> {
|
||||
const TextStyle(color: Colors.white, fontSize: 18.0, fontWeight: FontWeight.bold);
|
||||
|
||||
// TODO(hansmuller): need a local image asset
|
||||
static const String _sunshineURL = "http://www.walltor.com/images/wallpaper/good-morning-sunshine-58540.jpg";
|
||||
static const _sunshineURL = "http://www.walltor.com/images/wallpaper/good-morning-sunshine-58540.jpg";
|
||||
|
||||
static const double kCardMargins = 8.0;
|
||||
static const kCardMargins = 8.0;
|
||||
|
||||
final TextStyle backgroundTextStyle =
|
||||
Typography.white.title.copyWith(textAlign: TextAlign.center);
|
||||
|
@ -23,7 +23,7 @@ class PageableListAppState extends State<PageableListApp> {
|
||||
List<Size> cardSizes = [
|
||||
[100.0, 300.0], [300.0, 100.0], [200.0, 400.0], [400.0, 400.0], [300.0, 400.0]
|
||||
]
|
||||
.map((List<double> args) => new Size(args[0], args[1]))
|
||||
.map((args) => new Size(args[0], args[1]))
|
||||
.toList();
|
||||
|
||||
cardModels = new List<CardModel>.generate(cardSizes.length, (int i) {
|
||||
|
@ -39,7 +39,7 @@ class PianoKey {
|
||||
player.ptr.pause();
|
||||
}
|
||||
|
||||
Future<Null> load(MediaServiceProxy mediaService) async {
|
||||
Future load(MediaServiceProxy mediaService) async {
|
||||
try {
|
||||
mediaService.ptr.createPlayer(player);
|
||||
UrlResponse response = await fetchUrl(soundUrl);
|
||||
@ -61,11 +61,11 @@ class PianoApp extends StatelessComponent {
|
||||
new PianoKey(Colors.purple[500], iLoveYou),
|
||||
];
|
||||
|
||||
Future<Null> loadSounds() async {
|
||||
Future loadSounds() async {
|
||||
MediaServiceProxy mediaService = new MediaServiceProxy.unbound();
|
||||
try {
|
||||
shell.connectToService("mojo:media_service", mediaService);
|
||||
List<Future<Null>> pending = <Future<Null>>[];
|
||||
List<Future<MediaPlayerPrepareResponseParams>> pending = <Future<MediaPlayerPrepareResponseParams>>[];
|
||||
for (PianoKey key in keys)
|
||||
pending.add(key.load(mediaService));
|
||||
await Future.wait(pending);
|
||||
@ -93,8 +93,8 @@ class PianoApp extends StatelessComponent {
|
||||
}
|
||||
|
||||
Widget statusBox(Widget child) {
|
||||
const Color mediumGray = const Color(0xff555555);
|
||||
const Color darkGray = const Color(0xff222222);
|
||||
const mediumGray = const Color(0xff555555);
|
||||
const darkGray = const Color(0xff222222);
|
||||
return new Center(
|
||||
child: new Container(
|
||||
decoration: const BoxDecoration(
|
||||
@ -121,7 +121,7 @@ Widget splashScreen() {
|
||||
);
|
||||
}
|
||||
|
||||
Future<Null> main() async {
|
||||
Future main() async {
|
||||
runApp(splashScreen());
|
||||
|
||||
PianoApp app = new PianoApp();
|
||||
|
@ -80,7 +80,7 @@ class _ButtonsDemoState extends State<ButtonsDemo> {
|
||||
tooltip: 'Open FAB demos',
|
||||
child: new Icon(icon: Icons.add),
|
||||
onPressed: () {
|
||||
Navigator.push(context, new MaterialPageRoute<Null>(
|
||||
Navigator.push(context, new MaterialPageRoute(
|
||||
builder: (BuildContext context) => new TabsFabDemo()
|
||||
));
|
||||
}
|
||||
@ -97,7 +97,7 @@ class _ButtonsDemoState extends State<ButtonsDemo> {
|
||||
new RaisedButton(
|
||||
child: new Text("Launch Demo"),
|
||||
onPressed: () {
|
||||
Navigator.push(context, new MaterialPageRoute<Null>(
|
||||
Navigator.push(context, new MaterialPageRoute(
|
||||
builder: (BuildContext context) => new SnackBarDemo()
|
||||
));
|
||||
}
|
||||
@ -127,7 +127,7 @@ class _ButtonsDemoState extends State<ButtonsDemo> {
|
||||
new FlatButton(
|
||||
child: new Text("Launch Demo"),
|
||||
onPressed: () {
|
||||
Navigator.push(context, new MaterialPageRoute<Null>(
|
||||
Navigator.push(context, new MaterialPageRoute(
|
||||
builder: (_) => new DialogDemo()
|
||||
));
|
||||
}
|
||||
@ -200,10 +200,10 @@ class _ButtonsDemoState extends State<ButtonsDemo> {
|
||||
center: new Text("Buttons"),
|
||||
tabBar: new TabBar<_ButtonDemo>(
|
||||
isScrollable: true,
|
||||
labels: new Map<_ButtonDemo, TabLabel>.fromIterable(demos, value: (_ButtonDemo demo) => demo.tabLabel)
|
||||
labels: new Map.fromIterable(demos, value: (_ButtonDemo demo) => demo.tabLabel)
|
||||
)
|
||||
),
|
||||
body: new TabBarView<_ButtonDemo>(
|
||||
body: new TabBarView(
|
||||
children: demos.map(buildTabView).toList()
|
||||
)
|
||||
)
|
||||
|
@ -77,8 +77,8 @@ class ColorSwatchTabView extends StatelessComponent {
|
||||
}
|
||||
|
||||
final ColorSwatch swatch;
|
||||
final TextStyle blackTextStyle = Typography.black.body1;
|
||||
final TextStyle whiteTextStyle = Typography.white.body1;
|
||||
final blackTextStyle = Typography.black.body1;
|
||||
final whiteTextStyle = Typography.white.body1;
|
||||
|
||||
Widget build(BuildContext context) {
|
||||
List<Widget> colorItems = swatch.colors.keys.map((int index) {
|
||||
@ -116,12 +116,12 @@ class ColorsDemo extends StatelessComponent {
|
||||
center: new Text("Colors"),
|
||||
tabBar: new TabBar<ColorSwatch>(
|
||||
isScrollable: true,
|
||||
labels: new Map<ColorSwatch, TabLabel>.fromIterable(colorSwatches, value: (ColorSwatch swatch) {
|
||||
labels: new Map.fromIterable(colorSwatches, value: (ColorSwatch swatch) {
|
||||
return new TabLabel(text: swatch.name);
|
||||
})
|
||||
)
|
||||
),
|
||||
body: new TabBarView<ColorSwatch>(
|
||||
body: new TabBarView(
|
||||
children: colorSwatches.map((ColorSwatch swatch) {
|
||||
return new ColorSwatchTabView(swatch: swatch);
|
||||
})
|
||||
|
@ -14,7 +14,7 @@ class DatePickerDemo extends StatefulComponent {
|
||||
class _DatePickerDemoState extends State<DatePickerDemo> {
|
||||
DateTime _selectedDate = new DateTime.now();
|
||||
|
||||
Future<Null> _handleSelectDate() async {
|
||||
Future _handleSelectDate() async {
|
||||
DateTime picked = await showDatePicker(
|
||||
context: context,
|
||||
initialDate: _selectedDate,
|
||||
|
@ -60,12 +60,12 @@ class DialogDemo extends StatefulComponent {
|
||||
class DialogDemoState extends State<DialogDemo> {
|
||||
final GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
|
||||
|
||||
void showDemoDialog/*<T>*/({ BuildContext context, Dialog dialog }) {
|
||||
showDialog/*<T>*/(
|
||||
void showDemoDialog({ BuildContext context, Dialog dialog }) {
|
||||
showDialog(
|
||||
context: context,
|
||||
child: dialog
|
||||
)
|
||||
.then((dynamic/*=T*/ value) { // The value passed to Navigator.pop() or null.
|
||||
.then((dynamic value) { // The value passed to Navigator.pop() or null.
|
||||
if (value != null) {
|
||||
scaffoldKey.currentState.showSnackBar(new SnackBar(
|
||||
content: new Text('You selected: $value')
|
||||
@ -89,7 +89,7 @@ class DialogDemoState extends State<DialogDemo> {
|
||||
new RaisedButton(
|
||||
child: new Text('ALERT'),
|
||||
onPressed: () {
|
||||
showDemoDialog/*<DialogDemoAction>*/(
|
||||
showDemoDialog(
|
||||
context: context,
|
||||
dialog: new Dialog(
|
||||
content: new Text(
|
||||
@ -113,7 +113,7 @@ class DialogDemoState extends State<DialogDemo> {
|
||||
new RaisedButton(
|
||||
child: new Text('ALERT WITH TITLE'),
|
||||
onPressed: () {
|
||||
showDemoDialog/*<DialogDemoAction>*/(
|
||||
showDemoDialog(
|
||||
context: context,
|
||||
dialog: new Dialog(
|
||||
title: new Text("Use Google's location service?"),
|
||||
@ -138,7 +138,7 @@ class DialogDemoState extends State<DialogDemo> {
|
||||
new RaisedButton(
|
||||
child: new Text('SIMPLE'),
|
||||
onPressed: () {
|
||||
showDemoDialog/*<String>*/(
|
||||
showDemoDialog(
|
||||
context: context,
|
||||
dialog: new Dialog(
|
||||
title: new Text('Set backup account'),
|
||||
@ -174,7 +174,7 @@ class DialogDemoState extends State<DialogDemo> {
|
||||
context: context,
|
||||
initialTime: const TimeOfDay(hour: 15, minute: 30)
|
||||
)
|
||||
.then((TimeOfDay value) { // The value passed to Navigator.pop() or null.
|
||||
.then((value) { // The value passed to Navigator.pop() or null.
|
||||
if (value != null) {
|
||||
scaffoldKey.currentState.showSnackBar(new SnackBar(
|
||||
content: new Text('You selected: $value')
|
||||
@ -186,7 +186,7 @@ class DialogDemoState extends State<DialogDemo> {
|
||||
new RaisedButton(
|
||||
child: new Text('FULLSCREEN'),
|
||||
onPressed: () {
|
||||
Navigator.push(context, new MaterialPageRoute<Null>(
|
||||
Navigator.push(context, new MaterialPageRoute(
|
||||
builder: (BuildContext context) => new FullScreenDialogDemo()
|
||||
));
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ class _FitnessDemoContents extends StatefulComponent {
|
||||
|
||||
class _FitnessDemoContentsState extends State<_FitnessDemoContents> {
|
||||
|
||||
Future<Null> _loadAssets(AssetBundle bundle) async {
|
||||
Future _loadAssets(AssetBundle bundle) async {
|
||||
_images = new ImageMap(bundle);
|
||||
await _images.load(<String>[
|
||||
'packages/flutter_gallery_assets/jumpingjack.png',
|
||||
@ -267,9 +267,9 @@ class _WorkoutAnimationNode extends NodeWithSize {
|
||||
class _ProgressCircle extends NodeWithSize {
|
||||
_ProgressCircle(Size size, [this.value = 0.0]) : super(size);
|
||||
|
||||
static const double _kTwoPI = math.PI * 2.0;
|
||||
static const double _kEpsilon = .0000001;
|
||||
static const double _kSweep = _kTwoPI - _kEpsilon;
|
||||
static const _kTwoPI = math.PI * 2.0;
|
||||
static const _kEpsilon = .0000001;
|
||||
static const _kSweep = _kTwoPI - _kEpsilon;
|
||||
|
||||
double value;
|
||||
|
||||
|
@ -38,7 +38,7 @@ class GridDemoPhotoItem extends StatelessComponent {
|
||||
final GridDemoTileStyle tileStyle;
|
||||
|
||||
void showPhoto(BuildContext context) {
|
||||
Navigator.push(context, new MaterialPageRoute<Null>(
|
||||
Navigator.push(context, new MaterialPageRoute(
|
||||
builder: (BuildContext context) {
|
||||
return new Scaffold(
|
||||
toolBar: new ToolBar(
|
||||
@ -138,7 +138,7 @@ class GridListDemoState extends State<GridListDemo> {
|
||||
GridDemoTileStyle tileStyle = GridDemoTileStyle.twoLine;
|
||||
|
||||
void showTileStyleMenu(BuildContext context) {
|
||||
final List<PopupMenuItem<GridDemoTileStyle>> items = <PopupMenuItem<GridDemoTileStyle>>[
|
||||
final List<PopupMenuItem> items = <PopupMenuItem<GridDemoTileStyle>>[
|
||||
new PopupMenuItem<GridDemoTileStyle>(
|
||||
value: GridDemoTileStyle.imageOnly,
|
||||
child: new Text('Image only')
|
||||
|
@ -37,7 +37,7 @@ class LeaveBehindDemoState extends State<LeaveBehindDemo> {
|
||||
List<LeaveBehindItem> leaveBehindItems;
|
||||
|
||||
void initListItems() {
|
||||
leaveBehindItems = new List<LeaveBehindItem>.generate(16, (int index) {
|
||||
leaveBehindItems = new List.generate(16, (int index) {
|
||||
return new LeaveBehindItem(
|
||||
index: index,
|
||||
name: 'Item $index Sender',
|
||||
@ -130,7 +130,7 @@ class LeaveBehindDemoState extends State<LeaveBehindDemo> {
|
||||
right: <Widget>[
|
||||
new PopupMenuButton<LeaveBehindDemoAction>(
|
||||
onSelected: handleDemoAction,
|
||||
items: <PopupMenuEntry<LeaveBehindDemoAction>>[
|
||||
items: <PopupMenuEntry>[
|
||||
new PopupMenuItem<LeaveBehindDemoAction>(
|
||||
value: LeaveBehindDemoAction.reset,
|
||||
child: new Text('Reset the list')
|
||||
|
@ -19,7 +19,7 @@ class ListDemo extends StatefulComponent {
|
||||
class ListDemoState extends State<ListDemo> {
|
||||
final GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
|
||||
|
||||
PersistentBottomSheetController<Null> _bottomSheet;
|
||||
ScaffoldFeatureController _bottomSheet;
|
||||
ListDemoItemSize _itemSize = ListDemoItemSize.threeLine;
|
||||
bool _dense = false;
|
||||
bool _showAvatars = true;
|
||||
|
@ -176,7 +176,7 @@ class MenuDemoState extends State<MenuDemo> {
|
||||
right: new PopupMenuButton<String>(
|
||||
onSelected: showCheckedMenuSelections,
|
||||
items: <PopupMenuItem<String>>[
|
||||
new CheckedPopupMenuItem<String>(
|
||||
new CheckedPopupMenuItem(
|
||||
value: _checkedValue1,
|
||||
checked: isChecked(_checkedValue1),
|
||||
child: new Text(_checkedValue1)
|
||||
|
@ -21,7 +21,7 @@ class ModalBottomSheetDemo extends StatelessComponent {
|
||||
child: new RaisedButton(
|
||||
child: new Text('Show the modal bottom sheet', style: textStyle),
|
||||
onPressed: () {
|
||||
showModalBottomSheet/*<Null>*/(context: context, builder: (BuildContext context) {
|
||||
showModalBottomSheet(context: context, builder: (_) {
|
||||
return new Container(
|
||||
child: new Padding(
|
||||
padding: const EdgeDims.all(32.0),
|
||||
|
@ -7,7 +7,7 @@ import 'package:flutter/material.dart';
|
||||
class PageSelectorDemo extends StatelessComponent {
|
||||
|
||||
void _handleArrowButtonPress(BuildContext context, int delta) {
|
||||
final TabBarSelectionState<IconData> selection = TabBarSelection.of/*<IconData>*/(context);
|
||||
final TabBarSelectionState selection = TabBarSelection.of(context);
|
||||
if (!selection.valueIsChanging)
|
||||
selection.value = selection.values[(selection.index + delta).clamp(0, selection.values.length - 1)];
|
||||
}
|
||||
@ -53,7 +53,7 @@ class PageSelectorDemo extends StatelessComponent {
|
||||
)
|
||||
),
|
||||
new Flexible(
|
||||
child: new TabBarView<IconData>(
|
||||
child: new TabBarView(
|
||||
children: icons.map((IconData icon) {
|
||||
return new Container(
|
||||
key: new ObjectKey(icon),
|
||||
|
@ -82,7 +82,7 @@ class _TechniqueItem extends StatelessComponent {
|
||||
final WidgetBuilder builder;
|
||||
|
||||
void showDemo(BuildContext context) {
|
||||
Navigator.push(context, new MaterialPageRoute<Null>(builder: builder));
|
||||
Navigator.push(context, new MaterialPageRoute(builder: builder));
|
||||
}
|
||||
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -25,20 +25,20 @@ class TabsDemo extends StatelessComponent {
|
||||
|
||||
Widget build(BuildContext context) {
|
||||
final Color iconColor = Theme.of(context).accentColor;
|
||||
return new TabBarSelection<IconData>(
|
||||
return new TabBarSelection(
|
||||
values: icons,
|
||||
child: new Scaffold(
|
||||
toolBar: new ToolBar(
|
||||
center: new Text("Scrollable Tabs"),
|
||||
tabBar: new TabBar<IconData>(
|
||||
tabBar: new TabBar<String>(
|
||||
isScrollable: true,
|
||||
labels: new Map<IconData, TabLabel>.fromIterable(
|
||||
labels: new Map.fromIterable(
|
||||
icons,
|
||||
value: (IconData icon) => new TabLabel(text: labels[icon], icon: icon)
|
||||
)
|
||||
)
|
||||
),
|
||||
body: new TabBarView<IconData>(
|
||||
body: new TabBarView(
|
||||
children: icons.map((IconData icon) {
|
||||
return new Container(
|
||||
key: new ObjectKey(icon),
|
||||
|
@ -97,7 +97,7 @@ class _TabsFabDemoState extends State<TabsFabDemo> {
|
||||
toolBar: new ToolBar(
|
||||
center: new Text("FAB per Tab"),
|
||||
tabBar: new TabBar<_Page>(
|
||||
labels: new Map<_Page, TabLabel>.fromIterable(pages, value: (_Page page) => page.tabLabel)
|
||||
labels: new Map.fromIterable(pages, value: (_Page page) => page.tabLabel)
|
||||
)
|
||||
),
|
||||
floatingActionButton: !selectedPage.fabDefined ? null : new FloatingActionButton(
|
||||
@ -107,7 +107,7 @@ class _TabsFabDemoState extends State<TabsFabDemo> {
|
||||
child: selectedPage.fabIcon,
|
||||
onPressed: _showExplanatoryText
|
||||
),
|
||||
body: new TabBarView<_Page>(children: pages.map(buildTabView).toList())
|
||||
body: new TabBarView(children: pages.map(buildTabView).toList())
|
||||
)
|
||||
);
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ class TimePickerDemo extends StatefulComponent {
|
||||
class _TimePickerDemoState extends State<TimePickerDemo> {
|
||||
TimeOfDay _selectedTime = const TimeOfDay(hour: 7, minute: 28);
|
||||
|
||||
Future<Null> _handleSelectTime() async {
|
||||
Future _handleSelectTime() async {
|
||||
TimeOfDay picked = await showTimePicker(
|
||||
context: context,
|
||||
initialTime: _selectedTime
|
||||
|
@ -24,7 +24,7 @@ class WeatherDemo extends StatefulComponent {
|
||||
|
||||
class _WeatherDemoState extends State<WeatherDemo> {
|
||||
|
||||
Future<Null> _loadAssets(AssetBundle bundle) async {
|
||||
Future _loadAssets(AssetBundle bundle) async {
|
||||
_images = new ImageMap(bundle);
|
||||
await _images.load(<String>[
|
||||
'packages/flutter_gallery_assets/clouds-0.png',
|
||||
|
@ -16,7 +16,7 @@ class GallerySection extends StatelessComponent {
|
||||
final List<GalleryDemo> demos;
|
||||
|
||||
void showDemo(GalleryDemo demo, BuildContext context, ThemeData theme) {
|
||||
Navigator.push(context, new MaterialPageRoute<Null>(
|
||||
Navigator.push(context, new MaterialPageRoute(
|
||||
builder: (BuildContext context) {
|
||||
Widget child = (demo.builder == null) ? null : demo.builder();
|
||||
return new Theme(data: theme, child: child);
|
||||
@ -31,7 +31,7 @@ class GallerySection extends StatelessComponent {
|
||||
);
|
||||
final double appBarHeight = 200.0;
|
||||
final Key scrollableKey = new ValueKey<String>(title); // assume section titles differ
|
||||
Navigator.push(context, new MaterialPageRoute<Null>(
|
||||
Navigator.push(context, new MaterialPageRoute(
|
||||
builder: (BuildContext context) {
|
||||
return new Theme(
|
||||
data: theme,
|
||||
|
@ -75,7 +75,7 @@ class StocksAppState extends State<StocksApp> {
|
||||
}
|
||||
}
|
||||
|
||||
Route<Null> _getRoute(RouteSettings settings) {
|
||||
Route _getRoute(RouteSettings settings) {
|
||||
List<String> path = settings.name.split('/');
|
||||
if (path[0] != '')
|
||||
return null;
|
||||
@ -83,7 +83,7 @@ class StocksAppState extends State<StocksApp> {
|
||||
if (path.length != 3)
|
||||
return null;
|
||||
if (_stocks.containsKey(path[2])) {
|
||||
return new MaterialPageRoute<Null>(
|
||||
return new MaterialPageRoute(
|
||||
settings: settings,
|
||||
builder: (BuildContext context) => new StockSymbolPage(stock: _stocks[path[2]])
|
||||
);
|
||||
|
@ -53,7 +53,7 @@ class StockData {
|
||||
}
|
||||
|
||||
typedef void StockDataCallback(StockData data);
|
||||
const int _kChunkCount = 30;
|
||||
const _kChunkCount = 30;
|
||||
|
||||
String _urlToFetch(int chunk) {
|
||||
return 'https://domokit.github.io/examples/stocks/data/stock_data_$chunk.json';
|
||||
|
@ -321,7 +321,7 @@ class StockHomeState extends State<StockHome> {
|
||||
}
|
||||
|
||||
void _handleCreateCompany() {
|
||||
showModalBottomSheet/*<int, double>*/( // XXXXXX DO NOT CHECK IN XXXXXX THIS IS A CHECK OF THE ANALYZER
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
builder: (BuildContext context) => new _CreateCompanySheet()
|
||||
);
|
||||
@ -344,7 +344,7 @@ class StockHomeState extends State<StockHome> {
|
||||
toolBar: _isSearching ? buildSearchBar() : buildToolBar(),
|
||||
floatingActionButton: buildFloatingActionButton(),
|
||||
drawer: _buildDrawer(context),
|
||||
body: new TabBarView<StockHomeTab>(
|
||||
body: new TabBarView(
|
||||
children: <Widget>[
|
||||
_buildStockTab(context, StockHomeTab.market, config.symbols),
|
||||
_buildStockTab(context, StockHomeTab.portfolio, portfolioSymbols),
|
||||
|
@ -18,7 +18,7 @@ class StockList extends StatelessComponent {
|
||||
|
||||
Widget build(BuildContext context) {
|
||||
return new ScrollableList(
|
||||
key: const ValueKey<String>('stock-list'),
|
||||
key: const ValueKey('stock-list'),
|
||||
itemExtent: StockRow.kHeight,
|
||||
children: stocks.map((Stock stock) {
|
||||
return new StockRow(
|
||||
|
@ -17,12 +17,11 @@ void main() {
|
||||
tester.async.flushMicrotasks(); // see https://github.com/flutter/flutter/issues/1865
|
||||
tester.pump();
|
||||
|
||||
Element tab = tester.findText('MARKET');
|
||||
Element<Text> tab = tester.findText('MARKET');
|
||||
expect(tab, isNotNull);
|
||||
tester.setLocale("es", "US");
|
||||
tester.pump();
|
||||
Text text = tab.widget;
|
||||
expect(text.data, equals("MERCADO"));
|
||||
expect(tab.widget.data, equals("MERCADO"));
|
||||
|
||||
// TODO(abarth): We're leaking an animation. We should track down the leak
|
||||
// and plug it rather than waiting for the animation to end here.
|
||||
|
@ -27,13 +27,13 @@ void main() {
|
||||
// Scroll down 5 times
|
||||
for (int i = 0; i < 5; i++) {
|
||||
await driver.scroll(stockList, 0.0, -300.0, new Duration(milliseconds: 300));
|
||||
await new Future<Null>.delayed(new Duration(milliseconds: 500));
|
||||
await new Future.delayed(new Duration(milliseconds: 500));
|
||||
}
|
||||
|
||||
// Scroll up 5 times
|
||||
for (int i = 0; i < 5; i++) {
|
||||
await driver.scroll(stockList, 0.0, 300.0, new Duration(milliseconds: 300));
|
||||
await new Future<Null>.delayed(new Duration(milliseconds: 500));
|
||||
await new Future.delayed(new Duration(milliseconds: 500));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -18,121 +18,108 @@ class Expression extends _EquationMember {
|
||||
bool get isConstant => terms.length == 0;
|
||||
|
||||
@override
|
||||
double get value => terms.fold(constant, (double value, Term term) => value + term.value);
|
||||
double get value => terms.fold(constant, (value, term) => value + term.value);
|
||||
|
||||
@override
|
||||
Expression asExpression() => this;
|
||||
|
||||
Constraint _createConstraint(_EquationMember /* rhs */ value, Relation relation) {
|
||||
Constraint _createConstraint(
|
||||
_EquationMember /* rhs */ value, Relation relation) {
|
||||
if (value is ConstantMember) {
|
||||
return new Constraint(
|
||||
new Expression(new List<Term>.from(terms), constant - value.value),
|
||||
relation
|
||||
);
|
||||
new Expression(new List.from(terms), constant - value.value),
|
||||
relation);
|
||||
}
|
||||
|
||||
if (value is Param) {
|
||||
List<Term> newTerms = new List<Term>.from(terms)
|
||||
var newTerms = new List<Term>.from(terms)
|
||||
..add(new Term(value.variable, -1.0));
|
||||
return new Constraint(new Expression(newTerms, constant), relation);
|
||||
}
|
||||
|
||||
if (value is Term) {
|
||||
List<Term> newTerms = new List<Term>.from(terms)
|
||||
var newTerms = new List<Term>.from(terms)
|
||||
..add(new Term(value.variable, -value.coefficient));
|
||||
return new Constraint(new Expression(newTerms, constant), relation);
|
||||
}
|
||||
|
||||
if (value is Expression) {
|
||||
List<Term> newTerms = value.terms.fold(
|
||||
new List<Term>.from(terms),
|
||||
(List<Term> list, Term t) {
|
||||
return list..add(new Term(t.variable, -t.coefficient));
|
||||
}
|
||||
);
|
||||
var newTerms = value.terms.fold(new List<Term>.from(terms),
|
||||
(list, t) => list..add(new Term(t.variable, -t.coefficient)));
|
||||
return new Constraint(
|
||||
new Expression(newTerms, constant - value.constant),
|
||||
relation
|
||||
);
|
||||
new Expression(newTerms, constant - value.constant), relation);
|
||||
}
|
||||
|
||||
assert(false);
|
||||
return null;
|
||||
}
|
||||
|
||||
@override
|
||||
Constraint operator >=(_EquationMember value) {
|
||||
return _createConstraint(value, Relation.greaterThanOrEqualTo);
|
||||
}
|
||||
Constraint operator >=(_EquationMember value) =>
|
||||
_createConstraint(value, Relation.greaterThanOrEqualTo);
|
||||
|
||||
@override
|
||||
Constraint operator <=(_EquationMember value) {
|
||||
return _createConstraint(value, Relation.lessThanOrEqualTo);
|
||||
}
|
||||
Constraint operator <=(_EquationMember value) =>
|
||||
_createConstraint(value, Relation.lessThanOrEqualTo);
|
||||
|
||||
@override
|
||||
Constraint equals(_EquationMember value) {
|
||||
return _createConstraint(value, Relation.equalTo);
|
||||
}
|
||||
Constraint equals(_EquationMember value) =>
|
||||
_createConstraint(value, Relation.equalTo);
|
||||
|
||||
@override
|
||||
Expression operator +(_EquationMember m) {
|
||||
if (m is ConstantMember)
|
||||
return new Expression(new List<Term>.from(terms), constant + m.value);
|
||||
if (m is ConstantMember) {
|
||||
return new Expression(new List.from(terms), constant + m.value);
|
||||
}
|
||||
|
||||
if (m is Param) {
|
||||
return new Expression(
|
||||
new List<Term>.from(terms)..add(new Term(m.variable, 1.0)),
|
||||
constant
|
||||
);
|
||||
new List.from(terms)..add(new Term(m.variable, 1.0)), constant);
|
||||
}
|
||||
|
||||
if (m is Term)
|
||||
return new Expression(new List<Term>.from(terms)..add(m), constant);
|
||||
if (m is Term) {
|
||||
return new Expression(new List.from(terms)..add(m), constant);
|
||||
}
|
||||
|
||||
if (m is Expression) {
|
||||
return new Expression(
|
||||
new List<Term>.from(terms)..addAll(m.terms),
|
||||
constant + m.constant
|
||||
);
|
||||
new List.from(terms)..addAll(m.terms), constant + m.constant);
|
||||
}
|
||||
|
||||
assert(false);
|
||||
return null;
|
||||
}
|
||||
|
||||
@override
|
||||
Expression operator -(_EquationMember m) {
|
||||
if (m is ConstantMember)
|
||||
return new Expression(new List<Term>.from(terms), constant - m.value);
|
||||
if (m is ConstantMember) {
|
||||
return new Expression(new List.from(terms), constant - m.value);
|
||||
}
|
||||
|
||||
if (m is Param) {
|
||||
return new Expression(
|
||||
new List<Term>.from(terms)..add(new Term(m.variable, -1.0)),
|
||||
constant
|
||||
);
|
||||
new List.from(terms)..add(new Term(m.variable, -1.0)), constant);
|
||||
}
|
||||
|
||||
if (m is Term) {
|
||||
return new Expression(new List<Term>.from(terms)
|
||||
return new Expression(new List.from(terms)
|
||||
..add(new Term(m.variable, -m.coefficient)), constant);
|
||||
}
|
||||
|
||||
if (m is Expression) {
|
||||
List<Term> copiedTerms = new List<Term>.from(terms);
|
||||
for (Term t in m.terms)
|
||||
copiedTerms.add(new Term(t.variable, -t.coefficient));
|
||||
var copiedTerms = new List<Term>.from(terms);
|
||||
m.terms.forEach(
|
||||
(t) => copiedTerms.add(new Term(t.variable, -t.coefficient)));
|
||||
return new Expression(copiedTerms, constant - m.constant);
|
||||
}
|
||||
|
||||
assert(false);
|
||||
return null;
|
||||
}
|
||||
|
||||
_EquationMember _applyMultiplicand(double m) {
|
||||
List<Term> newTerms = terms.fold(
|
||||
new List<Term>(),
|
||||
(List<Term> list, Term term) {
|
||||
return list..add(new Term(term.variable, term.coefficient * m));
|
||||
}
|
||||
);
|
||||
var newTerms = terms.fold(new List<Term>(), (list, term) => list
|
||||
..add(new Term(term.variable, term.coefficient * m)));
|
||||
return new Expression(newTerms, constant * m);
|
||||
}
|
||||
|
||||
@ -140,14 +127,17 @@ class Expression extends _EquationMember {
|
||||
// At least on of the the two members must be constant for the resulting
|
||||
// expression to be linear
|
||||
|
||||
if (!this.isConstant && !m.isConstant)
|
||||
if (!this.isConstant && !m.isConstant) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (this.isConstant)
|
||||
return new _Pair<Expression, double>(m.asExpression(), this.value);
|
||||
if (this.isConstant) {
|
||||
return new _Pair(m.asExpression(), this.value);
|
||||
}
|
||||
|
||||
if (m.isConstant)
|
||||
return new _Pair<Expression, double>(this.asExpression(), m.value);
|
||||
if (m.isConstant) {
|
||||
return new _Pair(this.asExpression(), m.value);
|
||||
}
|
||||
|
||||
assert(false);
|
||||
return null;
|
||||
@ -158,9 +148,8 @@ class Expression extends _EquationMember {
|
||||
|
||||
if (args == null) {
|
||||
throw new ParserException(
|
||||
'Could not find constant multiplicand or multiplier',
|
||||
<_EquationMember>[this, m]
|
||||
);
|
||||
'Could not find constant multiplicand or multiplier', [this, m]);
|
||||
return null;
|
||||
}
|
||||
|
||||
return args.first._applyMultiplicand(args.second);
|
||||
@ -179,7 +168,7 @@ class Expression extends _EquationMember {
|
||||
String toString() {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
terms.forEach((Term t) => buffer.write('$t'));
|
||||
terms.forEach((t) => buffer.write('$t'));
|
||||
|
||||
if (constant != 0.0) {
|
||||
buffer.write(constant.sign > 0.0 ? '+' : '-');
|
||||
|
@ -5,19 +5,19 @@
|
||||
part of cassowary;
|
||||
|
||||
class Param extends _EquationMember {
|
||||
final Variable variable;
|
||||
dynamic context;
|
||||
|
||||
Param([double value = 0.0]) : variable = new Variable(value) {
|
||||
variable._owner = this;
|
||||
}
|
||||
Param.withContext(dynamic context, [double value = 0.0])
|
||||
: variable = new Variable(value),
|
||||
context = context {
|
||||
|
||||
Param.withContext(ctx, [double value = 0.0])
|
||||
: variable = new Variable(value),
|
||||
context = ctx {
|
||||
variable._owner = this;
|
||||
}
|
||||
|
||||
final Variable variable;
|
||||
|
||||
dynamic context;
|
||||
|
||||
bool get isConstant => false;
|
||||
|
||||
double get value => variable.value;
|
||||
@ -25,5 +25,5 @@ class Param extends _EquationMember {
|
||||
String get name => variable.name;
|
||||
void set name(String name) { variable.name = name; }
|
||||
|
||||
Expression asExpression() => new Expression(<Term>[new Term(variable, 1.0)], 0.0);
|
||||
Expression asExpression() => new Expression([new Term(variable, 1.0)], 0.0);
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ class _Row {
|
||||
|
||||
void insertRow(_Row other, [double coefficient = 1.0]) {
|
||||
constant += other.constant * coefficient;
|
||||
other.cells.forEach((_Symbol s, double v) => insertSymbol(s, v * coefficient));
|
||||
other.cells.forEach((s, v) => insertSymbol(s, v * coefficient));
|
||||
}
|
||||
|
||||
void removeSymbol(_Symbol symbol) {
|
||||
@ -36,7 +36,7 @@ class _Row {
|
||||
|
||||
void reverseSign() {
|
||||
constant = -constant;
|
||||
cells.forEach((_Symbol s, double v) => cells[s] = -v);
|
||||
cells.forEach((s, v) => cells[s] = -v);
|
||||
}
|
||||
|
||||
void solveForSymbol(_Symbol symbol) {
|
||||
@ -44,7 +44,7 @@ class _Row {
|
||||
double coefficient = -1.0 / cells[symbol];
|
||||
cells.remove(symbol);
|
||||
constant *= coefficient;
|
||||
cells.forEach((_Symbol s, double v) => cells[s] = v * coefficient);
|
||||
cells.forEach((s, v) => cells[s] = v * coefficient);
|
||||
}
|
||||
|
||||
void solveForSymbols(_Symbol lhs, _Symbol rhs) {
|
||||
@ -70,9 +70,8 @@ class _Row {
|
||||
|
||||
buffer.write(constant);
|
||||
|
||||
cells.forEach((_Symbol symbol, double value) {
|
||||
buffer.write(" + " + value.toString() + " * " + symbol.toString());
|
||||
});
|
||||
cells.forEach((symbol, value) =>
|
||||
buffer.write(" + " + value.toString() + " * " + symbol.toString()));
|
||||
|
||||
return buffer.toString();
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ class Solver {
|
||||
|
||||
_Symbol leaving = rowPair.first;
|
||||
row = rowPair.second;
|
||||
_Row removed = _rows.remove(rowPair.first);
|
||||
var removed = _rows.remove(rowPair.first);
|
||||
assert(removed != null);
|
||||
row.solveForSymbols(leaving, tag.marker);
|
||||
_substitute(tag.marker, row);
|
||||
@ -170,8 +170,8 @@ class Solver {
|
||||
return _dualOptimize();
|
||||
}
|
||||
|
||||
Set<dynamic> flushUpdates() {
|
||||
Set<dynamic> updates = new HashSet<dynamic>();
|
||||
Set flushUpdates() {
|
||||
Set updates = new HashSet<dynamic>();
|
||||
|
||||
for (Variable variable in _vars.keys) {
|
||||
_Symbol symbol = _vars[variable];
|
||||
@ -189,12 +189,10 @@ class Solver {
|
||||
return updates;
|
||||
}
|
||||
|
||||
Result _bulkEdit(
|
||||
Iterable<dynamic> items,
|
||||
_SolverBulkUpdate applier,
|
||||
_SolverBulkUpdate undoer
|
||||
) {
|
||||
List<dynamic> applied = <dynamic>[];
|
||||
Result _bulkEdit(Iterable items,
|
||||
_SolverBulkUpdate applier,
|
||||
_SolverBulkUpdate undoer) {
|
||||
List applied = new List();
|
||||
bool needsCleanup = false;
|
||||
|
||||
Result result = Result.success;
|
||||
@ -233,7 +231,7 @@ class Solver {
|
||||
Expression expr = new Expression.fromExpression(constraint.expression);
|
||||
_Row row = new _Row(expr.constant);
|
||||
|
||||
expr.terms.forEach((Term term) {
|
||||
expr.terms.forEach((term) {
|
||||
if (!_nearZero(term.coefficient)) {
|
||||
_Symbol symbol = _symbolForVariable(term.variable);
|
||||
|
||||
@ -399,9 +397,9 @@ class Solver {
|
||||
|
||||
_Pair<_Symbol, _Row> _leavingRowForEnteringSymbol(_Symbol entering) {
|
||||
double ratio = double.MAX_FINITE;
|
||||
_Pair<_Symbol, _Row> result = new _Pair<_Symbol, _Row>(null, null);
|
||||
_Pair<_Symbol, _Row> result = new _Pair(null, null);
|
||||
|
||||
_rows.forEach((_Symbol symbol, _Row row) {
|
||||
_rows.forEach((symbol, row) {
|
||||
if (symbol.type != _SymbolType.external) {
|
||||
double temp = row.coefficientForSymbol(entering);
|
||||
|
||||
@ -425,7 +423,7 @@ class Solver {
|
||||
}
|
||||
|
||||
void _substitute(_Symbol symbol, _Row row) {
|
||||
_rows.forEach((_Symbol first, _Row second) {
|
||||
_rows.forEach((first, second) {
|
||||
second.substitute(symbol, row);
|
||||
if (first.type != _SymbolType.external && second.constant < 0.0) {
|
||||
_infeasibleRows.add(first);
|
||||
@ -472,7 +470,7 @@ class Solver {
|
||||
|
||||
_Pair<_Symbol, _Row> first, second, third;
|
||||
|
||||
_rows.forEach((_Symbol symbol, _Row row) {
|
||||
_rows.forEach((symbol, row) {
|
||||
double c = row.coefficientForSymbol(marker);
|
||||
|
||||
if (c == 0.0) {
|
||||
@ -480,18 +478,18 @@ class Solver {
|
||||
}
|
||||
|
||||
if (symbol.type == _SymbolType.external) {
|
||||
third = new _Pair<_Symbol, _Row>(symbol, row);
|
||||
third = new _Pair(symbol, row);
|
||||
} else if (c < 0.0) {
|
||||
double r = -row.constant / c;
|
||||
if (r < r1) {
|
||||
r1 = r;
|
||||
first = new _Pair<_Symbol, _Row>(symbol, row);
|
||||
first = new _Pair(symbol, row);
|
||||
}
|
||||
} else {
|
||||
double r = row.constant / c;
|
||||
if (r < r2) {
|
||||
r2 = r;
|
||||
second = new _Pair<_Symbol, _Row>(symbol, row);
|
||||
second = new _Pair(symbol, row);
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -598,33 +596,28 @@ class Solver {
|
||||
|
||||
// Tableau
|
||||
buffer.writeln(separator + " Tableau");
|
||||
_rows.forEach((_Symbol symbol, _Row row) {
|
||||
buffer.writeln('$symbol | $row');
|
||||
_rows.forEach((symbol, row) {
|
||||
buffer.write(symbol.toString());
|
||||
buffer.write(" | ");
|
||||
buffer.writeln(row.toString());
|
||||
});
|
||||
|
||||
// Infeasible
|
||||
buffer.writeln(separator + " Infeasible");
|
||||
_infeasibleRows.forEach((_Symbol symbol) {
|
||||
buffer.writeln(symbol);
|
||||
});
|
||||
_infeasibleRows.forEach((symbol) => buffer.writeln(symbol.toString()));
|
||||
|
||||
// Variables
|
||||
buffer.writeln(separator + " Variables");
|
||||
_vars.forEach((Variable variable, _Symbol symbol) {
|
||||
buffer.writeln('$variable = $symbol');
|
||||
});
|
||||
_vars.forEach((variable, symbol) =>
|
||||
buffer.writeln("${variable.toString()} = ${symbol.toString()}"));
|
||||
|
||||
// Edit Variables
|
||||
buffer.writeln(separator + " Edit Variables");
|
||||
_edits.forEach((Variable variable, _EditInfo editinfo) {
|
||||
buffer.writeln(variable);
|
||||
});
|
||||
_edits.forEach((variable, editinfo) => buffer.writeln(variable));
|
||||
|
||||
// Constraints
|
||||
buffer.writeln(separator + " Constraints");
|
||||
_constraints.forEach((Constraint constraint, _Tag tag) {
|
||||
buffer.writeln(constraint);
|
||||
});
|
||||
_constraints.forEach((constraint, _) => buffer.writeln(constraint));
|
||||
|
||||
return buffer.toString();
|
||||
}
|
||||
|
@ -10,34 +10,34 @@ import 'package:cassowary/cassowary.dart';
|
||||
|
||||
void main() {
|
||||
test('variable', () {
|
||||
Param v = new Param(22.0);
|
||||
var v = new Param(22.0);
|
||||
expect(v.value, 22);
|
||||
});
|
||||
|
||||
test('variable1', () {
|
||||
Param v = new Param(22.0);
|
||||
var v = new Param(22.0);
|
||||
expect((v + cm(22.0)).value, 44.0);
|
||||
expect((v - cm(20.0)).value, 2.0);
|
||||
});
|
||||
|
||||
test('term', () {
|
||||
Term t = new Term(new Variable(22.0), 2.0);
|
||||
var t = new Term(new Variable(22.0), 2.0);
|
||||
expect(t.value, 44);
|
||||
});
|
||||
|
||||
test('expression', () {
|
||||
List<Term> terms = <Term>[
|
||||
var terms = [
|
||||
new Term(new Variable(22.0), 2.0),
|
||||
new Term(new Variable(1.0), 1.0),
|
||||
];
|
||||
Expression e = new Expression(terms, 40.0);
|
||||
var e = new Expression(terms, 40.0);
|
||||
expect(e.value, 85.0);
|
||||
});
|
||||
|
||||
test('expression1', () {
|
||||
Param v1 = new Param(10.0);
|
||||
Param v2 = new Param(10.0);
|
||||
Param v3 = new Param(22.0);
|
||||
var v1 = new Param(10.0);
|
||||
var v2 = new Param(10.0);
|
||||
var v3 = new Param(22.0);
|
||||
|
||||
expect(v1 is Param, true);
|
||||
expect(v1 + cm(20.0) is Expression, true);
|
||||
@ -51,7 +51,7 @@ void main() {
|
||||
});
|
||||
|
||||
test('expression2', () {
|
||||
Expression e = new Param(10.0) + cm(5.0);
|
||||
var e = new Param(10.0) + cm(5.0);
|
||||
expect(e.value, 15.0);
|
||||
expect(e is Expression, true);
|
||||
|
||||
@ -64,7 +64,7 @@ void main() {
|
||||
expect(e.value, 15.0);
|
||||
|
||||
// Param
|
||||
Param v = new Param(2.0);
|
||||
var v = new Param(2.0);
|
||||
expect((e + v) is Expression, true);
|
||||
expect((e + v).value, 17.0);
|
||||
expect((e - v) is Expression, true);
|
||||
@ -73,7 +73,7 @@ void main() {
|
||||
expect(e.value, 15.0);
|
||||
|
||||
// Term
|
||||
Term t = new Term(v.variable, 2.0);
|
||||
var t = new Term(v.variable, 2.0);
|
||||
expect((e + t) is Expression, true);
|
||||
expect((e + t).value, 19.0);
|
||||
expect((e - t) is Expression, true);
|
||||
@ -82,7 +82,7 @@ void main() {
|
||||
expect(e.value, 15.0);
|
||||
|
||||
// Expression
|
||||
Expression e2 = new Param(7.0) + new Param(3.0);
|
||||
var e2 = new Param(7.0) + new Param(3.0);
|
||||
expect((e + e2) is Expression, true);
|
||||
expect((e + e2).value, 25.0);
|
||||
expect((e - e2) is Expression, true);
|
||||
@ -92,31 +92,31 @@ void main() {
|
||||
});
|
||||
|
||||
test('term2', () {
|
||||
Term t = new Term(new Variable(12.0), 1.0);
|
||||
var t = new Term(new Variable(12.0), 1.0);
|
||||
|
||||
// Constant
|
||||
ConstantMember c = cm(2.0);
|
||||
var c = cm(2.0);
|
||||
expect((t + c) is Expression, true);
|
||||
expect((t + c).value, 14.0);
|
||||
expect((t - c) is Expression, true);
|
||||
expect((t - c).value, 10.0);
|
||||
|
||||
// Variable
|
||||
Param v = new Param(2.0);
|
||||
var v = new Param(2.0);
|
||||
expect((t + v) is Expression, true);
|
||||
expect((t + v).value, 14.0);
|
||||
expect((t - v) is Expression, true);
|
||||
expect((t - v).value, 10.0);
|
||||
|
||||
// Term
|
||||
Term t2 = new Term(new Variable(1.0), 2.0);
|
||||
var t2 = new Term(new Variable(1.0), 2.0);
|
||||
expect((t + t2) is Expression, true);
|
||||
expect((t + t2).value, 14.0);
|
||||
expect((t - t2) is Expression, true);
|
||||
expect((t - t2).value, 10.0);
|
||||
|
||||
// Expression
|
||||
Expression exp = new Param(1.0) + cm(1.0);
|
||||
var exp = new Param(1.0) + cm(1.0);
|
||||
expect((t + exp) is Expression, true);
|
||||
expect((t + exp).value, 14.0);
|
||||
expect((t - exp) is Expression, true);
|
||||
@ -124,31 +124,31 @@ void main() {
|
||||
});
|
||||
|
||||
test('variable3', () {
|
||||
Param v = new Param(3.0);
|
||||
var v = new Param(3.0);
|
||||
|
||||
// Constant
|
||||
ConstantMember c = cm(2.0);
|
||||
var c = cm(2.0);
|
||||
expect((v + c) is Expression, true);
|
||||
expect((v + c).value, 5.0);
|
||||
expect((v - c) is Expression, true);
|
||||
expect((v - c).value, 1.0);
|
||||
|
||||
// Variable
|
||||
Param v2 = new Param(2.0);
|
||||
var v2 = new Param(2.0);
|
||||
expect((v + v2) is Expression, true);
|
||||
expect((v + v2).value, 5.0);
|
||||
expect((v - v2) is Expression, true);
|
||||
expect((v - v2).value, 1.0);
|
||||
|
||||
// Term
|
||||
Term t2 = new Term(new Variable(1.0), 2.0);
|
||||
var t2 = new Term(new Variable(1.0), 2.0);
|
||||
expect((v + t2) is Expression, true);
|
||||
expect((v + t2).value, 5.0);
|
||||
expect((v - t2) is Expression, true);
|
||||
expect((v - t2).value, 1.0);
|
||||
|
||||
// Expression
|
||||
Expression exp = new Param(1.0) + cm(1.0);
|
||||
var exp = new Param(1.0) + cm(1.0);
|
||||
expect(exp.terms.length, 1);
|
||||
|
||||
expect((v + exp) is Expression, true);
|
||||
@ -158,31 +158,31 @@ void main() {
|
||||
});
|
||||
|
||||
test('constantmember', () {
|
||||
ConstantMember c = cm(3.0);
|
||||
var c = cm(3.0);
|
||||
|
||||
// Constant
|
||||
ConstantMember c2 = cm(2.0);
|
||||
var c2 = cm(2.0);
|
||||
expect((c + c2) is Expression, true);
|
||||
expect((c + c2).value, 5.0);
|
||||
expect((c - c2) is Expression, true);
|
||||
expect((c - c2).value, 1.0);
|
||||
|
||||
// Variable
|
||||
Param v2 = new Param(2.0);
|
||||
var v2 = new Param(2.0);
|
||||
expect((c + v2) is Expression, true);
|
||||
expect((c + v2).value, 5.0);
|
||||
expect((c - v2) is Expression, true);
|
||||
expect((c - v2).value, 1.0);
|
||||
|
||||
// Term
|
||||
Term t2 = new Term(new Variable(1.0), 2.0);
|
||||
var t2 = new Term(new Variable(1.0), 2.0);
|
||||
expect((c + t2) is Expression, true);
|
||||
expect((c + t2).value, 5.0);
|
||||
expect((c - t2) is Expression, true);
|
||||
expect((c - t2).value, 1.0);
|
||||
|
||||
// Expression
|
||||
Expression exp = new Param(1.0) + cm(1.0);
|
||||
var exp = new Param(1.0) + cm(1.0);
|
||||
|
||||
expect((c + exp) is Expression, true);
|
||||
expect((c + exp).value, 5.0);
|
||||
@ -191,74 +191,74 @@ void main() {
|
||||
});
|
||||
|
||||
test('constraint2', () {
|
||||
Param left = new Param(10.0);
|
||||
Param right = new Param(100.0);
|
||||
var left = new Param(10.0);
|
||||
var right = new Param(100.0);
|
||||
|
||||
Constraint c = right - left >= cm(25.0);
|
||||
var c = right - left >= cm(25.0);
|
||||
expect(c is Constraint, true);
|
||||
});
|
||||
|
||||
test('simple_multiplication', () {
|
||||
// Constant
|
||||
ConstantMember c = cm(20.0);
|
||||
var c = cm(20.0);
|
||||
expect((c * cm(2.0)).value, 40.0);
|
||||
|
||||
// Variable
|
||||
Param v = new Param(20.0);
|
||||
var v = new Param(20.0);
|
||||
expect((v * cm(2.0)).value, 40.0);
|
||||
|
||||
// Term
|
||||
Term t = new Term(v.variable, 1.0);
|
||||
var t = new Term(v.variable, 1.0);
|
||||
expect((t * cm(2.0)).value, 40.0);
|
||||
|
||||
// Expression
|
||||
Expression e = new Expression([t], 0.0);
|
||||
var e = new Expression([t], 0.0);
|
||||
expect((e * cm(2.0)).value, 40.0);
|
||||
});
|
||||
|
||||
test('simple_division', () {
|
||||
// Constant
|
||||
ConstantMember c = cm(20.0);
|
||||
var c = cm(20.0);
|
||||
expect((c / cm(2.0)).value, 10.0);
|
||||
|
||||
// Variable
|
||||
Param v = new Param(20.0);
|
||||
var v = new Param(20.0);
|
||||
expect((v / cm(2.0)).value, 10.0);
|
||||
|
||||
// Term
|
||||
Term t = new Term(v.variable, 1.0);
|
||||
var t = new Term(v.variable, 1.0);
|
||||
expect((t / cm(2.0)).value, 10.0);
|
||||
|
||||
// Expression
|
||||
Expression e = new Expression([t], 0.0);
|
||||
var e = new Expression([t], 0.0);
|
||||
expect((e / cm(2.0)).value, 10.0);
|
||||
});
|
||||
|
||||
test('full_constraints_setup', () {
|
||||
Param left = new Param(2.0);
|
||||
Param right = new Param(10.0);
|
||||
var left = new Param(2.0);
|
||||
var right = new Param(10.0);
|
||||
|
||||
Constraint c1 = right - left >= cm(20.0);
|
||||
var c1 = right - left >= cm(20.0);
|
||||
expect(c1 is Constraint, true);
|
||||
expect(c1.expression.constant, -20.0);
|
||||
expect(c1.relation, Relation.greaterThanOrEqualTo);
|
||||
|
||||
Constraint c2 = (right - left).equals(cm(30.0));
|
||||
var c2 = (right - left).equals(cm(30.0));
|
||||
expect(c2 is Constraint, true);
|
||||
expect(c2.expression.constant, -30.0);
|
||||
expect(c2.relation, Relation.equalTo);
|
||||
|
||||
Constraint c3 = right - left <= cm(30.0);
|
||||
var c3 = right - left <= cm(30.0);
|
||||
expect(c3 is Constraint, true);
|
||||
expect(c3.expression.constant, -30.0);
|
||||
expect(c3.relation, Relation.lessThanOrEqualTo);
|
||||
});
|
||||
|
||||
test('constraint_strength_update', () {
|
||||
Param left = new Param(2.0);
|
||||
Param right = new Param(10.0);
|
||||
var left = new Param(2.0);
|
||||
var right = new Param(10.0);
|
||||
|
||||
Constraint c = (right - left >= cm(200.0)) | 750.0;
|
||||
var c = (right - left >= cm(200.0)) | 750.0;
|
||||
expect(c is Constraint, true);
|
||||
expect(c.expression.terms.length, 2);
|
||||
expect(c.expression.constant, -200.0);
|
||||
@ -266,12 +266,12 @@ void main() {
|
||||
});
|
||||
|
||||
test('solver', () {
|
||||
Solver s = new Solver();
|
||||
var s = new Solver();
|
||||
|
||||
Param left = new Param(2.0);
|
||||
Param right = new Param(100.0);
|
||||
var left = new Param(2.0);
|
||||
var right = new Param(100.0);
|
||||
|
||||
Constraint c1 = right - left >= cm(200.0);
|
||||
var c1 = right - left >= cm(200.0);
|
||||
|
||||
expect((right >= left) is Constraint, true);
|
||||
|
||||
@ -279,28 +279,28 @@ void main() {
|
||||
});
|
||||
|
||||
test('constraint_complex', () {
|
||||
Expression e = new Param(200.0) - new Param(100.0);
|
||||
var e = new Param(200.0) - new Param(100.0);
|
||||
|
||||
// Constant
|
||||
Constraint c1 = e >= cm(50.0);
|
||||
var c1 = e >= cm(50.0);
|
||||
expect(c1 is Constraint, true);
|
||||
expect(c1.expression.terms.length, 2);
|
||||
expect(c1.expression.constant, -50.0);
|
||||
|
||||
// Variable
|
||||
Constraint c2 = e >= new Param(2.0);
|
||||
var c2 = e >= new Param(2.0);
|
||||
expect(c2 is Constraint, true);
|
||||
expect(c2.expression.terms.length, 3);
|
||||
expect(c2.expression.constant, 0.0);
|
||||
|
||||
// Term
|
||||
Constraint c3 = e >= new Term(new Variable(2.0), 1.0);
|
||||
var c3 = e >= new Term(new Variable(2.0), 1.0);
|
||||
expect(c3 is Constraint, true);
|
||||
expect(c3.expression.terms.length, 3);
|
||||
expect(c3.expression.constant, 0.0);
|
||||
|
||||
// Expression
|
||||
Constraint c4 = e >= new Expression([new Term(new Variable(2.0), 1.0)], 20.0);
|
||||
var c4 = e >= new Expression([new Term(new Variable(2.0), 1.0)], 20.0);
|
||||
expect(c4 is Constraint, true);
|
||||
expect(c4.expression.terms.length, 3);
|
||||
expect(c4.expression.constant, -20.0);
|
||||
@ -308,40 +308,40 @@ void main() {
|
||||
|
||||
test('constraint_complex_non_exprs', () {
|
||||
// Constant
|
||||
Constraint c1 = cm(100.0) >= cm(50.0);
|
||||
var c1 = cm(100.0) >= cm(50.0);
|
||||
expect(c1 is Constraint, true);
|
||||
expect(c1.expression.terms.length, 0);
|
||||
expect(c1.expression.constant, 50.0);
|
||||
|
||||
// Variable
|
||||
Constraint c2 = new Param(100.0) >= new Param(2.0);
|
||||
var c2 = new Param(100.0) >= new Param(2.0);
|
||||
expect(c2 is Constraint, true);
|
||||
expect(c2.expression.terms.length, 2);
|
||||
expect(c2.expression.constant, 0.0);
|
||||
|
||||
// Term
|
||||
Term t = new Term(new Variable(100.0), 1.0);
|
||||
Constraint c3 = t >= new Term(new Variable(2.0), 1.0);
|
||||
var t = new Term(new Variable(100.0), 1.0);
|
||||
var c3 = t >= new Term(new Variable(2.0), 1.0);
|
||||
expect(c3 is Constraint, true);
|
||||
expect(c3.expression.terms.length, 2);
|
||||
expect(c3.expression.constant, 0.0);
|
||||
|
||||
// Expression
|
||||
Expression e = new Expression([t], 0.0);
|
||||
Constraint c4 = e >= new Expression([new Term(new Variable(2.0), 1.0)], 20.0);
|
||||
var e = new Expression([t], 0.0);
|
||||
var c4 = e >= new Expression([new Term(new Variable(2.0), 1.0)], 20.0);
|
||||
expect(c4 is Constraint, true);
|
||||
expect(c4.expression.terms.length, 2);
|
||||
expect(c4.expression.constant, -20.0);
|
||||
});
|
||||
|
||||
test('constraint_update_in_solver', () {
|
||||
Solver s = new Solver();
|
||||
var s = new Solver();
|
||||
|
||||
Param left = new Param(2.0);
|
||||
Param right = new Param(100.0);
|
||||
var left = new Param(2.0);
|
||||
var right = new Param(100.0);
|
||||
|
||||
Constraint c1 = right - left >= cm(200.0);
|
||||
Constraint c2 = right >= right;
|
||||
var c1 = right - left >= cm(200.0);
|
||||
var c2 = right >= right;
|
||||
|
||||
expect(s.addConstraint(c1), Result.success);
|
||||
expect(s.addConstraint(c1), Result.duplicateConstraint);
|
||||
@ -351,10 +351,10 @@ void main() {
|
||||
});
|
||||
|
||||
test('test_multiplication_division_override', () {
|
||||
ConstantMember c = cm(10.0);
|
||||
Param v = new Param(c.value);
|
||||
Term t = new Term(v.variable, 1.0);
|
||||
Expression e = new Expression([t], 0.0);
|
||||
var c = cm(10.0);
|
||||
var v = new Param(c.value);
|
||||
var t = new Term(v.variable, 1.0);
|
||||
var e = new Expression([t], 0.0);
|
||||
|
||||
// Constant
|
||||
expect((c * cm(10.0)).value, 100);
|
||||
@ -382,10 +382,10 @@ void main() {
|
||||
});
|
||||
|
||||
test('test_multiplication_division_exceptions', () {
|
||||
ConstantMember c = cm(10.0);
|
||||
Param v = new Param(c.value);
|
||||
Term t = new Term(v.variable, 1.0);
|
||||
Expression e = new Expression([t], 0.0);
|
||||
var c = cm(10.0);
|
||||
var v = new Param(c.value);
|
||||
var t = new Term(v.variable, 1.0);
|
||||
var e = new Expression([t], 0.0);
|
||||
|
||||
expect((c * c).value, 100);
|
||||
expect(() => v * v, throwsA(new isInstanceOf<ParserException>()));
|
||||
@ -401,9 +401,9 @@ void main() {
|
||||
test('edit_updates', () {
|
||||
Solver s = new Solver();
|
||||
|
||||
Param left = new Param(0.0);
|
||||
Param right = new Param(100.0);
|
||||
Param mid = new Param(0.0);
|
||||
var left = new Param(0.0);
|
||||
var right = new Param(100.0);
|
||||
var mid = new Param(0.0);
|
||||
|
||||
Constraint c = left + right >= cm(2.0) * mid;
|
||||
expect(s.addConstraint(c), Result.success);
|
||||
@ -416,15 +416,15 @@ void main() {
|
||||
});
|
||||
|
||||
test('bug1', () {
|
||||
Param left = new Param(0.0);
|
||||
Param right = new Param(100.0);
|
||||
Param mid = new Param(0.0);
|
||||
var left = new Param(0.0);
|
||||
var right = new Param(100.0);
|
||||
var mid = new Param(0.0);
|
||||
|
||||
expect(((left + right) >= (cm(2.0) * mid)) is Constraint, true);
|
||||
});
|
||||
|
||||
test('single_item', () {
|
||||
Param left = new Param(-20.0);
|
||||
var left = new Param(-20.0);
|
||||
Solver s = new Solver();
|
||||
s.addConstraint(left >= cm(0.0));
|
||||
s.flushUpdates();
|
||||
@ -432,9 +432,9 @@ void main() {
|
||||
});
|
||||
|
||||
test('midpoints', () {
|
||||
Param left = new Param(0.0)..name = "left";
|
||||
Param right = new Param(0.0)..name = "right";
|
||||
Param mid = new Param(0.0)..name = "mid";
|
||||
var left = new Param(0.0)..name = "left";
|
||||
var right = new Param(0.0)..name = "right";
|
||||
var mid = new Param(0.0)..name = "mid";
|
||||
|
||||
Solver s = new Solver();
|
||||
|
||||
@ -451,13 +451,13 @@ void main() {
|
||||
});
|
||||
|
||||
test('addition_of_multiple', () {
|
||||
Param left = new Param(0.0);
|
||||
Param right = new Param(0.0);
|
||||
Param mid = new Param(0.0);
|
||||
var left = new Param(0.0);
|
||||
var right = new Param(0.0);
|
||||
var mid = new Param(0.0);
|
||||
|
||||
Solver s = new Solver();
|
||||
|
||||
Constraint c = (left >= cm(0.0));
|
||||
var c = (left >= cm(0.0));
|
||||
|
||||
expect(s.addConstraints([
|
||||
(left + right).equals(cm(2.0) * mid),
|
||||
@ -470,9 +470,9 @@ void main() {
|
||||
});
|
||||
|
||||
test('edit_constraints', () {
|
||||
Param left = new Param(0.0)..name = "left";
|
||||
Param right = new Param(0.0)..name = "right";
|
||||
Param mid = new Param(0.0)..name = "mid";
|
||||
var left = new Param(0.0)..name = "left";
|
||||
var right = new Param(0.0)..name = "right";
|
||||
var mid = new Param(0.0)..name = "mid";
|
||||
|
||||
Solver s = new Solver();
|
||||
|
||||
@ -492,11 +492,11 @@ void main() {
|
||||
});
|
||||
|
||||
test('test_description', () {
|
||||
Param left = new Param(0.0);
|
||||
Param right = new Param(100.0);
|
||||
Constraint c1 = right >= left;
|
||||
Constraint c2 = right <= left;
|
||||
Constraint c3 = right.equals(left);
|
||||
var left = new Param(0.0);
|
||||
var right = new Param(100.0);
|
||||
var c1 = right >= left;
|
||||
var c2 = right <= left;
|
||||
var c3 = right.equals(left);
|
||||
|
||||
Solver s = new Solver();
|
||||
expect(s.addConstraint(c1), Result.success);
|
||||
@ -547,7 +547,7 @@ void main() {
|
||||
|
||||
expect(s.suggestValueForVariable(mid.variable, 50.0), Result.success);
|
||||
|
||||
Set<dynamic> updates = s.flushUpdates();
|
||||
var updates = s.flushUpdates();
|
||||
|
||||
expect(updates.length, 2);
|
||||
|
||||
@ -571,7 +571,7 @@ void main() {
|
||||
|
||||
expect(s.suggestValueForVariable(mid.variable, 50.0), Result.success);
|
||||
|
||||
Set<dynamic> updates = s.flushUpdates();
|
||||
var updates = s.flushUpdates();
|
||||
|
||||
expect(updates.length, 1);
|
||||
|
||||
@ -581,7 +581,7 @@ void main() {
|
||||
});
|
||||
|
||||
test('param_context_non_final', () {
|
||||
Param p = new Param.withContext("a");
|
||||
var p = new Param.withContext("a");
|
||||
p.context = "b";
|
||||
expect(p.context, "b");
|
||||
});
|
||||
@ -596,9 +596,9 @@ void main() {
|
||||
test('bulk_add_edit_variables', () {
|
||||
Solver s = new Solver();
|
||||
|
||||
Param left = new Param(0.0);
|
||||
Param right = new Param(100.0);
|
||||
Param mid = new Param(0.0);
|
||||
var left = new Param(0.0);
|
||||
var right = new Param(100.0);
|
||||
var mid = new Param(0.0);
|
||||
|
||||
expect(s.addEditVariables(
|
||||
[left.variable, right.variable, mid.variable], 999.0), Result.success);
|
||||
@ -607,15 +607,15 @@ void main() {
|
||||
test('bulk_remove_constraints_and_variables', () {
|
||||
Solver s = new Solver();
|
||||
|
||||
Param left = new Param(0.0);
|
||||
Param right = new Param(100.0);
|
||||
Param mid = new Param(0.0);
|
||||
var left = new Param(0.0);
|
||||
var right = new Param(100.0);
|
||||
var mid = new Param(0.0);
|
||||
|
||||
expect(s.addEditVariables(
|
||||
[left.variable, right.variable, mid.variable], 999.0), Result.success);
|
||||
|
||||
Constraint c1 = left <= mid;
|
||||
Constraint c2 = mid <= right;
|
||||
var c1 = left <= mid;
|
||||
var c2 = mid <= right;
|
||||
|
||||
expect(s.addConstraints([c1, c2]), Result.success);
|
||||
|
||||
|
@ -125,7 +125,7 @@ class AnimationController extends Animation<double>
|
||||
}
|
||||
|
||||
/// Starts running this animation forwards (towards the end).
|
||||
Future<Null> forward({ double from }) {
|
||||
Future forward({ double from }) {
|
||||
if (from != null)
|
||||
value = from;
|
||||
_direction = _AnimationDirection.forward;
|
||||
@ -133,7 +133,7 @@ class AnimationController extends Animation<double>
|
||||
}
|
||||
|
||||
/// Starts running this animation in reverse (towards the beginning).
|
||||
Future<Null> reverse({ double from }) {
|
||||
Future reverse({ double from }) {
|
||||
if (from != null)
|
||||
value = from;
|
||||
_direction = _AnimationDirection.reverse;
|
||||
@ -141,7 +141,7 @@ class AnimationController extends Animation<double>
|
||||
}
|
||||
|
||||
/// Drives the animation from its current value to target.
|
||||
Future<Null> animateTo(double target, { Duration duration, Curve curve: Curves.linear }) {
|
||||
Future animateTo(double target, { Duration duration, Curve curve: Curves.linear }) {
|
||||
Duration simulationDuration = duration;
|
||||
if (simulationDuration == null) {
|
||||
double range = upperBound - lowerBound;
|
||||
@ -152,7 +152,7 @@ class AnimationController extends Animation<double>
|
||||
if (simulationDuration == Duration.ZERO) {
|
||||
assert(value == target);
|
||||
_checkStatusChanged();
|
||||
return new Future<Null>.value();
|
||||
return new Future.value();
|
||||
}
|
||||
assert(simulationDuration > Duration.ZERO);
|
||||
assert(!isAnimating);
|
||||
@ -163,7 +163,7 @@ class AnimationController extends Animation<double>
|
||||
/// restarts the animation when it completes.
|
||||
///
|
||||
/// Defaults to repeating between the lower and upper bounds.
|
||||
Future<Null> repeat({ double min, double max, Duration period }) {
|
||||
Future repeat({ double min, double max, Duration period }) {
|
||||
min ??= lowerBound;
|
||||
max ??= upperBound;
|
||||
period ??= duration;
|
||||
@ -173,24 +173,24 @@ class AnimationController extends Animation<double>
|
||||
/// Flings the timeline with an optional force (defaults to a critically
|
||||
/// damped spring) and initial velocity. If velocity is positive, the
|
||||
/// animation will complete, otherwise it will dismiss.
|
||||
Future<Null> fling({ double velocity: 1.0, Force force }) {
|
||||
Future fling({ double velocity: 1.0, Force force }) {
|
||||
force ??= kDefaultSpringForce;
|
||||
_direction = velocity < 0.0 ? _AnimationDirection.reverse : _AnimationDirection.forward;
|
||||
return animateWith(force.release(value, velocity));
|
||||
}
|
||||
|
||||
/// Drives the animation according to the given simulation.
|
||||
Future<Null> animateWith(Simulation simulation) {
|
||||
Future animateWith(Simulation simulation) {
|
||||
stop();
|
||||
return _startSimulation(simulation);
|
||||
}
|
||||
|
||||
Future<Null> _startSimulation(Simulation simulation) {
|
||||
Future _startSimulation(Simulation simulation) {
|
||||
assert(simulation != null);
|
||||
assert(!isAnimating);
|
||||
_simulation = simulation;
|
||||
_value = simulation.x(0.0).clamp(lowerBound, upperBound);
|
||||
Future<Null> result = _ticker.start();
|
||||
Future result = _ticker.start();
|
||||
_checkStatusChanged();
|
||||
return result;
|
||||
}
|
||||
|
@ -145,6 +145,6 @@ Future<Uint8List> readBytes(dynamic url, { Map<String, String> headers }) {
|
||||
return _withClient/*<Uint8List>*/((MojoClient client) => client.readBytes(url, headers: headers));
|
||||
}
|
||||
|
||||
Future<dynamic/*=T*/> _withClient/*<T>*/(Future<dynamic/*=T*/> fn(MojoClient client)) {
|
||||
Future/*<T>*/ _withClient/*<T>*/(Future/*<T>*/ fn(MojoClient client)) {
|
||||
return fn(new MojoClient());
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ class MaterialApp extends WidgetsApp {
|
||||
onGenerateRoute: (RouteSettings settings) {
|
||||
RouteBuilder builder = routes[settings.name];
|
||||
if (builder != null) {
|
||||
return new MaterialPageRoute<Null>(
|
||||
return new MaterialPageRoute(
|
||||
builder: (BuildContext context) {
|
||||
return builder(new RouteArguments(context: context));
|
||||
},
|
||||
|
@ -44,7 +44,7 @@ class BottomSheet extends StatefulComponent {
|
||||
|
||||
class _BottomSheetState extends State<BottomSheet> {
|
||||
|
||||
final GlobalKey _childKey = new GlobalKey(debugLabel: 'BottomSheet child');
|
||||
final _childKey = new GlobalKey(debugLabel: 'BottomSheet child');
|
||||
|
||||
double get _childHeight {
|
||||
final RenderBox renderBox = _childKey.currentContext.findRenderObject();
|
||||
@ -117,15 +117,15 @@ class _ModalBottomSheetLayout extends OneChildLayoutDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
class _ModalBottomSheet<T> extends StatefulComponent {
|
||||
class _ModalBottomSheet extends StatefulComponent {
|
||||
_ModalBottomSheet({ Key key, this.route }) : super(key: key);
|
||||
|
||||
final _ModalBottomSheetRoute<T> route;
|
||||
final _ModalBottomSheetRoute route;
|
||||
|
||||
_ModalBottomSheetState<T> createState() => new _ModalBottomSheetState<T>();
|
||||
_ModalBottomSheetState createState() => new _ModalBottomSheetState();
|
||||
}
|
||||
|
||||
class _ModalBottomSheetState<T> extends State<_ModalBottomSheet<T>> {
|
||||
class _ModalBottomSheetState extends State<_ModalBottomSheet> {
|
||||
Widget build(BuildContext context) {
|
||||
return new GestureDetector(
|
||||
onTap: () => Navigator.pop(context),
|
||||
@ -165,15 +165,15 @@ class _ModalBottomSheetRoute<T> extends PopupRoute<T> {
|
||||
}
|
||||
|
||||
Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> forwardAnimation) {
|
||||
return new _ModalBottomSheet<T>(route: this);
|
||||
return new _ModalBottomSheet(route: this);
|
||||
}
|
||||
}
|
||||
|
||||
Future<dynamic/*=T*/> showModalBottomSheet/*<T>*/({ BuildContext context, WidgetBuilder builder }) {
|
||||
Future showModalBottomSheet({ BuildContext context, WidgetBuilder builder }) {
|
||||
assert(context != null);
|
||||
assert(builder != null);
|
||||
final Completer<dynamic/*=T*/> completer = new Completer<dynamic/*=T*/>();
|
||||
Navigator.push(context, new _ModalBottomSheetRoute<dynamic/*=T*/>(
|
||||
final Completer completer = new Completer();
|
||||
Navigator.push(context, new _ModalBottomSheetRoute(
|
||||
completer: completer,
|
||||
builder: builder
|
||||
));
|
||||
|
@ -9,20 +9,20 @@ import 'dart:ui' show Color;
|
||||
class Colors {
|
||||
Colors._();
|
||||
|
||||
static const Color transparent = const Color(0x00000000);
|
||||
static const transparent = const Color(0x00000000);
|
||||
|
||||
static const Color black = const Color(0xFF000000);
|
||||
static const Color black87 = const Color(0xDD000000);
|
||||
static const Color black54 = const Color(0x8A000000);
|
||||
static const Color black45 = const Color(0x73000000); // mask color
|
||||
static const Color black26 = const Color(0x42000000); // disabled radio buttons and text of disabled flat buttons in light theme
|
||||
static const Color black12 = const Color(0x1F000000); // background of disabled raised buttons in light theme
|
||||
static const black = const Color(0xFF000000);
|
||||
static const black87 = const Color(0xDD000000);
|
||||
static const black54 = const Color(0x8A000000);
|
||||
static const black45 = const Color(0x73000000); // mask color
|
||||
static const black26 = const Color(0x42000000); // disabled radio buttons and text of disabled flat buttons in light theme
|
||||
static const black12 = const Color(0x1F000000); // background of disabled raised buttons in light theme
|
||||
|
||||
static const Color white = const Color(0xFFFFFFFF);
|
||||
static const Color white70 = const Color(0xB3FFFFFF);
|
||||
static const Color white30 = const Color(0x4DFFFFFF); // disabled radio buttons and text of disabled flat buttons in dark theme
|
||||
static const Color white12 = const Color(0x1FFFFFFF); // background of disabled raised buttons in dark theme
|
||||
static const Color white10 = const Color(0x1AFFFFFF);
|
||||
static const white = const Color(0xFFFFFFFF);
|
||||
static const white70 = const Color(0xB3FFFFFF);
|
||||
static const white30 = const Color(0x4DFFFFFF); // disabled radio buttons and text of disabled flat buttons in dark theme
|
||||
static const white12 = const Color(0x1FFFFFFF); // background of disabled raised buttons in dark theme
|
||||
static const white10 = const Color(0x1AFFFFFF);
|
||||
|
||||
static const Map<int, Color> red = const <int, Color>{
|
||||
50: const Color(0xFFFFEBEE),
|
||||
|
@ -142,8 +142,8 @@ class _DialogRoute<T> extends PopupRoute<T> {
|
||||
}
|
||||
}
|
||||
|
||||
Future<dynamic/*=T*/> showDialog/*<T>*/({ BuildContext context, Widget child }) {
|
||||
Completer<dynamic/*=T*/> completer = new Completer<int>(); // XXXXXXX MORE ANALYZER CHECKS
|
||||
Navigator.push(context, new _DialogRoute<dynamic/*=T*/>(completer: completer, child: child));
|
||||
Future showDialog({ BuildContext context, Widget child }) {
|
||||
Completer completer = new Completer();
|
||||
Navigator.push(context, new _DialogRoute(completer: completer, child: child));
|
||||
return completer.future;
|
||||
}
|
||||
|
@ -86,7 +86,7 @@ class DrawerControllerState extends State<DrawerController> {
|
||||
|
||||
void _ensureHistoryEntry() {
|
||||
if (_historyEntry == null) {
|
||||
ModalRoute<dynamic> route = ModalRoute.of(context);
|
||||
ModalRoute route = ModalRoute.of(context);
|
||||
if (route != null) {
|
||||
_historyEntry = new LocalHistoryEntry(onRemove: _handleHistoryEntryRemoved);
|
||||
route.addLocalHistoryEntry(_historyEntry);
|
||||
|
@ -154,7 +154,7 @@ class _DropDownRouteResult<T> {
|
||||
const _DropDownRouteResult(this.result);
|
||||
final T result;
|
||||
bool operator ==(dynamic other) {
|
||||
if (other is! _DropDownRouteResult<T>)
|
||||
if (other is! _DropDownRouteResult)
|
||||
return false;
|
||||
final _DropDownRouteResult<T> typedOther = other;
|
||||
return result == typedOther.result;
|
||||
@ -193,7 +193,7 @@ class _DropDownRoute<T> extends PopupRoute<_DropDownRouteResult<T>> {
|
||||
}
|
||||
|
||||
Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> forwardAnimation) {
|
||||
return new _DropDownMenu<T>(route: this);
|
||||
return new _DropDownMenu(route: this);
|
||||
}
|
||||
}
|
||||
|
||||
@ -269,7 +269,7 @@ class _DropDownButtonState<T> extends State<DropDownButton<T>> {
|
||||
void _handleTap() {
|
||||
final RenderBox renderBox = indexedStackKey.currentContext.findRenderObject();
|
||||
final Rect rect = renderBox.localToGlobal(Point.origin) & renderBox.size;
|
||||
final Completer<_DropDownRouteResult<T>> completer = new Completer<_DropDownRouteResult<T>>();
|
||||
final Completer completer = new Completer<_DropDownRouteResult<T>>();
|
||||
Navigator.push(context, new _DropDownRoute<T>(
|
||||
completer: completer,
|
||||
items: config.items,
|
||||
|
@ -44,7 +44,7 @@ class InkResponse extends StatefulComponent {
|
||||
final bool containedInWell;
|
||||
final BoxShape highlightShape;
|
||||
|
||||
_InkResponseState<InkResponse> createState() => new _InkResponseState<InkResponse>();
|
||||
_InkResponseState createState() => new _InkResponseState<InkResponse>();
|
||||
}
|
||||
|
||||
class _InkResponseState<T extends InkResponse> extends State<T> {
|
||||
|
@ -477,7 +477,7 @@ class _InkHighlight extends InkFeature implements InkHighlight {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _paintHighlight(Canvas canvas, Rect rect, Paint paint) {
|
||||
void _paintHighlight(Canvas canvas, Rect rect, paint) {
|
||||
if (shape == BoxShape.rectangle)
|
||||
canvas.drawRect(rect, paint);
|
||||
else
|
||||
|
@ -54,7 +54,7 @@ class MaterialPageRoute<T> extends PageRoute<T> {
|
||||
|
||||
Duration get transitionDuration => kMaterialPageRouteTransitionDuration;
|
||||
Color get barrierColor => null;
|
||||
bool canTransitionFrom(TransitionRoute<dynamic> nextRoute) => false;
|
||||
bool canTransitionFrom(TransitionRoute nextRoute) => false;
|
||||
|
||||
Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> forwardAnimation) {
|
||||
Widget result = builder(context);
|
||||
|
@ -65,7 +65,7 @@ class PopupMenuItem<T> extends PopupMenuEntry<T> {
|
||||
_PopupMenuItemState<PopupMenuItem<T>> createState() => new _PopupMenuItemState<PopupMenuItem<T>>();
|
||||
}
|
||||
|
||||
class _PopupMenuItemState<T extends PopupMenuItem<dynamic>> extends State<T> {
|
||||
class _PopupMenuItemState<T extends PopupMenuItem> extends State<T> {
|
||||
// Override this to put something else in the menu entry.
|
||||
Widget buildChild() => config.child;
|
||||
|
||||
@ -318,7 +318,7 @@ class _PopupMenuRoute<T> extends PopupRoute<T> {
|
||||
constraints: new BoxConstraints(maxWidth: screenSize.width, maxHeight: screenSize.height),
|
||||
child: new CustomOneChildLayout(
|
||||
delegate: new _PopupMenuRouteLayout(position, selectedItemOffset),
|
||||
child: new _PopupMenu<T>(route: this)
|
||||
child: new _PopupMenu(route: this)
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -329,17 +329,17 @@ class _PopupMenuRoute<T> extends PopupRoute<T> {
|
||||
/// and the value of [position] implies where the left, center point of the
|
||||
/// highlighted item should appear. If [initialValue] is not specified then position
|
||||
/// implies the menu's origin.
|
||||
Future<dynamic/*=T*/> showMenu/*<T>*/({
|
||||
Future/*<T>*/ showMenu/*<T>*/({
|
||||
BuildContext context,
|
||||
ModalPosition position,
|
||||
List<PopupMenuEntry<dynamic/*=T*/>> items,
|
||||
List<PopupMenuEntry/*<T>*/> items,
|
||||
dynamic/*=T*/ initialValue,
|
||||
int elevation: 8
|
||||
}) {
|
||||
assert(context != null);
|
||||
assert(items != null && items.length > 0);
|
||||
Completer<dynamic/*=T*/> completer = new Completer<dynamic/*=T*/>();
|
||||
Navigator.push(context, new _PopupMenuRoute<dynamic/*=T*/>(
|
||||
Completer completer = new Completer/*<T>*/();
|
||||
Navigator.push(context, new _PopupMenuRoute/*<T>*/(
|
||||
completer: completer,
|
||||
position: position,
|
||||
items: items,
|
||||
|
@ -128,11 +128,11 @@ class _LinearProgressIndicatorState extends State<LinearProgressIndicator> {
|
||||
}
|
||||
|
||||
class _CircularProgressIndicatorPainter extends CustomPainter {
|
||||
static const double _kTwoPI = math.PI * 2.0;
|
||||
static const double _kEpsilon = .001;
|
||||
static const _kTwoPI = math.PI * 2.0;
|
||||
static const _kEpsilon = .001;
|
||||
// Canavs.drawArc(r, 0, 2*PI) doesn't draw anything, so just get close.
|
||||
static const double _kSweep = _kTwoPI - _kEpsilon;
|
||||
static const double _kStartAngle = -math.PI / 2.0;
|
||||
static const _kSweep = _kTwoPI - _kEpsilon;
|
||||
static const _kStartAngle = -math.PI / 2.0;
|
||||
|
||||
const _CircularProgressIndicatorPainter({
|
||||
this.valueColor,
|
||||
|
@ -229,24 +229,24 @@ class ScaffoldState extends State<Scaffold> {
|
||||
|
||||
// SNACKBAR API
|
||||
|
||||
Queue<ScaffoldFeatureController<SnackBar, Null>> _snackBars = new Queue<ScaffoldFeatureController<SnackBar, Null>>();
|
||||
Queue<ScaffoldFeatureController<SnackBar>> _snackBars = new Queue<ScaffoldFeatureController<SnackBar>>();
|
||||
AnimationController _snackBarController;
|
||||
Timer _snackBarTimer;
|
||||
|
||||
ScaffoldFeatureController<SnackBar, Null> showSnackBar(SnackBar snackbar) {
|
||||
ScaffoldFeatureController showSnackBar(SnackBar snackbar) {
|
||||
_snackBarController ??= SnackBar.createAnimationController()
|
||||
..addStatusListener(_handleSnackBarStatusChange);
|
||||
if (_snackBars.isEmpty) {
|
||||
assert(_snackBarController.isDismissed);
|
||||
_snackBarController.forward();
|
||||
}
|
||||
ScaffoldFeatureController<SnackBar, Null> controller;
|
||||
controller = new ScaffoldFeatureController<SnackBar, Null>._(
|
||||
ScaffoldFeatureController<SnackBar> controller;
|
||||
controller = new ScaffoldFeatureController<SnackBar>._(
|
||||
// We provide a fallback key so that if back-to-back snackbars happen to
|
||||
// match in structure, material ink splashes and highlights don't survive
|
||||
// from one to the next.
|
||||
snackbar.withAnimation(_snackBarController, fallbackKey: new UniqueKey()),
|
||||
new Completer<Null>(),
|
||||
new Completer(),
|
||||
() {
|
||||
assert(_snackBars.first == controller);
|
||||
_hideSnackBar();
|
||||
@ -294,14 +294,14 @@ class ScaffoldState extends State<Scaffold> {
|
||||
// PERSISTENT BOTTOM SHEET API
|
||||
|
||||
List<Widget> _dismissedBottomSheets;
|
||||
PersistentBottomSheetController<Null> _currentBottomSheet;
|
||||
ScaffoldFeatureController _currentBottomSheet;
|
||||
|
||||
PersistentBottomSheetController<dynamic/*=T*/> showBottomSheet/*<T>*/(WidgetBuilder builder) {
|
||||
ScaffoldFeatureController showBottomSheet(WidgetBuilder builder) {
|
||||
if (_currentBottomSheet != null) {
|
||||
_currentBottomSheet.close();
|
||||
assert(_currentBottomSheet == null);
|
||||
}
|
||||
Completer<dynamic/*=T*/> completer = new Completer<dynamic/*=T*/>();
|
||||
Completer completer = new Completer();
|
||||
GlobalKey<_PersistentBottomSheetState> bottomSheetKey = new GlobalKey<_PersistentBottomSheetState>();
|
||||
AnimationController controller = BottomSheet.createAnimationController()
|
||||
..forward();
|
||||
@ -334,7 +334,7 @@ class ScaffoldState extends State<Scaffold> {
|
||||
);
|
||||
ModalRoute.of(context).addLocalHistoryEntry(entry);
|
||||
setState(() {
|
||||
_currentBottomSheet = new PersistentBottomSheetController<dynamic/*=T*/>._(
|
||||
_currentBottomSheet = new ScaffoldFeatureController._(
|
||||
bottomSheet,
|
||||
completer,
|
||||
() => entry.remove(),
|
||||
@ -447,7 +447,7 @@ class ScaffoldState extends State<Scaffold> {
|
||||
} else if (_scrollOffset > appBarHeight) {
|
||||
// scrolled down, show the "floating" toolbar
|
||||
_floatingAppBarHeight = (_floatingAppBarHeight + _scrollOffsetDelta).clamp(0.0, toolBarHeight);
|
||||
final double toolBarOpacity = _toolBarOpacity(_floatingAppBarHeight / toolBarHeight);
|
||||
final toolBarOpacity = _toolBarOpacity(_floatingAppBarHeight / toolBarHeight);
|
||||
_appBarController.value = (appBarHeight - _floatingAppBarHeight) / appBarHeight;
|
||||
appBar = new SizedBox(
|
||||
height: _floatingAppBarHeight,
|
||||
@ -471,7 +471,7 @@ class ScaffoldState extends State<Scaffold> {
|
||||
EdgeDims padding = MediaQuery.of(context)?.padding ?? EdgeDims.zero;
|
||||
|
||||
if (_snackBars.length > 0) {
|
||||
ModalRoute<dynamic> route = ModalRoute.of(context);
|
||||
ModalRoute route = ModalRoute.of(context);
|
||||
if (route == null || route.isCurrent) {
|
||||
if (_snackBarController.isCompleted && _snackBarTimer == null)
|
||||
_snackBarTimer = new Timer(_snackBars.first._widget.duration, _hideSnackBar);
|
||||
@ -563,11 +563,11 @@ class ScaffoldState extends State<Scaffold> {
|
||||
}
|
||||
}
|
||||
|
||||
class ScaffoldFeatureController<T extends Widget, U> {
|
||||
class ScaffoldFeatureController<T extends Widget> {
|
||||
const ScaffoldFeatureController._(this._widget, this._completer, this.close, this.setState);
|
||||
final T _widget;
|
||||
final Completer<U> _completer;
|
||||
Future<U> get closed => _completer.future;
|
||||
final Completer _completer;
|
||||
Future get closed => _completer.future;
|
||||
final VoidCallback close; // call this to close the bottom sheet or snack bar
|
||||
final StateSetter setState;
|
||||
}
|
||||
@ -641,15 +641,3 @@ class _PersistentBottomSheetState extends State<_PersistentBottomSheet> {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// A [ScaffoldFeatureController] for persistent bottom sheets.
|
||||
///
|
||||
/// This is the type of objects returned by [Scaffold.showBottomSheet].
|
||||
class PersistentBottomSheetController<T> extends ScaffoldFeatureController<_PersistentBottomSheet, T> {
|
||||
const PersistentBottomSheetController._(
|
||||
_PersistentBottomSheet widget,
|
||||
Completer<T> completer,
|
||||
VoidCallback close,
|
||||
StateSetter setState
|
||||
) : super._(widget, completer, close, setState);
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ class ScrollbarPainter extends ScrollableListPainter {
|
||||
|
||||
AnimationController _fade;
|
||||
|
||||
Future<Null> scrollStarted() {
|
||||
Future scrollStarted() {
|
||||
if (_fade == null) {
|
||||
_fade = new AnimationController(duration: _kScrollbarThumbFadeDuration);
|
||||
CurvedAnimation curve = new CurvedAnimation(parent: _fade, curve: Curves.ease);
|
||||
@ -72,7 +72,7 @@ class ScrollbarPainter extends ScrollableListPainter {
|
||||
return _fade.forward();
|
||||
}
|
||||
|
||||
Future<Null> scrollEnded() {
|
||||
Future scrollEnded() {
|
||||
return _fade.reverse();
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,7 @@ class Switch extends StatelessComponent {
|
||||
Widget build(BuildContext context) {
|
||||
assert(debugCheckHasMaterial(context));
|
||||
ThemeData themeData = Theme.of(context);
|
||||
final bool isDark = themeData.brightness == ThemeBrightness.dark;
|
||||
final isDark = themeData.brightness == ThemeBrightness.dark;
|
||||
|
||||
Color activeThumbColor = activeColor ?? themeData.accentColor;
|
||||
Color activeTrackColor = activeThumbColor.withAlpha(0x80);
|
||||
|
@ -416,8 +416,8 @@ class TabBarSelection<T> extends StatefulComponent {
|
||||
|
||||
TabBarSelectionState<T> createState() => new TabBarSelectionState<T>();
|
||||
|
||||
static TabBarSelectionState<dynamic/*=T*/> of/*<T>*/(BuildContext context) {
|
||||
return context.ancestorStateOfType(const TypeMatcher<TabBarSelectionState<dynamic/*=T*/>>());
|
||||
static TabBarSelectionState of(BuildContext context) {
|
||||
return context.ancestorStateOfType(const TypeMatcher<TabBarSelectionState>());
|
||||
}
|
||||
}
|
||||
|
||||
@ -449,7 +449,7 @@ class TabBarSelectionState<T> extends State<TabBarSelection<T>> {
|
||||
_initValueToIndex();
|
||||
}
|
||||
|
||||
void didUpdateConfig(TabBarSelection<T> oldConfig) {
|
||||
void didUpdateConfig(TabBarSelection oldConfig) {
|
||||
super.didUpdateConfig(oldConfig);
|
||||
if (values != oldConfig.values)
|
||||
_initValueToIndex();
|
||||
@ -564,12 +564,12 @@ class TabBar<T> extends Scrollable {
|
||||
final Map<T, TabLabel> labels;
|
||||
final bool isScrollable;
|
||||
|
||||
_TabBarState<T> createState() => new _TabBarState<T>();
|
||||
_TabBarState createState() => new _TabBarState();
|
||||
}
|
||||
|
||||
class _TabBarState<T> extends ScrollableState<TabBar<T>> implements TabBarSelectionAnimationListener {
|
||||
|
||||
TabBarSelectionState<T> _selection;
|
||||
TabBarSelectionState _selection;
|
||||
bool _valueIsChanging = false;
|
||||
|
||||
void _initSelection(TabBarSelectionState<T> selection) {
|
||||
@ -584,7 +584,7 @@ class _TabBarState<T> extends ScrollableState<TabBar<T>> implements TabBarSelect
|
||||
_initSelection(TabBarSelection.of(context));
|
||||
}
|
||||
|
||||
void didUpdateConfig(TabBar<T> oldConfig) {
|
||||
void didUpdateConfig(TabBar oldConfig) {
|
||||
super.didUpdateConfig(oldConfig);
|
||||
if (!config.isScrollable)
|
||||
scrollTo(0.0);
|
||||
@ -666,7 +666,7 @@ class _TabBarState<T> extends ScrollableState<TabBar<T>> implements TabBarSelect
|
||||
return new Rect.fromLTRB(r.left, r.bottom, r.right, r.bottom + _kTabIndicatorHeight);
|
||||
}
|
||||
|
||||
ScrollBehavior<double, double> createScrollBehavior() => new _TabsScrollBehavior();
|
||||
ScrollBehavior createScrollBehavior() => new _TabsScrollBehavior();
|
||||
_TabsScrollBehavior get scrollBehavior => super.scrollBehavior;
|
||||
|
||||
double _centeredTabScrollOffset(int tabIndex) {
|
||||
@ -795,7 +795,7 @@ class _TabBarState<T> extends ScrollableState<TabBar<T>> implements TabBarSelect
|
||||
}
|
||||
}
|
||||
|
||||
class TabBarView<T> extends PageableList {
|
||||
class TabBarView extends PageableList {
|
||||
TabBarView({
|
||||
Key key,
|
||||
List<Widget> children
|
||||
@ -808,12 +808,12 @@ class TabBarView<T> extends PageableList {
|
||||
assert(children.length > 1);
|
||||
}
|
||||
|
||||
_TabBarViewState<T> createState() => new _TabBarViewState<T>();
|
||||
_TabBarViewState createState() => new _TabBarViewState();
|
||||
}
|
||||
|
||||
class _TabBarViewState<T> extends PageableListState<TabBarView<T>> implements TabBarSelectionAnimationListener {
|
||||
class _TabBarViewState extends PageableListState<TabBarView> implements TabBarSelectionAnimationListener {
|
||||
|
||||
TabBarSelectionState<T> _selection;
|
||||
TabBarSelectionState _selection;
|
||||
List<Widget> _items;
|
||||
|
||||
int get _tabCount => config.children.length;
|
||||
@ -825,7 +825,7 @@ class _TabBarViewState<T> extends PageableListState<TabBarView<T>> implements Ta
|
||||
return _boundedBehavior;
|
||||
}
|
||||
|
||||
void _initSelection(TabBarSelectionState<T> selection) {
|
||||
void _initSelection(TabBarSelectionState selection) {
|
||||
_selection = selection;
|
||||
if (_selection != null) {
|
||||
_selection.registerAnimationListener(this);
|
||||
@ -838,7 +838,7 @@ class _TabBarViewState<T> extends PageableListState<TabBarView<T>> implements Ta
|
||||
_initSelection(TabBarSelection.of(context));
|
||||
}
|
||||
|
||||
void didUpdateConfig(TabBarView<T> oldConfig) {
|
||||
void didUpdateConfig(TabBarView oldConfig) {
|
||||
super.didUpdateConfig(oldConfig);
|
||||
if (_selection != null && config.children != oldConfig.children)
|
||||
_updateItemsForSelectedIndex(_selection.index);
|
||||
@ -931,15 +931,15 @@ class _TabBarViewState<T> extends PageableListState<TabBarView<T>> implements Ta
|
||||
controller.value = scrollOffset / 2.0;
|
||||
}
|
||||
|
||||
Future<Null> fling(double scrollVelocity) {
|
||||
Future fling(double scrollVelocity) {
|
||||
if (_selection == null || _selection.valueIsChanging)
|
||||
return new Future<Null>.value();
|
||||
return new Future.value();
|
||||
|
||||
if (scrollVelocity.abs() > _kMinFlingVelocity) {
|
||||
final int selectionDelta = scrollVelocity.sign.truncate();
|
||||
final int targetIndex = (_selection.index + selectionDelta).clamp(0, _tabCount - 1);
|
||||
_selection.value = _selection.values[targetIndex];
|
||||
return new Future<Null>.value();
|
||||
return new Future.value();
|
||||
}
|
||||
|
||||
final int selectionIndex = _selection.index;
|
||||
@ -947,16 +947,16 @@ class _TabBarViewState<T> extends PageableListState<TabBarView<T>> implements Ta
|
||||
if (selectionIndex > 0 && settleIndex != 1) {
|
||||
final int targetIndex = (selectionIndex + (settleIndex == 2 ? 1 : -1)).clamp(0, _tabCount - 1);
|
||||
_selection.value = _selection.values[targetIndex];
|
||||
return new Future<Null>.value();
|
||||
return new Future.value();
|
||||
} else if (selectionIndex == 0 && settleIndex == 1) {
|
||||
_selection.value = _selection.values[1];
|
||||
return new Future<Null>.value();
|
||||
return new Future.value();
|
||||
}
|
||||
return settleScrollOffset();
|
||||
}
|
||||
|
||||
Widget buildContent(BuildContext context) {
|
||||
TabBarSelectionState<T> newSelection = TabBarSelection.of(context);
|
||||
TabBarSelectionState newSelection = TabBarSelection.of(context);
|
||||
if (_selection != newSelection)
|
||||
_initSelection(newSelection);
|
||||
return new PageViewport(
|
||||
@ -972,7 +972,7 @@ class _TabBarViewState<T> extends PageableListState<TabBarView<T>> implements Ta
|
||||
class TabPageSelector<T> extends StatelessComponent {
|
||||
const TabPageSelector({ Key key }) : super(key: key);
|
||||
|
||||
Widget _buildTabIndicator(TabBarSelectionState<T> selection, T tab, Animation<double> animation, ColorTween selectedColor, ColorTween previousColor) {
|
||||
Widget _buildTabIndicator(TabBarSelectionState<T> selection, T tab, Animation animation, ColorTween selectedColor, ColorTween previousColor) {
|
||||
Color background;
|
||||
if (selection.valueIsChanging) {
|
||||
// The selection's animation is animating from previousValue to value.
|
||||
@ -998,7 +998,7 @@ class TabPageSelector<T> extends StatelessComponent {
|
||||
}
|
||||
|
||||
Widget build(BuildContext context) {
|
||||
final TabBarSelectionState<T> selection = TabBarSelection.of(context);
|
||||
final TabBarSelectionState selection = TabBarSelection.of(context);
|
||||
final Color color = Theme.of(context).accentColor;
|
||||
final ColorTween selectedColor = new ColorTween(begin: Colors.transparent, end: color);
|
||||
final ColorTween previousColor = new ColorTween(begin: color, end: Colors.transparent);
|
||||
|
@ -8,7 +8,7 @@ import 'theme_data.dart';
|
||||
|
||||
export 'theme_data.dart' show ThemeData, ThemeBrightness;
|
||||
|
||||
const Duration kThemeAnimationDuration = const Duration(milliseconds: 200);
|
||||
const kThemeAnimationDuration = const Duration(milliseconds: 200);
|
||||
|
||||
/// Applies a theme to descendant widgets.
|
||||
class Theme extends InheritedWidget {
|
||||
@ -73,7 +73,7 @@ class AnimatedTheme extends AnimatedWidgetBase {
|
||||
class _AnimatedThemeState extends AnimatedWidgetBaseState<AnimatedTheme> {
|
||||
ThemeDataTween _data;
|
||||
|
||||
void forEachTween(TweenVisitor<dynamic> visitor) {
|
||||
void forEachTween(TweenVisitor visitor) {
|
||||
// TODO(ianh): Use constructor tear-offs when it becomes possible
|
||||
_data = visitor(_data, config.data, (dynamic value) => new ThemeDataTween(begin: value));
|
||||
assert(_data != null);
|
||||
|
@ -27,7 +27,7 @@ class BorderSide {
|
||||
final double width;
|
||||
|
||||
/// A black border side of zero width.
|
||||
static const BorderSide none = const BorderSide(width: 0.0);
|
||||
static const none = const BorderSide(width: 0.0);
|
||||
|
||||
BorderSide copyWith({
|
||||
Color color,
|
||||
|
@ -197,7 +197,7 @@ class TextPainter {
|
||||
|
||||
/// The minimum width at which to layout the text.
|
||||
double get minWidth => _paragraph.minWidth;
|
||||
void set minWidth(double value) {
|
||||
void set minWidth(value) {
|
||||
if (_paragraph.minWidth == value)
|
||||
return;
|
||||
_paragraph.minWidth = value;
|
||||
@ -206,7 +206,7 @@ class TextPainter {
|
||||
|
||||
/// The maximum width at which to layout the text.
|
||||
double get maxWidth => _paragraph.maxWidth;
|
||||
void set maxWidth(double value) {
|
||||
void set maxWidth(value) {
|
||||
if (_paragraph.maxWidth == value)
|
||||
return;
|
||||
_paragraph.maxWidth = value;
|
||||
@ -215,7 +215,7 @@ class TextPainter {
|
||||
|
||||
/// The minimum height at which to layout the text.
|
||||
double get minHeight => _paragraph.minHeight;
|
||||
void set minHeight(double value) {
|
||||
void set minHeight(value) {
|
||||
if (_paragraph.minHeight == value)
|
||||
return;
|
||||
_paragraph.minHeight = value;
|
||||
@ -224,7 +224,7 @@ class TextPainter {
|
||||
|
||||
/// The maximum height at which to layout the text.
|
||||
double get maxHeight => _paragraph.maxHeight;
|
||||
void set maxHeight(double value) {
|
||||
void set maxHeight(value) {
|
||||
if (_paragraph.maxHeight == value)
|
||||
return;
|
||||
_paragraph.maxHeight = value;
|
||||
|
@ -7,9 +7,9 @@ typedef void ValueChanged<T>(T value);
|
||||
/// A BitField over an enum (or other class whose values implement "index").
|
||||
/// Only the first 63 values of the enum can be used as indices.
|
||||
class BitField<T extends dynamic> {
|
||||
static const int _kSMIBits = 63; // see https://www.dartlang.org/articles/numeric-computation/#smis-and-mints
|
||||
static const int _kAllZeros = 0;
|
||||
static const int _kAllOnes = 0x7FFFFFFFFFFFFFFF; // 2^(_kSMIBits+1)-1
|
||||
static const _kSMIBits = 63; // see https://www.dartlang.org/articles/numeric-computation/#smis-and-mints
|
||||
static const _kAllZeros = 0;
|
||||
static const _kAllOnes = 0x7FFFFFFFFFFFFFFF; // 2^(_kSMIBits+1)-1
|
||||
BitField(this._length) : _bits = _kAllZeros {
|
||||
assert(_length <= _kSMIBits);
|
||||
}
|
||||
|
@ -11,9 +11,9 @@ import 'box.dart';
|
||||
import 'object.dart';
|
||||
import 'viewport.dart';
|
||||
|
||||
const double _kCaretGap = 1.0; // pixels
|
||||
const double _kCaretHeightOffset = 2.0; // pixels
|
||||
const double _kCaretWidth = 1.0; // pixels
|
||||
const _kCaretGap = 1.0; // pixels
|
||||
const _kCaretHeightOffset = 2.0; // pixels
|
||||
const _kCaretWidth = 1.0; // pixels
|
||||
|
||||
final String _kZeroWidthSpace = new String.fromCharCode(0x200B);
|
||||
|
||||
|
@ -561,7 +561,7 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
|
||||
|
||||
Paint markerPaint = new Paint()..color = const Color(0xE0FF0000);
|
||||
Paint highlightPaint = new Paint()..color = const Color(0x7FFF0000);
|
||||
const double kMarkerSize = 0.1;
|
||||
const kMarkerSize = 0.1;
|
||||
Rect markerRect, overflowRect;
|
||||
switch(direction) {
|
||||
case FlexDirection.horizontal:
|
||||
|
@ -756,7 +756,7 @@ abstract class CustomClipper<T> {
|
||||
Rect getApproximateClipRect(Size size) => Point.origin & size;
|
||||
/// Returns true if the new instance will result in a different clip
|
||||
/// than the oldClipper instance.
|
||||
bool shouldRepaint(CustomClipper<T> oldClipper);
|
||||
bool shouldRepaint(CustomClipper oldClipper);
|
||||
}
|
||||
|
||||
abstract class _RenderCustomClip<T> extends RenderProxyBox {
|
||||
@ -1100,13 +1100,13 @@ class RenderTransform extends RenderProxyBox {
|
||||
}
|
||||
|
||||
/// Concatenates a translation by (x, y, z) into the transform.
|
||||
void translate(double x, [double y = 0.0, double z = 0.0]) {
|
||||
void translate(x, [double y = 0.0, double z = 0.0]) {
|
||||
_transform.translate(x, y, z);
|
||||
markNeedsPaint();
|
||||
}
|
||||
|
||||
/// Concatenates a scale into the transform.
|
||||
void scale(double x, [double y, double z]) {
|
||||
void scale(x, [double y, double z]) {
|
||||
_transform.scale(x, y, z);
|
||||
markNeedsPaint();
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ class RenderPadding extends RenderShiftedBox {
|
||||
context.canvas.drawPath(path, paint);
|
||||
paint = new Paint()
|
||||
..color = debugPaintPaddingInnerEdgeColor;
|
||||
const double kOutline = 2.0;
|
||||
const kOutline = 2.0;
|
||||
path = new Path()
|
||||
..moveTo(offset.dx + math.max(padding.left - kOutline, 0.0), offset.dy + math.max(padding.top - kOutline, 0.0))
|
||||
..lineTo(offset.dx + math.min(size.width - padding.right + kOutline, size.width), offset.dy + math.max(padding.top - kOutline, 0.0))
|
||||
|
@ -198,7 +198,7 @@ abstract class RenderStackBase extends RenderBox
|
||||
RenderBoxContainerDefaultsMixin<RenderBox, StackParentData> {
|
||||
RenderStackBase({
|
||||
List<RenderBox> children,
|
||||
FractionalOffset alignment: const FractionalOffset(0.0, 0.0)
|
||||
alignment: const FractionalOffset(0.0, 0.0)
|
||||
}) : _alignment = alignment {
|
||||
addAll(children);
|
||||
}
|
||||
@ -425,7 +425,7 @@ abstract class RenderStackBase extends RenderBox
|
||||
class RenderStack extends RenderStackBase {
|
||||
RenderStack({
|
||||
List<RenderBox> children,
|
||||
FractionalOffset alignment: const FractionalOffset(0.0, 0.0)
|
||||
alignment: const FractionalOffset(0.0, 0.0)
|
||||
}) : super(
|
||||
children: children,
|
||||
alignment: alignment
|
||||
@ -444,7 +444,7 @@ class RenderStack extends RenderStackBase {
|
||||
class RenderIndexedStack extends RenderStackBase {
|
||||
RenderIndexedStack({
|
||||
List<RenderBox> children,
|
||||
FractionalOffset alignment: const FractionalOffset(0.0, 0.0),
|
||||
alignment: const FractionalOffset(0.0, 0.0),
|
||||
int index: 0
|
||||
}) : _index = index, super(
|
||||
children: children,
|
||||
|
@ -106,7 +106,7 @@ abstract class Scheduler extends BindingBase {
|
||||
// Note that we inverse the priority.
|
||||
return -e1.priority.compareTo(e2.priority);
|
||||
}
|
||||
final PriorityQueue<_TaskEntry> _taskQueue = new HeapPriorityQueue<_TaskEntry>(_taskSorter);
|
||||
final PriorityQueue _taskQueue = new HeapPriorityQueue<_TaskEntry>(_taskSorter);
|
||||
|
||||
/// Whether this scheduler already requested to be called from the event loop.
|
||||
bool _hasRequestedAnEventLoopCallback = false;
|
||||
|
@ -16,17 +16,17 @@ class Ticker {
|
||||
|
||||
final TickerCallback _onTick;
|
||||
|
||||
Completer<Null> _completer;
|
||||
Completer _completer;
|
||||
int _animationId;
|
||||
Duration _startTime;
|
||||
|
||||
/// Starts calling onTick once per animation frame.
|
||||
///
|
||||
/// The returned future resolves once the ticker stops ticking.
|
||||
Future<Null> start() {
|
||||
Future start() {
|
||||
assert(!isTicking);
|
||||
assert(_startTime == null);
|
||||
_completer = new Completer<Null>();
|
||||
_completer = new Completer();
|
||||
_scheduleTick();
|
||||
return _completer.future;
|
||||
}
|
||||
@ -48,7 +48,7 @@ class Ticker {
|
||||
// We take the _completer into a local variable so that isTicking is false
|
||||
// when we actually complete the future (isTicking uses _completer
|
||||
// to determine its state).
|
||||
Completer<Null> localCompleter = _completer;
|
||||
Completer localCompleter = _completer;
|
||||
_completer = null;
|
||||
assert(!isTicking);
|
||||
localCompleter.complete();
|
||||
|
@ -80,7 +80,7 @@ class MojoAssetBundle extends CachingAssetBundle {
|
||||
return new MojoAssetBundle(bundle);
|
||||
}
|
||||
|
||||
static Future<Null> _fetchAndUnpackBundle(String relativeUrl, AssetBundleProxy bundle) async {
|
||||
static Future _fetchAndUnpackBundle(String relativeUrl, AssetBundleProxy bundle) async {
|
||||
core.MojoDataPipeConsumer bundleData = (await fetchUrl(relativeUrl)).body;
|
||||
AssetUnpackerProxy unpacker = new AssetUnpackerProxy.unbound();
|
||||
shell.connectToService("mojo:asset_bundle", unpacker);
|
||||
|
@ -36,11 +36,8 @@ class _UrlFetcher implements ImageProvider {
|
||||
);
|
||||
}
|
||||
|
||||
bool operator ==(dynamic other) {
|
||||
if (other is! _UrlFetcher)
|
||||
return false;
|
||||
final _UrlFetcher typedOther = other;
|
||||
return _url == typedOther._url && _scale == typedOther._scale;
|
||||
bool operator ==(other) {
|
||||
return other is _UrlFetcher && _url == other._url && _scale == other._scale;
|
||||
}
|
||||
|
||||
int get hashCode => hashValues(_url, _scale);
|
||||
|
@ -24,12 +24,7 @@ typedef void ImageListener(ImageInfo image);
|
||||
/// or because the underlying image resource was mutated.
|
||||
class ImageResource {
|
||||
ImageResource(this._futureImage) {
|
||||
_futureImage.then(
|
||||
_handleImageLoaded,
|
||||
onError: (dynamic exception, dynamic stack) {
|
||||
_handleImageError('Failed to load image:', exception, stack);
|
||||
}
|
||||
);
|
||||
_futureImage.then(_handleImageLoaded, onError: (exception, stack) => _handleImageError('Failed to load image:', exception, stack));
|
||||
}
|
||||
|
||||
bool _resolved = false;
|
||||
|
@ -86,9 +86,9 @@ abstract class _VariantAssetResolver extends _AssetResolver {
|
||||
// one.
|
||||
Map<String, List<String>> _assetManifest;
|
||||
|
||||
Future<Null> _initializer;
|
||||
Future _initializer;
|
||||
|
||||
Future<Null> _loadManifest() async {
|
||||
Future _loadManifest() async {
|
||||
String json = await bundle.loadString("AssetManifest.json");
|
||||
_assetManifest = JSON.decode(json);
|
||||
}
|
||||
|
@ -419,7 +419,7 @@ class Align extends OneChildRenderObjectWidget {
|
||||
|
||||
/// Centers its child within itself.
|
||||
class Center extends Align {
|
||||
Center({ Key key, double widthFactor, double heightFactor, Widget child })
|
||||
Center({ Key key, widthFactor, heightFactor, Widget child })
|
||||
: super(key: key, widthFactor: widthFactor, heightFactor: heightFactor, child: child);
|
||||
}
|
||||
|
||||
@ -453,7 +453,7 @@ class LayoutId extends ParentDataWidget<CustomMultiChildLayout> {
|
||||
Key key,
|
||||
Widget child,
|
||||
Object id
|
||||
}) : id = id, super(key: key ?? new ValueKey<Object>(id), child: child) {
|
||||
}) : id = id, super(key: key ?? new ValueKey(id), child: child) {
|
||||
assert(child != null);
|
||||
assert(id != null);
|
||||
}
|
||||
@ -1388,9 +1388,9 @@ class Row extends Flex {
|
||||
Row({
|
||||
Key key,
|
||||
List<Widget> children: _emptyWidgetList,
|
||||
FlexJustifyContent justifyContent: FlexJustifyContent.start,
|
||||
FlexAlignItems alignItems: FlexAlignItems.center,
|
||||
TextBaseline textBaseline
|
||||
justifyContent: FlexJustifyContent.start,
|
||||
alignItems: FlexAlignItems.center,
|
||||
textBaseline
|
||||
}) : super(
|
||||
children: children,
|
||||
key: key,
|
||||
@ -1409,9 +1409,9 @@ class Column extends Flex {
|
||||
Column({
|
||||
Key key,
|
||||
List<Widget> children: _emptyWidgetList,
|
||||
FlexJustifyContent justifyContent: FlexJustifyContent.start,
|
||||
FlexAlignItems alignItems: FlexAlignItems.center,
|
||||
TextBaseline textBaseline
|
||||
justifyContent: FlexJustifyContent.start,
|
||||
alignItems: FlexAlignItems.center,
|
||||
textBaseline
|
||||
}) : super(
|
||||
children: children,
|
||||
key: key,
|
||||
|
@ -222,11 +222,9 @@ class RenderObjectToWidgetAdapter<T extends RenderObject> extends RenderObjectWi
|
||||
class RenderObjectToWidgetElement<T extends RenderObject> extends RenderObjectElement {
|
||||
RenderObjectToWidgetElement(RenderObjectToWidgetAdapter<T> widget) : super(widget);
|
||||
|
||||
RenderObjectToWidgetAdapter<T> get widget => super.widget;
|
||||
|
||||
Element _child;
|
||||
|
||||
static const Object _rootChildSlot = const Object();
|
||||
static const _rootChildSlot = const Object();
|
||||
|
||||
void visitChildren(ElementVisitor visitor) {
|
||||
if (_child != null)
|
||||
|
@ -10,12 +10,12 @@ import 'framework.dart';
|
||||
class _CheckedModeBannerPainter extends CustomPainter {
|
||||
const _CheckedModeBannerPainter();
|
||||
|
||||
static const Color kColor = const Color(0xA0B71C1C);
|
||||
static const double kOffset = 40.0; // distance to bottom of banner, at a 45 degree angle inwards from the top right corner
|
||||
static const double kHeight = 12.0; // height of banner
|
||||
static const Offset kTextAlign = const Offset(0.0, -3.0); // offset to move text up
|
||||
static const double kFontSize = kHeight * 0.85;
|
||||
static const double kShadowBlur = 4.0; // shadow blur sigma
|
||||
static const kColor = const Color(0xA0B71C1C);
|
||||
static const kOffset = 40.0; // distance to bottom of banner, at a 45 degree angle inwards from the top right corner
|
||||
static const kHeight = 12.0; // height of banner
|
||||
static const kTextAlign = const Offset(0.0, -3.0); // offset to move text up
|
||||
static const kFontSize = kHeight * 0.85;
|
||||
static const kShadowBlur = 4.0; // shadow blur sigma
|
||||
static final Rect kRect = new Rect.fromLTWH(-kOffset, kOffset-kHeight, kOffset * 2.0, kHeight);
|
||||
static const TextStyle kTextStyles = const TextStyle(
|
||||
color: const Color(0xFFFFFFFF),
|
||||
|
@ -80,7 +80,7 @@ abstract class DraggableBase<T> extends StatefulComponent {
|
||||
|
||||
/// Should return a new MultiDragGestureRecognizer instance
|
||||
/// constructed with the given arguments.
|
||||
MultiDragGestureRecognizer<dynamic> createRecognizer(GestureMultiDragStartCallback onStart);
|
||||
MultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart);
|
||||
|
||||
_DraggableState<T> createState() => new _DraggableState<T>();
|
||||
}
|
||||
@ -107,7 +107,7 @@ class Draggable<T> extends DraggableBase<T> {
|
||||
maxSimultaneousDrags: maxSimultaneousDrags
|
||||
);
|
||||
|
||||
ImmediateMultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) {
|
||||
MultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) {
|
||||
return new ImmediateMultiDragGestureRecognizer()..onStart = onStart;
|
||||
}
|
||||
}
|
||||
@ -135,7 +135,7 @@ class HorizontalDraggable<T> extends DraggableBase<T> {
|
||||
maxSimultaneousDrags: maxSimultaneousDrags
|
||||
);
|
||||
|
||||
HorizontalMultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) {
|
||||
MultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) {
|
||||
return new HorizontalMultiDragGestureRecognizer()..onStart = onStart;
|
||||
}
|
||||
}
|
||||
@ -163,7 +163,7 @@ class VerticalDraggable<T> extends DraggableBase<T> {
|
||||
maxSimultaneousDrags: maxSimultaneousDrags
|
||||
);
|
||||
|
||||
VerticalMultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) {
|
||||
MultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) {
|
||||
return new VerticalMultiDragGestureRecognizer()..onStart = onStart;
|
||||
}
|
||||
}
|
||||
@ -190,7 +190,7 @@ class LongPressDraggable<T> extends DraggableBase<T> {
|
||||
maxSimultaneousDrags: maxSimultaneousDrags
|
||||
);
|
||||
|
||||
DelayedMultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) {
|
||||
MultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) {
|
||||
return new DelayedMultiDragGestureRecognizer()
|
||||
..onStart = (Point position) {
|
||||
Drag result = onStart(position);
|
||||
@ -217,7 +217,7 @@ class _DraggableState<T> extends State<DraggableBase<T>> {
|
||||
_recognizer.addPointer(event);
|
||||
}
|
||||
|
||||
_DragAvatar<T> _startDrag(Point position) {
|
||||
_DragAvatar _startDrag(Point position) {
|
||||
if (config.maxSimultaneousDrags != null && _activeCount >= config.maxSimultaneousDrags)
|
||||
return null;
|
||||
Point dragStartPoint;
|
||||
@ -361,7 +361,7 @@ class _DragAvatar<T> extends Drag {
|
||||
final Offset feedbackOffset;
|
||||
final VoidCallback onDragEnd;
|
||||
|
||||
_DragTargetState<T> _activeTarget;
|
||||
_DragTargetState _activeTarget;
|
||||
bool _activeTargetWillAcceptDrop = false;
|
||||
Point _position;
|
||||
Offset _lastOffset;
|
||||
@ -384,7 +384,7 @@ class _DragAvatar<T> extends Drag {
|
||||
_entry.markNeedsBuild();
|
||||
HitTestResult result = new HitTestResult();
|
||||
WidgetFlutterBinding.instance.hitTest(result, globalPosition + feedbackOffset);
|
||||
_DragTargetState<T> target = _getDragTarget(result.path);
|
||||
_DragTargetState target = _getDragTarget(result.path);
|
||||
if (target == _activeTarget)
|
||||
return;
|
||||
if (_activeTarget != null)
|
||||
@ -393,13 +393,13 @@ class _DragAvatar<T> extends Drag {
|
||||
_activeTargetWillAcceptDrop = _activeTarget != null && _activeTarget.didEnter(data);
|
||||
}
|
||||
|
||||
_DragTargetState<T> _getDragTarget(List<HitTestEntry> path) {
|
||||
_DragTargetState _getDragTarget(List<HitTestEntry> path) {
|
||||
// Look for the RenderBox that corresponds to the hit target (the hit target
|
||||
// widget builds a RenderMetadata box for us for this purpose).
|
||||
for (HitTestEntry entry in path) {
|
||||
if (entry.target is RenderMetaData) {
|
||||
RenderMetaData renderMetaData = entry.target;
|
||||
if (renderMetaData.metaData is _DragTargetState<T>)
|
||||
if (renderMetaData.metaData is _DragTargetState)
|
||||
return renderMetaData.metaData;
|
||||
}
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ class RawInputLineState extends ScrollableState<RawInputLine> {
|
||||
_KeyboardClientImpl _keyboardClient;
|
||||
KeyboardHandle _keyboardHandle;
|
||||
|
||||
ScrollBehavior<double, double> createScrollBehavior() => new BoundedBehavior();
|
||||
ScrollBehavior createScrollBehavior() => new BoundedBehavior();
|
||||
BoundedBehavior get scrollBehavior => super.scrollBehavior;
|
||||
|
||||
void initState() {
|
||||
|
@ -119,8 +119,8 @@ abstract class GlobalKey<T extends State<StatefulComponent>> extends Key {
|
||||
Widget get currentWidget => _currentElement?.widget;
|
||||
T get currentState {
|
||||
Element element = _currentElement;
|
||||
if (element is StatefulComponentElement) {
|
||||
StatefulComponentElement statefulElement = element;
|
||||
if (element is StatefulComponentElement<StatefulComponent, T>) {
|
||||
StatefulComponentElement<StatefulComponent, T> statefulElement = element;
|
||||
return statefulElement.state;
|
||||
}
|
||||
return null;
|
||||
@ -304,7 +304,7 @@ abstract class State<T extends StatefulComponent> {
|
||||
|
||||
/// Verifies that the State that was created is one that expects to be created
|
||||
/// for that particular Widget.
|
||||
bool _debugTypesAreRight(Widget widget) => widget is T;
|
||||
bool _debugTypesAreRight(widget) => widget is T;
|
||||
|
||||
/// Pointer to the owner Element object
|
||||
StatefulComponentElement _element;
|
||||
@ -420,7 +420,7 @@ abstract class ParentDataWidget<T extends RenderObjectWidget> extends _ProxyComp
|
||||
const ParentDataWidget({ Key key, Widget child })
|
||||
: super(key: key, child: child);
|
||||
|
||||
ParentDataElement<T> createElement() => new ParentDataElement<T>(this);
|
||||
ParentDataElement createElement() => new ParentDataElement(this);
|
||||
|
||||
/// Subclasses should override this function to return true if the given
|
||||
/// ancestor is a RenderObjectWidget that wraps a RenderObject that can handle
|
||||
@ -612,8 +612,8 @@ abstract class BuildContext {
|
||||
///
|
||||
/// Elements can, in principle, have children. Only subclasses of
|
||||
/// RenderObjectElement are allowed to have more than one child.
|
||||
abstract class Element implements BuildContext {
|
||||
Element(Widget widget) : _widget = widget {
|
||||
abstract class Element<T extends Widget> implements BuildContext {
|
||||
Element(T widget) : _widget = widget {
|
||||
assert(widget != null);
|
||||
}
|
||||
|
||||
@ -633,8 +633,8 @@ abstract class Element implements BuildContext {
|
||||
int _depth;
|
||||
|
||||
/// The configuration for this element.
|
||||
Widget get widget => _widget;
|
||||
Widget _widget;
|
||||
T get widget => _widget;
|
||||
T _widget;
|
||||
|
||||
bool _active = false;
|
||||
|
||||
@ -744,7 +744,7 @@ abstract class Element implements BuildContext {
|
||||
}
|
||||
|
||||
/// Called when an Element receives a new configuration widget.
|
||||
void update(Widget newWidget) {
|
||||
void update(T newWidget) {
|
||||
assert(_debugLifecycleState == _ElementLifecycle.active);
|
||||
assert(widget != null);
|
||||
assert(newWidget != null);
|
||||
@ -1040,8 +1040,8 @@ typedef void BuildScheduler(BuildableElement element);
|
||||
|
||||
/// Base class for instantiations of widgets that have builders and can be
|
||||
/// marked dirty.
|
||||
abstract class BuildableElement extends Element {
|
||||
BuildableElement(Widget widget) : super(widget);
|
||||
abstract class BuildableElement<T extends Widget> extends Element<T> {
|
||||
BuildableElement(T widget) : super(widget);
|
||||
|
||||
/// Returns true if the element has been marked as needing rebuilding.
|
||||
bool get dirty => _dirty;
|
||||
@ -1197,8 +1197,8 @@ typedef Widget WidgetBuilder(BuildContext context);
|
||||
|
||||
/// Base class for the instantiation of StatelessComponent, StatefulComponent,
|
||||
/// and ProxyComponent widgets.
|
||||
abstract class ComponentElement extends BuildableElement {
|
||||
ComponentElement(Widget widget) : super(widget);
|
||||
abstract class ComponentElement<T extends Widget> extends BuildableElement<T> {
|
||||
ComponentElement(T widget) : super(widget);
|
||||
|
||||
WidgetBuilder _builder;
|
||||
Element _child;
|
||||
@ -1271,14 +1271,12 @@ abstract class ComponentElement extends BuildableElement {
|
||||
}
|
||||
|
||||
/// Instantiation of StatelessComponent widgets.
|
||||
class StatelessComponentElement extends ComponentElement {
|
||||
StatelessComponentElement(StatelessComponent widget) : super(widget) {
|
||||
class StatelessComponentElement<T extends StatelessComponent> extends ComponentElement<T> {
|
||||
StatelessComponentElement(T widget) : super(widget) {
|
||||
_builder = widget.build;
|
||||
}
|
||||
|
||||
StatelessComponent get widget => super.widget;
|
||||
|
||||
void update(StatelessComponent newWidget) {
|
||||
void update(T newWidget) {
|
||||
super.update(newWidget);
|
||||
assert(widget == newWidget);
|
||||
_builder = widget.build;
|
||||
@ -1288,10 +1286,10 @@ class StatelessComponentElement extends ComponentElement {
|
||||
}
|
||||
|
||||
/// Instantiation of StatefulComponent widgets.
|
||||
class StatefulComponentElement extends ComponentElement {
|
||||
StatefulComponentElement(StatefulComponent widget)
|
||||
class StatefulComponentElement<T extends StatefulComponent, U extends State<T>> extends ComponentElement<T> {
|
||||
StatefulComponentElement(T widget)
|
||||
: _state = widget.createState(), super(widget) {
|
||||
assert(_state._debugTypesAreRight(widget));
|
||||
assert(_state._debugTypesAreRight(widget)); // can't use T and U, since normally we don't actually set those
|
||||
assert(_state._element == null);
|
||||
_state._element = this;
|
||||
assert(_builder == null);
|
||||
@ -1301,8 +1299,8 @@ class StatefulComponentElement extends ComponentElement {
|
||||
assert(_state._debugLifecycleState == _StateLifecycle.created);
|
||||
}
|
||||
|
||||
State<StatefulComponent> get state => _state;
|
||||
State<StatefulComponent> _state;
|
||||
U get state => _state;
|
||||
U _state;
|
||||
|
||||
void _firstBuild() {
|
||||
assert(_state._debugLifecycleState == _StateLifecycle.created);
|
||||
@ -1325,7 +1323,7 @@ class StatefulComponentElement extends ComponentElement {
|
||||
super._firstBuild();
|
||||
}
|
||||
|
||||
void update(StatefulComponent newWidget) {
|
||||
void update(T newWidget) {
|
||||
super.update(newWidget);
|
||||
assert(widget == newWidget);
|
||||
StatefulComponent oldConfig = _state._config;
|
||||
@ -1377,17 +1375,15 @@ class StatefulComponentElement extends ComponentElement {
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _ProxyElement extends ComponentElement {
|
||||
_ProxyElement(_ProxyComponent widget) : super(widget) {
|
||||
abstract class _ProxyElement<T extends _ProxyComponent> extends ComponentElement<T> {
|
||||
_ProxyElement(T widget) : super(widget) {
|
||||
_builder = _build;
|
||||
}
|
||||
|
||||
_ProxyComponent get widget => super.widget;
|
||||
|
||||
Widget _build(BuildContext context) => widget.child;
|
||||
|
||||
void update(_ProxyComponent newWidget) {
|
||||
_ProxyComponent oldWidget = widget;
|
||||
void update(T newWidget) {
|
||||
T oldWidget = widget;
|
||||
assert(widget != null);
|
||||
assert(widget != newWidget);
|
||||
super.update(newWidget);
|
||||
@ -1397,20 +1393,18 @@ abstract class _ProxyElement extends ComponentElement {
|
||||
rebuild();
|
||||
}
|
||||
|
||||
void notifyDescendants(_ProxyComponent oldWidget);
|
||||
void notifyDescendants(T oldWidget);
|
||||
}
|
||||
|
||||
class ParentDataElement<T extends RenderObjectWidget> extends _ProxyElement {
|
||||
ParentDataElement(ParentDataWidget<T> widget) : super(widget);
|
||||
|
||||
ParentDataWidget<T> get widget => super.widget;
|
||||
class ParentDataElement extends _ProxyElement<ParentDataWidget> {
|
||||
ParentDataElement(ParentDataWidget widget) : super(widget);
|
||||
|
||||
void mount(Element parent, dynamic slot) {
|
||||
assert(() {
|
||||
List<Widget> badAncestors = <Widget>[];
|
||||
Element ancestor = parent;
|
||||
while (ancestor != null) {
|
||||
if (ancestor is ParentDataElement<dynamic>) {
|
||||
if (ancestor is ParentDataElement) {
|
||||
badAncestors.add(ancestor.widget);
|
||||
} else if (ancestor is RenderObjectElement) {
|
||||
if (widget.debugIsValidAncestor(ancestor.widget))
|
||||
@ -1434,14 +1428,12 @@ class ParentDataElement<T extends RenderObjectWidget> extends _ProxyElement {
|
||||
super.mount(parent, slot);
|
||||
}
|
||||
|
||||
void notifyDescendants(ParentDataWidget<T> oldWidget) {
|
||||
void notifyDescendants(ParentDataWidget oldWidget) {
|
||||
void notifyChildren(Element child) {
|
||||
if (child is RenderObjectElement) {
|
||||
if (child is RenderObjectElement)
|
||||
child.updateParentData(widget);
|
||||
} else {
|
||||
assert(child is! ParentDataElement<dynamic>);
|
||||
else if (child is! ParentDataElement)
|
||||
child.visitChildren(notifyChildren);
|
||||
}
|
||||
}
|
||||
visitChildren(notifyChildren);
|
||||
}
|
||||
@ -1449,11 +1441,9 @@ class ParentDataElement<T extends RenderObjectWidget> extends _ProxyElement {
|
||||
|
||||
|
||||
|
||||
class InheritedElement extends _ProxyElement {
|
||||
class InheritedElement extends _ProxyElement<InheritedWidget> {
|
||||
InheritedElement(InheritedWidget widget) : super(widget);
|
||||
|
||||
InheritedWidget get widget => super.widget;
|
||||
|
||||
final Set<Element> _dependants = new HashSet<Element>();
|
||||
|
||||
void _updateInheritance() {
|
||||
@ -1491,10 +1481,8 @@ class InheritedElement extends _ProxyElement {
|
||||
}
|
||||
|
||||
/// Base class for instantiations of RenderObjectWidget subclasses
|
||||
abstract class RenderObjectElement extends BuildableElement {
|
||||
RenderObjectElement(RenderObjectWidget widget) : super(widget);
|
||||
|
||||
RenderObjectWidget get widget => super.widget;
|
||||
abstract class RenderObjectElement<T extends RenderObjectWidget> extends BuildableElement<T> {
|
||||
RenderObjectElement(T widget) : super(widget);
|
||||
|
||||
/// The underlying [RenderObject] for this element
|
||||
RenderObject get renderObject => _renderObject;
|
||||
@ -1509,10 +1497,10 @@ abstract class RenderObjectElement extends BuildableElement {
|
||||
return ancestor;
|
||||
}
|
||||
|
||||
ParentDataElement<dynamic> _findAncestorParentDataElement() {
|
||||
ParentDataElement _findAncestorParentDataElement() {
|
||||
Element ancestor = _parent;
|
||||
while (ancestor != null && ancestor is! RenderObjectElement) {
|
||||
if (ancestor is ParentDataElement<dynamic>)
|
||||
if (ancestor is ParentDataElement)
|
||||
return ancestor;
|
||||
ancestor = ancestor._parent;
|
||||
}
|
||||
@ -1528,7 +1516,7 @@ abstract class RenderObjectElement extends BuildableElement {
|
||||
_dirty = false;
|
||||
}
|
||||
|
||||
void update(RenderObjectWidget newWidget) {
|
||||
void update(T newWidget) {
|
||||
super.update(newWidget);
|
||||
assert(widget == newWidget);
|
||||
assert(() { debugUpdateRenderObjectOwner(); return true; });
|
||||
@ -1714,7 +1702,7 @@ abstract class RenderObjectElement extends BuildableElement {
|
||||
widget.didUnmountRenderObject(renderObject);
|
||||
}
|
||||
|
||||
void updateParentData(ParentDataWidget<dynamic> parentData) {
|
||||
void updateParentData(ParentDataWidget parentData) {
|
||||
parentData.applyParentData(renderObject);
|
||||
}
|
||||
|
||||
@ -1730,7 +1718,7 @@ abstract class RenderObjectElement extends BuildableElement {
|
||||
_slot = newSlot;
|
||||
_ancestorRenderObjectElement = _findAncestorRenderObjectElement();
|
||||
_ancestorRenderObjectElement?.insertChildRenderObject(renderObject, newSlot);
|
||||
ParentDataElement<dynamic> parentDataElement = _findAncestorParentDataElement();
|
||||
ParentDataElement parentDataElement = _findAncestorParentDataElement();
|
||||
if (parentDataElement != null)
|
||||
updateParentData(parentDataElement.widget);
|
||||
}
|
||||
@ -1755,8 +1743,8 @@ abstract class RenderObjectElement extends BuildableElement {
|
||||
}
|
||||
|
||||
/// Instantiation of RenderObjectWidgets that have no children
|
||||
class LeafRenderObjectElement extends RenderObjectElement {
|
||||
LeafRenderObjectElement(LeafRenderObjectWidget widget): super(widget);
|
||||
class LeafRenderObjectElement<T extends RenderObjectWidget> extends RenderObjectElement<T> {
|
||||
LeafRenderObjectElement(T widget): super(widget);
|
||||
|
||||
void insertChildRenderObject(RenderObject child, dynamic slot) {
|
||||
assert(false);
|
||||
@ -1772,10 +1760,8 @@ class LeafRenderObjectElement extends RenderObjectElement {
|
||||
}
|
||||
|
||||
/// Instantiation of RenderObjectWidgets that have up to one child
|
||||
class OneChildRenderObjectElement extends RenderObjectElement {
|
||||
OneChildRenderObjectElement(OneChildRenderObjectWidget widget) : super(widget);
|
||||
|
||||
OneChildRenderObjectWidget get widget => super.widget;
|
||||
class OneChildRenderObjectElement<T extends OneChildRenderObjectWidget> extends RenderObjectElement<T> {
|
||||
OneChildRenderObjectElement(T widget) : super(widget);
|
||||
|
||||
Element _child;
|
||||
|
||||
@ -1796,14 +1782,14 @@ class OneChildRenderObjectElement extends RenderObjectElement {
|
||||
_child = updateChild(_child, widget.child, null);
|
||||
}
|
||||
|
||||
void update(OneChildRenderObjectWidget newWidget) {
|
||||
void update(T newWidget) {
|
||||
super.update(newWidget);
|
||||
assert(widget == newWidget);
|
||||
_child = updateChild(_child, widget.child, null);
|
||||
}
|
||||
|
||||
void insertChildRenderObject(RenderObject child, dynamic slot) {
|
||||
final RenderObjectWithChildMixin<dynamic> renderObject = this.renderObject;
|
||||
final RenderObjectWithChildMixin renderObject = this.renderObject;
|
||||
assert(slot == null);
|
||||
renderObject.child = child;
|
||||
assert(renderObject == this.renderObject);
|
||||
@ -1814,7 +1800,7 @@ class OneChildRenderObjectElement extends RenderObjectElement {
|
||||
}
|
||||
|
||||
void removeChildRenderObject(RenderObject child) {
|
||||
final RenderObjectWithChildMixin<dynamic> renderObject = this.renderObject;
|
||||
final RenderObjectWithChildMixin renderObject = this.renderObject;
|
||||
assert(renderObject.child == child);
|
||||
renderObject.child = null;
|
||||
assert(renderObject == this.renderObject);
|
||||
@ -1822,39 +1808,37 @@ class OneChildRenderObjectElement extends RenderObjectElement {
|
||||
}
|
||||
|
||||
/// Instantiation of RenderObjectWidgets that can have a list of children
|
||||
class MultiChildRenderObjectElement extends RenderObjectElement {
|
||||
MultiChildRenderObjectElement(MultiChildRenderObjectWidget widget) : super(widget) {
|
||||
class MultiChildRenderObjectElement<T extends MultiChildRenderObjectWidget> extends RenderObjectElement<T> {
|
||||
MultiChildRenderObjectElement(T widget) : super(widget) {
|
||||
assert(!_debugHasDuplicateIds());
|
||||
}
|
||||
|
||||
MultiChildRenderObjectWidget get widget => super.widget;
|
||||
|
||||
List<Element> _children;
|
||||
// We keep a set of detached children to avoid O(n^2) work walking _children
|
||||
// repeatedly to remove children.
|
||||
final Set<Element> _detachedChildren = new HashSet<Element>();
|
||||
|
||||
void insertChildRenderObject(RenderObject child, Element slot) {
|
||||
final ContainerRenderObjectMixin<dynamic, dynamic> renderObject = this.renderObject;
|
||||
final ContainerRenderObjectMixin renderObject = this.renderObject;
|
||||
renderObject.insert(child, after: slot?.renderObject);
|
||||
assert(renderObject == this.renderObject);
|
||||
}
|
||||
|
||||
void moveChildRenderObject(RenderObject child, dynamic slot) {
|
||||
final ContainerRenderObjectMixin<dynamic, dynamic> renderObject = this.renderObject;
|
||||
final ContainerRenderObjectMixin renderObject = this.renderObject;
|
||||
renderObject.move(child, after: slot?.renderObject);
|
||||
assert(renderObject == this.renderObject);
|
||||
}
|
||||
|
||||
void removeChildRenderObject(RenderObject child) {
|
||||
final ContainerRenderObjectMixin<dynamic, dynamic> renderObject = this.renderObject;
|
||||
final ContainerRenderObjectMixin renderObject = this.renderObject;
|
||||
assert(child.parent == renderObject);
|
||||
renderObject.remove(child);
|
||||
assert(renderObject == this.renderObject);
|
||||
}
|
||||
|
||||
bool _debugHasDuplicateIds() {
|
||||
Set<Key> idSet = new HashSet<Key>();
|
||||
var idSet = new HashSet<Key>();
|
||||
for (Widget child in widget.children) {
|
||||
assert(child != null);
|
||||
if (child.key == null)
|
||||
@ -1895,7 +1879,7 @@ class MultiChildRenderObjectElement extends RenderObjectElement {
|
||||
}
|
||||
}
|
||||
|
||||
void update(MultiChildRenderObjectWidget newWidget) {
|
||||
void update(T newWidget) {
|
||||
super.update(newWidget);
|
||||
assert(widget == newWidget);
|
||||
_children = updateChildren(_children, widget.children, detachedChildren: _detachedChildren);
|
||||
|
@ -104,11 +104,10 @@ class Hero extends StatefulComponent {
|
||||
Map<Object, Map<Key, HeroState>> heroes = <Object, Map<Key, HeroState>>{};
|
||||
void visitor(Element element) {
|
||||
if (element.widget is Hero) {
|
||||
StatefulComponentElement hero = element;
|
||||
Hero heroWidget = element.widget;
|
||||
Object tag = heroWidget.tag;
|
||||
StatefulComponentElement<Hero, HeroState> hero = element;
|
||||
Object tag = hero.widget.tag;
|
||||
assert(tag != null);
|
||||
Key key = heroWidget.key;
|
||||
Key key = hero.widget.key;
|
||||
final Map<Key, HeroState> tagHeroes = heroes.putIfAbsent(tag, () => <Key, HeroState>{});
|
||||
assert(() {
|
||||
if (tagHeroes.containsKey(key)) {
|
||||
@ -396,17 +395,17 @@ class HeroController extends NavigatorObserver {
|
||||
|
||||
HeroParty _party;
|
||||
Animation<double> _animation;
|
||||
PageRoute<dynamic> _from;
|
||||
PageRoute<dynamic> _to;
|
||||
PageRoute _from;
|
||||
PageRoute _to;
|
||||
|
||||
final List<OverlayEntry> _overlayEntries = new List<OverlayEntry>();
|
||||
|
||||
void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {
|
||||
void didPush(Route route, Route previousRoute) {
|
||||
assert(navigator != null);
|
||||
assert(route != null);
|
||||
if (route is PageRoute<dynamic>) {
|
||||
if (route is PageRoute) {
|
||||
assert(route.animation != null);
|
||||
if (previousRoute is PageRoute<dynamic>) // could be null
|
||||
if (previousRoute is PageRoute) // could be null
|
||||
_from = previousRoute;
|
||||
_to = route;
|
||||
_animation = route.animation;
|
||||
@ -414,12 +413,12 @@ class HeroController extends NavigatorObserver {
|
||||
}
|
||||
}
|
||||
|
||||
void didPop(Route<dynamic> route, Route<dynamic> previousRoute) {
|
||||
void didPop(Route route, Route previousRoute) {
|
||||
assert(navigator != null);
|
||||
assert(route != null);
|
||||
if (route is PageRoute<dynamic>) {
|
||||
if (route is PageRoute) {
|
||||
assert(route.animation != null);
|
||||
if (previousRoute is PageRoute<dynamic>) {
|
||||
if (previousRoute is PageRoute) {
|
||||
_to = previousRoute;
|
||||
_from = route;
|
||||
_animation = route.animation;
|
||||
|
@ -68,7 +68,7 @@ abstract class AnimatedWidgetBase extends StatefulComponent {
|
||||
/// The duration over which to animate the parameters of this container.
|
||||
final Duration duration;
|
||||
|
||||
AnimatedWidgetBaseState<AnimatedWidgetBase> createState();
|
||||
AnimatedWidgetBaseState createState();
|
||||
|
||||
void debugFillDescription(List<String> description) {
|
||||
super.debugFillDescription(description);
|
||||
@ -105,7 +105,7 @@ abstract class AnimatedWidgetBaseState<T extends AnimatedWidgetBase> extends Sta
|
||||
_updateCurve();
|
||||
_controller.duration = config.duration;
|
||||
if (_constructTweens()) {
|
||||
forEachTween((Tween<dynamic> tween, dynamic targetValue, TweenConstructor<dynamic> constructor) {
|
||||
forEachTween((Tween tween, dynamic targetValue, TweenConstructor<T> constructor) {
|
||||
_updateTween(tween, targetValue);
|
||||
return tween;
|
||||
});
|
||||
@ -131,11 +131,11 @@ abstract class AnimatedWidgetBaseState<T extends AnimatedWidgetBase> extends Sta
|
||||
setState(() { });
|
||||
}
|
||||
|
||||
bool _shouldAnimateTween(Tween<dynamic> tween, dynamic targetValue) {
|
||||
bool _shouldAnimateTween(Tween tween, dynamic targetValue) {
|
||||
return targetValue != (tween.end ?? tween.begin);
|
||||
}
|
||||
|
||||
void _updateTween(Tween<dynamic> tween, dynamic targetValue) {
|
||||
void _updateTween(Tween tween, dynamic targetValue) {
|
||||
if (tween == null)
|
||||
return;
|
||||
tween
|
||||
@ -145,7 +145,7 @@ abstract class AnimatedWidgetBaseState<T extends AnimatedWidgetBase> extends Sta
|
||||
|
||||
bool _constructTweens() {
|
||||
bool shouldStartAnimation = false;
|
||||
forEachTween((Tween<dynamic> tween, dynamic targetValue, TweenConstructor<T> constructor) {
|
||||
forEachTween((Tween tween, dynamic targetValue, TweenConstructor<T> constructor) {
|
||||
if (targetValue != null) {
|
||||
tween ??= constructor(targetValue);
|
||||
if (_shouldAnimateTween(tween, targetValue))
|
||||
@ -173,7 +173,7 @@ abstract class AnimatedWidgetBaseState<T extends AnimatedWidgetBase> extends Sta
|
||||
/// 2. Take the value returned from the callback, and store it. This is the
|
||||
/// value to use as the current value the next time that the forEachTween()
|
||||
/// method is called.
|
||||
void forEachTween(TweenVisitor<dynamic> visitor);
|
||||
void forEachTween(TweenVisitor visitor);
|
||||
}
|
||||
|
||||
/// A container that gradually changes its values over a period of time.
|
||||
@ -262,7 +262,7 @@ class _AnimatedContainerState extends AnimatedWidgetBaseState<AnimatedContainer>
|
||||
Tween<double> _width;
|
||||
Tween<double> _height;
|
||||
|
||||
void forEachTween(TweenVisitor<dynamic> visitor) {
|
||||
void forEachTween(TweenVisitor visitor) {
|
||||
// TODO(ianh): Use constructor tear-offs when it becomes possible
|
||||
_constraints = visitor(_constraints, config.constraints, (dynamic value) => new BoxConstraintsTween(begin: value));
|
||||
_decoration = visitor(_decoration, config.decoration, (dynamic value) => new DecorationTween(begin: value));
|
||||
@ -381,7 +381,7 @@ class _AnimatedPositionedState extends AnimatedWidgetBaseState<AnimatedPositione
|
||||
Tween<double> _width;
|
||||
Tween<double> _height;
|
||||
|
||||
void forEachTween(TweenVisitor<dynamic> visitor) {
|
||||
void forEachTween(TweenVisitor visitor) {
|
||||
// TODO(ianh): Use constructor tear-offs when it becomes possible
|
||||
_left = visitor(_left, config.left, (dynamic value) => new Tween<double>(begin: value));
|
||||
_top = visitor(_top, config.top, (dynamic value) => new Tween<double>(begin: value));
|
||||
|
@ -5,10 +5,10 @@
|
||||
import 'framework.dart';
|
||||
|
||||
/// Superclass for locale-specific data provided by the application.
|
||||
class LocaleQueryData { } // TODO(ianh): We need a better type here. This doesn't really make sense.
|
||||
class LocaleQueryData { }
|
||||
|
||||
/// Establishes a subtree in which locale queries resolve to the given data.
|
||||
class LocaleQuery extends InheritedWidget {
|
||||
class LocaleQuery<T extends LocaleQueryData> extends InheritedWidget {
|
||||
LocaleQuery({
|
||||
Key key,
|
||||
this.data,
|
||||
@ -18,7 +18,7 @@ class LocaleQuery extends InheritedWidget {
|
||||
}
|
||||
|
||||
/// The locale data for this subtree.
|
||||
final LocaleQueryData data;
|
||||
final T data;
|
||||
|
||||
/// The data from the closest instance of this class that encloses the given context.
|
||||
static LocaleQueryData of(BuildContext context) {
|
||||
|
@ -48,7 +48,7 @@ class MimicOverlayEntry {
|
||||
/// given curve.
|
||||
///
|
||||
/// This function can only be called once per overlay entry.
|
||||
Future<Null> animateTo({
|
||||
Future animateTo({
|
||||
GlobalKey targetKey,
|
||||
Duration duration,
|
||||
Curve curve: Curves.linear
|
||||
|
@ -68,14 +68,12 @@ class _ChildKey {
|
||||
String toString() => "_ChildKey(type: $type, key: $key)";
|
||||
}
|
||||
|
||||
class _MixedViewportElement extends RenderObjectElement {
|
||||
class _MixedViewportElement extends RenderObjectElement<MixedViewport> {
|
||||
_MixedViewportElement(MixedViewport widget) : super(widget) {
|
||||
if (widget.onInvalidatorAvailable != null)
|
||||
widget.onInvalidatorAvailable(invalidate);
|
||||
}
|
||||
|
||||
MixedViewport get widget => super.widget;
|
||||
|
||||
/// _childExtents contains the extents of each child from the top of the list
|
||||
/// up to the last one we've ever created.
|
||||
final List<double> _childExtents = <double>[];
|
||||
|
@ -33,7 +33,7 @@ abstract class Route<T> {
|
||||
void didPush() { }
|
||||
|
||||
/// Called after install() when the route replaced another in the navigator.
|
||||
void didReplace(Route<dynamic> oldRoute) { }
|
||||
void didReplace(Route oldRoute) { }
|
||||
|
||||
/// A request was made to pop this route. If the route can handle it
|
||||
/// internally (e.g. because it has its own stack of internal state) then
|
||||
@ -49,13 +49,13 @@ abstract class Route<T> {
|
||||
|
||||
/// The given route, which came after this one, has been popped off the
|
||||
/// navigator.
|
||||
void didPopNext(Route<dynamic> nextRoute) { }
|
||||
void didPopNext(Route nextRoute) { }
|
||||
|
||||
/// This route's next route has changed to the given new route. This is called
|
||||
/// on a route whenever the next route changes for any reason, except for
|
||||
/// cases when didPopNext() would be called, so long as it is in the history.
|
||||
/// nextRoute will be null if there's no next route.
|
||||
void didChangeNext(Route<dynamic> nextRoute) { }
|
||||
void didChangeNext(Route nextRoute) { }
|
||||
|
||||
/// The route should remove its overlays and free any other resources.
|
||||
///
|
||||
@ -109,7 +109,7 @@ class RouteSettings {
|
||||
}
|
||||
|
||||
/// Creates a route for the given route settings.
|
||||
typedef Route<dynamic> RouteFactory(RouteSettings settings);
|
||||
typedef Route RouteFactory(RouteSettings settings);
|
||||
|
||||
/// A callback in during which you can perform a number of navigator operations (e.g., pop, push) that happen atomically.
|
||||
typedef void NavigatorTransactionCallback(NavigatorTransaction transaction);
|
||||
@ -121,10 +121,10 @@ class NavigatorObserver {
|
||||
NavigatorState _navigator;
|
||||
|
||||
/// The [Navigator] pushed the given route.
|
||||
void didPush(Route<dynamic> route, Route<dynamic> previousRoute) { }
|
||||
void didPush(Route route, Route previousRoute) { }
|
||||
|
||||
/// THe [Navigator] popped the given route.
|
||||
void didPop(Route<dynamic> route, Route<dynamic> previousRoute) { }
|
||||
void didPop(Route route, Route previousRoute) { }
|
||||
}
|
||||
|
||||
/// Manages a set of child widgets with a stack discipline.
|
||||
@ -189,7 +189,7 @@ class Navigator extends StatefulComponent {
|
||||
/// Navigator observer, if any, will have didPush() called on it.
|
||||
///
|
||||
/// Uses [openTransaction()]. Only one transaction will be executed per frame.
|
||||
static void push(BuildContext context, Route<dynamic> route) {
|
||||
static void push(BuildContext context, Route route) {
|
||||
openTransaction(context, (NavigatorTransaction transaction) {
|
||||
transaction.push(route);
|
||||
});
|
||||
@ -224,7 +224,7 @@ class Navigator extends StatefulComponent {
|
||||
/// If it is already the current route, nothing happens.
|
||||
///
|
||||
/// Uses [openTransaction()]. Only one transaction will be executed per frame.
|
||||
static void popUntil(BuildContext context, Route<dynamic> targetRoute) {
|
||||
static void popUntil(BuildContext context, Route targetRoute) {
|
||||
openTransaction(context, (NavigatorTransaction transaction) {
|
||||
transaction.popUntil(targetRoute);
|
||||
});
|
||||
@ -277,7 +277,7 @@ class Navigator extends StatefulComponent {
|
||||
/// The state for a [Navigator] widget.
|
||||
class NavigatorState extends State<Navigator> {
|
||||
final GlobalKey<OverlayState> _overlayKey = new GlobalKey<OverlayState>();
|
||||
final List<Route<dynamic>> _history = new List<Route<dynamic>>();
|
||||
final List<Route> _history = new List<Route>();
|
||||
|
||||
void initState() {
|
||||
super.initState();
|
||||
@ -301,7 +301,7 @@ class NavigatorState extends State<Navigator> {
|
||||
assert(!_debugLocked);
|
||||
assert(() { _debugLocked = true; return true; });
|
||||
config.observer?._navigator = null;
|
||||
for (Route<dynamic> route in _history) {
|
||||
for (Route route in _history) {
|
||||
route.dispose();
|
||||
route._navigator = null;
|
||||
}
|
||||
@ -313,7 +313,7 @@ class NavigatorState extends State<Navigator> {
|
||||
OverlayState get overlay => _overlayKey.currentState;
|
||||
|
||||
OverlayEntry get _currentOverlayEntry {
|
||||
for (Route<dynamic> route in _history.reversed) {
|
||||
for (Route route in _history.reversed) {
|
||||
if (route.overlayEntries.isNotEmpty)
|
||||
return route.overlayEntries.last;
|
||||
}
|
||||
@ -329,7 +329,7 @@ class NavigatorState extends State<Navigator> {
|
||||
name: name,
|
||||
mostValuableKeys: mostValuableKeys
|
||||
);
|
||||
Route<dynamic> route = config.onGenerateRoute(settings);
|
||||
Route route = config.onGenerateRoute(settings);
|
||||
if (route == null) {
|
||||
assert(config.onUnknownRoute != null);
|
||||
route = config.onUnknownRoute(settings);
|
||||
@ -338,13 +338,13 @@ class NavigatorState extends State<Navigator> {
|
||||
_push(route);
|
||||
}
|
||||
|
||||
void _push(Route<dynamic> route) {
|
||||
void _push(Route route) {
|
||||
assert(!_debugLocked);
|
||||
assert(() { _debugLocked = true; return true; });
|
||||
assert(route != null);
|
||||
assert(route._navigator == null);
|
||||
setState(() {
|
||||
Route<dynamic> oldRoute = _history.isNotEmpty ? _history.last : null;
|
||||
Route oldRoute = _history.isNotEmpty ? _history.last : null;
|
||||
route._navigator = this;
|
||||
route.install(_currentOverlayEntry);
|
||||
_history.add(route);
|
||||
@ -357,7 +357,7 @@ class NavigatorState extends State<Navigator> {
|
||||
assert(() { _debugLocked = false; return true; });
|
||||
}
|
||||
|
||||
void _replace({ Route<dynamic> oldRoute, Route<dynamic> newRoute }) {
|
||||
void _replace({ Route oldRoute, Route newRoute }) {
|
||||
assert(!_debugLocked);
|
||||
assert(oldRoute != null);
|
||||
assert(newRoute != null);
|
||||
@ -388,25 +388,25 @@ class NavigatorState extends State<Navigator> {
|
||||
assert(() { _debugLocked = false; return true; });
|
||||
}
|
||||
|
||||
void _replaceRouteBefore({ Route<dynamic> anchorRoute, Route<dynamic> newRoute }) {
|
||||
void _replaceRouteBefore({ Route anchorRoute, Route newRoute }) {
|
||||
assert(anchorRoute != null);
|
||||
assert(anchorRoute._navigator == this);
|
||||
assert(_history.indexOf(anchorRoute) > 0);
|
||||
_replace(oldRoute: _history[_history.indexOf(anchorRoute)-1], newRoute: newRoute);
|
||||
}
|
||||
|
||||
void _removeRouteBefore(Route<dynamic> anchorRoute) {
|
||||
void _removeRouteBefore(Route anchorRoute) {
|
||||
assert(!_debugLocked);
|
||||
assert(() { _debugLocked = true; return true; });
|
||||
assert(anchorRoute._navigator == this);
|
||||
int index = _history.indexOf(anchorRoute) - 1;
|
||||
assert(index >= 0);
|
||||
Route<dynamic> targetRoute = _history[index];
|
||||
Route targetRoute = _history[index];
|
||||
assert(targetRoute._navigator == this);
|
||||
assert(targetRoute.overlayEntries.isEmpty || !overlay.debugIsVisible(targetRoute.overlayEntries.last));
|
||||
setState(() {
|
||||
_history.removeAt(index);
|
||||
Route<dynamic> newRoute = index < _history.length ? _history[index] : null;
|
||||
Route newRoute = index < _history.length ? _history[index] : null;
|
||||
if (index > 0)
|
||||
_history[index - 1].didChangeNext(newRoute);
|
||||
targetRoute.dispose();
|
||||
@ -418,7 +418,7 @@ class NavigatorState extends State<Navigator> {
|
||||
bool _pop([dynamic result]) {
|
||||
assert(!_debugLocked);
|
||||
assert(() { _debugLocked = true; return true; });
|
||||
Route<dynamic> route = _history.last;
|
||||
Route route = _history.last;
|
||||
assert(route._navigator == this);
|
||||
bool debugPredictedWouldPop;
|
||||
assert(() { debugPredictedWouldPop = !route.willHandlePopInternally; return true; });
|
||||
@ -445,7 +445,7 @@ class NavigatorState extends State<Navigator> {
|
||||
return true;
|
||||
}
|
||||
|
||||
void _popUntil(Route<dynamic> targetRoute) {
|
||||
void _popUntil(Route targetRoute) {
|
||||
assert(_history.contains(targetRoute));
|
||||
while (!targetRoute.isCurrent)
|
||||
_pop();
|
||||
@ -512,7 +512,7 @@ class NavigatorTransaction {
|
||||
/// The route will have didPush() and didChangeNext() called on it; the
|
||||
/// previous route, if any, will have didChangeNext() called on it; and the
|
||||
/// Navigator observer, if any, will have didPush() called on it.
|
||||
void push(Route<dynamic> route) {
|
||||
void push(Route route) {
|
||||
assert(_debugOpen);
|
||||
_navigator._push(route);
|
||||
}
|
||||
@ -528,7 +528,7 @@ class NavigatorTransaction {
|
||||
///
|
||||
/// It is safe to call this redundantly (replacing a route with itself). Such
|
||||
/// calls are ignored.
|
||||
void replace({ Route<dynamic> oldRoute, Route<dynamic> newRoute }) {
|
||||
void replace({ Route oldRoute, Route newRoute }) {
|
||||
assert(_debugOpen);
|
||||
_navigator._replace(oldRoute: oldRoute, newRoute: newRoute);
|
||||
}
|
||||
@ -541,14 +541,14 @@ class NavigatorTransaction {
|
||||
///
|
||||
/// The conditions described for [replace()] apply; for instance, the route
|
||||
/// before anchorRoute must have overlay entries.
|
||||
void replaceRouteBefore({ Route<dynamic> anchorRoute, Route<dynamic> newRoute }) {
|
||||
void replaceRouteBefore({ Route anchorRoute, Route newRoute }) {
|
||||
assert(_debugOpen);
|
||||
_navigator._replaceRouteBefore(anchorRoute: anchorRoute, newRoute: newRoute);
|
||||
}
|
||||
|
||||
/// Removes the route prior to the given anchorRoute, and calls didChangeNext
|
||||
/// on the route prior to that one, if any. The observer is not notified.
|
||||
void removeRouteBefore(Route<dynamic> anchorRoute) {
|
||||
void removeRouteBefore(Route anchorRoute) {
|
||||
assert(_debugOpen);
|
||||
_navigator._removeRouteBefore(anchorRoute);
|
||||
}
|
||||
@ -573,7 +573,7 @@ class NavigatorTransaction {
|
||||
|
||||
/// Calls pop() repeatedly until the given route is the current route.
|
||||
/// If it is already the current route, nothing happens.
|
||||
void popUntil(Route<dynamic> targetRoute) {
|
||||
void popUntil(Route targetRoute) {
|
||||
assert(_debugOpen);
|
||||
_navigator._popUntil(targetRoute);
|
||||
}
|
||||
|
@ -13,9 +13,9 @@ abstract class Notification {
|
||||
void dispatch(BuildContext target) {
|
||||
target.visitAncestorElements((Element element) {
|
||||
if (element is StatelessComponentElement &&
|
||||
element.widget is NotificationListener<dynamic>) {
|
||||
final NotificationListener<dynamic> widget = element.widget;
|
||||
if (widget._dispatch(this)) // that function checks the type dynamically
|
||||
element.widget is NotificationListener) {
|
||||
final NotificationListener widget = element.widget;
|
||||
if (widget._dispatch(this))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -71,7 +71,7 @@ class PageableList extends Scrollable {
|
||||
/// The list of pages themselves.
|
||||
final Iterable<Widget> children;
|
||||
|
||||
PageableListState<PageableList> createState() => new PageableListState<PageableList>();
|
||||
PageableListState createState() => new PageableListState();
|
||||
}
|
||||
|
||||
/// State for a [PageableList] widget.
|
||||
@ -185,7 +185,7 @@ class PageableListState<T extends PageableList> extends ScrollableState<T> {
|
||||
return _overscrollBehavior;
|
||||
}
|
||||
|
||||
ScrollBehavior<double, double> createScrollBehavior() => scrollBehavior;
|
||||
ScrollBehavior createScrollBehavior() => scrollBehavior;
|
||||
|
||||
bool get shouldSnapScrollOffset => config.itemsSnapAlignment == ItemsSnapAlignment.item;
|
||||
|
||||
@ -196,14 +196,14 @@ class PageableListState<T extends PageableList> extends ScrollableState<T> {
|
||||
.clamp(scrollBehavior.minScrollOffset, scrollBehavior.maxScrollOffset);
|
||||
}
|
||||
|
||||
Future<Null> _flingToAdjacentItem(double scrollVelocity) {
|
||||
Future _flingToAdjacentItem(double scrollVelocity) {
|
||||
final double newScrollOffset = snapScrollOffset(scrollOffset + scrollVelocity.sign)
|
||||
.clamp(snapScrollOffset(scrollOffset - 0.5), snapScrollOffset(scrollOffset + 0.5));
|
||||
return scrollTo(newScrollOffset, duration: config.duration, curve: config.curve)
|
||||
.then(_notifyPageChanged);
|
||||
}
|
||||
|
||||
Future<Null> fling(double scrollVelocity) {
|
||||
Future fling(double scrollVelocity) {
|
||||
switch(config.itemsSnapAlignment) {
|
||||
case ItemsSnapAlignment.adjacentItem:
|
||||
return _flingToAdjacentItem(scrollVelocity);
|
||||
@ -212,7 +212,7 @@ class PageableListState<T extends PageableList> extends ScrollableState<T> {
|
||||
}
|
||||
}
|
||||
|
||||
Future<Null> settleScrollOffset() {
|
||||
Future settleScrollOffset() {
|
||||
return scrollTo(snapScrollOffset(scrollOffset), duration: config.duration, curve: config.curve)
|
||||
.then(_notifyPageChanged);
|
||||
}
|
||||
@ -247,11 +247,9 @@ class PageViewport extends VirtualViewportFromIterable {
|
||||
_PageViewportElement createElement() => new _PageViewportElement(this);
|
||||
}
|
||||
|
||||
class _PageViewportElement extends VirtualViewportElement {
|
||||
class _PageViewportElement extends VirtualViewportElement<PageViewport> {
|
||||
_PageViewportElement(PageViewport widget) : super(widget);
|
||||
|
||||
PageViewport get widget => super.widget;
|
||||
|
||||
RenderList get renderObject => super.renderObject;
|
||||
|
||||
int get materializedChildBase => _materializedChildBase;
|
||||
|
@ -17,8 +17,8 @@ abstract class PageRoute<T> extends ModalRoute<T> {
|
||||
}) : super(completer: completer, settings: settings);
|
||||
bool get opaque => true;
|
||||
bool get barrierDismissable => false;
|
||||
bool canTransitionTo(TransitionRoute<dynamic> nextRoute) => nextRoute is PageRoute<dynamic>;
|
||||
bool canTransitionFrom(TransitionRoute<dynamic> nextRoute) => nextRoute is PageRoute<dynamic>;
|
||||
bool canTransitionTo(TransitionRoute nextRoute) => nextRoute is PageRoute;
|
||||
bool canTransitionFrom(TransitionRoute nextRoute) => nextRoute is PageRoute;
|
||||
|
||||
AnimationController createAnimationController() {
|
||||
AnimationController controller = super.createAnimationController();
|
||||
|
@ -13,7 +13,7 @@ import 'overlay.dart';
|
||||
import 'page_storage.dart';
|
||||
import 'pages.dart';
|
||||
|
||||
const Color _kTransparent = const Color(0x00000000);
|
||||
const _kTransparent = const Color(0x00000000);
|
||||
|
||||
/// A route that displays widgets in the [Navigator]'s [Overlay].
|
||||
abstract class OverlayRoute<T> extends Route<T> {
|
||||
@ -159,8 +159,8 @@ abstract class TransitionRoute<T> extends OverlayRoute<T> {
|
||||
super.didPush();
|
||||
}
|
||||
|
||||
void didReplace(Route<dynamic> oldRoute) {
|
||||
if (oldRoute is TransitionRoute<dynamic>)
|
||||
void didReplace(Route oldRoute) {
|
||||
if (oldRoute is TransitionRoute)
|
||||
_controller.value = oldRoute._controller.value;
|
||||
_animation.addStatusListener(_handleStatusChanged);
|
||||
super.didReplace(oldRoute);
|
||||
@ -173,18 +173,18 @@ abstract class TransitionRoute<T> extends OverlayRoute<T> {
|
||||
return true;
|
||||
}
|
||||
|
||||
void didPopNext(Route<dynamic> nextRoute) {
|
||||
void didPopNext(Route nextRoute) {
|
||||
_updateForwardAnimation(nextRoute);
|
||||
super.didPopNext(nextRoute);
|
||||
}
|
||||
|
||||
void didChangeNext(Route<dynamic> nextRoute) {
|
||||
void didChangeNext(Route nextRoute) {
|
||||
_updateForwardAnimation(nextRoute);
|
||||
super.didChangeNext(nextRoute);
|
||||
}
|
||||
|
||||
void _updateForwardAnimation(Route<dynamic> nextRoute) {
|
||||
if (nextRoute is TransitionRoute<dynamic> && canTransitionTo(nextRoute) && nextRoute.canTransitionFrom(this)) {
|
||||
void _updateForwardAnimation(Route nextRoute) {
|
||||
if (nextRoute is TransitionRoute && canTransitionTo(nextRoute) && nextRoute.canTransitionFrom(this)) {
|
||||
Animation<double> current = _forwardAnimation.parent;
|
||||
if (current != null) {
|
||||
if (current is TrainHoppingAnimation) {
|
||||
@ -216,13 +216,13 @@ abstract class TransitionRoute<T> extends OverlayRoute<T> {
|
||||
///
|
||||
/// Subclasses can override this function to restrict the set of routes they
|
||||
/// need to coordinate transitions with.
|
||||
bool canTransitionTo(TransitionRoute<dynamic> nextRoute) => true;
|
||||
bool canTransitionTo(TransitionRoute nextRoute) => true;
|
||||
|
||||
/// Whether this route can perform a transition from the given route.
|
||||
///
|
||||
/// Subclasses can override this function to restrict the set of routes they
|
||||
/// need to coordinate transitions with.
|
||||
bool canTransitionFrom(TransitionRoute<dynamic> nextRoute) => true;
|
||||
bool canTransitionFrom(TransitionRoute nextRoute) => true;
|
||||
|
||||
void finished() {
|
||||
super.finished();
|
||||
@ -245,7 +245,7 @@ class LocalHistoryEntry {
|
||||
/// Called when this entry is removed from the history of its associated [LocalHistoryRoute].
|
||||
final VoidCallback onRemove;
|
||||
|
||||
LocalHistoryRoute<dynamic> _owner;
|
||||
LocalHistoryRoute _owner;
|
||||
|
||||
/// Remove this entry from the history of its associated [LocalHistoryRoute].
|
||||
void remove() {
|
||||
@ -323,7 +323,7 @@ class _ModalScopeStatus extends InheritedWidget {
|
||||
}
|
||||
|
||||
final bool isCurrent;
|
||||
final Route<dynamic> route;
|
||||
final Route route;
|
||||
|
||||
bool updateShouldNotify(_ModalScopeStatus old) {
|
||||
return isCurrent != old.isCurrent ||
|
||||
@ -342,7 +342,7 @@ class _ModalScope extends StatefulComponent {
|
||||
this.route
|
||||
}) : super(key: key);
|
||||
|
||||
final ModalRoute<dynamic> route;
|
||||
final ModalRoute route;
|
||||
|
||||
_ModalScopeState createState() => new _ModalScopeState();
|
||||
}
|
||||
@ -444,7 +444,7 @@ abstract class ModalRoute<T> extends TransitionRoute<T> with LocalHistoryRoute<T
|
||||
/// Returns the modal route most closely associated with the given context.
|
||||
///
|
||||
/// Returns null if the given context is not associated with a modal route.
|
||||
static ModalRoute<dynamic> of(BuildContext context) {
|
||||
static ModalRoute of(BuildContext context) {
|
||||
_ModalScopeStatus widget = context.inheritFromWidgetOfExactType(_ModalScopeStatus);
|
||||
return widget?.route;
|
||||
}
|
||||
@ -581,8 +581,8 @@ abstract class ModalRoute<T> extends TransitionRoute<T> with LocalHistoryRoute<T
|
||||
abstract class PopupRoute<T> extends ModalRoute<T> {
|
||||
PopupRoute({ Completer<T> completer }) : super(completer: completer);
|
||||
bool get opaque => false;
|
||||
void didChangeNext(Route<dynamic> nextRoute) {
|
||||
assert(nextRoute is! PageRoute<dynamic>);
|
||||
void didChangeNext(Route nextRoute) {
|
||||
assert(nextRoute is! PageRoute);
|
||||
super.didChangeNext(nextRoute);
|
||||
}
|
||||
}
|
||||
|
@ -112,13 +112,13 @@ abstract class Scrollable extends StatefulComponent {
|
||||
}
|
||||
|
||||
/// Scrolls the closest enclosing scrollable to make the given context visible.
|
||||
static Future<Null> ensureVisible(BuildContext context, { Duration duration, Curve curve: Curves.ease }) {
|
||||
static Future ensureVisible(BuildContext context, { Duration duration, Curve curve: Curves.ease }) {
|
||||
assert(context.findRenderObject() is RenderBox);
|
||||
// TODO(abarth): This function doesn't handle nested scrollable widgets.
|
||||
|
||||
ScrollableState scrollable = Scrollable.of(context);
|
||||
if (scrollable == null)
|
||||
return new Future<Null>.value();
|
||||
return new Future.value();
|
||||
|
||||
RenderBox targetBox = context.findRenderObject();
|
||||
assert(targetBox.attached);
|
||||
@ -162,7 +162,7 @@ abstract class Scrollable extends StatefulComponent {
|
||||
} else if (targetMax > scrollableMax) {
|
||||
scrollOffsetDelta = targetMax - scrollableMax;
|
||||
} else {
|
||||
return new Future<Null>.value();
|
||||
return new Future.value();
|
||||
}
|
||||
|
||||
ExtentScrollBehavior scrollBehavior = scrollable.scrollBehavior;
|
||||
@ -172,14 +172,13 @@ abstract class Scrollable extends StatefulComponent {
|
||||
if (scrollOffset != scrollable.scrollOffset)
|
||||
return scrollable.scrollTo(scrollOffset, duration: duration, curve: curve);
|
||||
|
||||
return new Future<Null>.value();
|
||||
return new Future.value();
|
||||
}
|
||||
|
||||
ScrollableState createState();
|
||||
}
|
||||
|
||||
/// Contains the state for common scrolling widgets that scroll only
|
||||
/// along one axis.
|
||||
/// Contains the state for common scrolling widgets.
|
||||
///
|
||||
/// Widgets that subclass [Scrollable] typically use state objects
|
||||
/// that subclass [ScrollableState].
|
||||
@ -300,14 +299,14 @@ abstract class ScrollableState<T extends Scrollable> extends State<T> {
|
||||
/// Scroll behaviors control where the boundaries of the scrollable are placed
|
||||
/// and how the scrolling physics should behave near those boundaries and
|
||||
/// after the user stops directly manipulating the scrollable.
|
||||
ScrollBehavior<double, double> get scrollBehavior {
|
||||
ScrollBehavior get scrollBehavior {
|
||||
return _scrollBehavior ??= createScrollBehavior();
|
||||
}
|
||||
ScrollBehavior<double, double> _scrollBehavior;
|
||||
ScrollBehavior _scrollBehavior;
|
||||
|
||||
/// Subclasses should override this function to create the [ScrollBehavior]
|
||||
/// they desire.
|
||||
ScrollBehavior<double, double> createScrollBehavior();
|
||||
ScrollBehavior createScrollBehavior();
|
||||
|
||||
bool _scrollOffsetIsInBounds(double scrollOffset) {
|
||||
if (scrollBehavior is! ExtentScrollBehavior)
|
||||
@ -337,7 +336,7 @@ abstract class ScrollableState<T extends Scrollable> extends State<T> {
|
||||
///
|
||||
/// If a non-null [duration] is provided, the widget will animate to the new
|
||||
/// scroll offset over the given duration with the given curve.
|
||||
Future<Null> scrollBy(double scrollDelta, { Duration duration, Curve curve: Curves.ease }) {
|
||||
Future scrollBy(double scrollDelta, { Duration duration, Curve curve: Curves.ease }) {
|
||||
double newScrollOffset = scrollBehavior.applyCurve(_scrollOffset, scrollDelta);
|
||||
return scrollTo(newScrollOffset, duration: duration, curve: curve);
|
||||
}
|
||||
@ -350,21 +349,21 @@ abstract class ScrollableState<T extends Scrollable> extends State<T> {
|
||||
/// This function does not accept a zero duration. To jump-scroll to
|
||||
/// the new offset, do not provide a duration, rather than providing
|
||||
/// a zero duration.
|
||||
Future<Null> scrollTo(double newScrollOffset, { Duration duration, Curve curve: Curves.ease }) {
|
||||
Future scrollTo(double newScrollOffset, { Duration duration, Curve curve: Curves.ease }) {
|
||||
if (newScrollOffset == _scrollOffset)
|
||||
return new Future<Null>.value();
|
||||
return new Future.value();
|
||||
|
||||
if (duration == null) {
|
||||
_controller.stop();
|
||||
_setScrollOffset(newScrollOffset);
|
||||
return new Future<Null>.value();
|
||||
return new Future.value();
|
||||
}
|
||||
|
||||
assert(duration > Duration.ZERO);
|
||||
return _animateTo(newScrollOffset, duration, curve);
|
||||
}
|
||||
|
||||
Future<Null> _animateTo(double newScrollOffset, Duration duration, Curve curve) {
|
||||
Future _animateTo(double newScrollOffset, Duration duration, Curve curve) {
|
||||
_controller.stop();
|
||||
_controller.value = scrollOffset;
|
||||
_startScroll();
|
||||
@ -376,10 +375,10 @@ abstract class ScrollableState<T extends Scrollable> extends State<T> {
|
||||
/// Calling this function starts a physics-based animation of the scroll
|
||||
/// offset with the given value as the initial velocity. The physics
|
||||
/// simulation used is determined by the scroll behavior.
|
||||
Future<Null> fling(double scrollVelocity) {
|
||||
Future fling(double scrollVelocity) {
|
||||
if (scrollVelocity != 0.0 || !_controller.isAnimating)
|
||||
return _startToEndAnimation(scrollVelocity);
|
||||
return new Future<Null>.value();
|
||||
return new Future.value();
|
||||
}
|
||||
|
||||
/// Animate the scroll offset to a value with a local minima of energy.
|
||||
@ -387,15 +386,15 @@ abstract class ScrollableState<T extends Scrollable> extends State<T> {
|
||||
/// Calling this function starts a physics-based animation of the scroll
|
||||
/// offset either to a snap point or to within the scrolling bounds. The
|
||||
/// physics simulation used is determined by the scroll behavior.
|
||||
Future<Null> settleScrollOffset() {
|
||||
Future settleScrollOffset() {
|
||||
return _startToEndAnimation(0.0);
|
||||
}
|
||||
|
||||
Future<Null> _startToEndAnimation(double scrollVelocity) {
|
||||
Future _startToEndAnimation(double scrollVelocity) {
|
||||
_controller.stop();
|
||||
Simulation simulation = _createSnapSimulation(scrollVelocity) ?? _createFlingSimulation(scrollVelocity);
|
||||
if (simulation == null)
|
||||
return new Future<Null>.value();
|
||||
return new Future.value();
|
||||
_startScroll();
|
||||
return _controller.animateWith(simulation).then(_endScroll);
|
||||
}
|
||||
@ -494,7 +493,7 @@ abstract class ScrollableState<T extends Scrollable> extends State<T> {
|
||||
scrollBy(pixelOffsetToScrollOffset(delta));
|
||||
}
|
||||
|
||||
Future<Null> _handleDragEnd(Velocity velocity) {
|
||||
Future _handleDragEnd(Velocity velocity) {
|
||||
double scrollVelocity = pixelDeltaToScrollOffset(velocity.pixelsPerSecond) / Duration.MILLISECONDS_PER_SECOND;
|
||||
// The gesture velocity properties are pixels/second, config min,max limits are pixels/ms
|
||||
return fling(scrollVelocity.clamp(-kMaxFlingVelocity, kMaxFlingVelocity)).then(_endScroll);
|
||||
@ -632,7 +631,7 @@ class ScrollableViewport extends Scrollable {
|
||||
}
|
||||
|
||||
class _ScrollableViewportState extends ScrollableState<ScrollableViewport> {
|
||||
ScrollBehavior<double, double> createScrollBehavior() => new OverscrollWhenScrollableBehavior();
|
||||
ScrollBehavior createScrollBehavior() => new OverscrollWhenScrollableBehavior();
|
||||
OverscrollWhenScrollableBehavior get scrollBehavior => super.scrollBehavior;
|
||||
|
||||
double _viewportSize = 0.0;
|
||||
@ -746,13 +745,13 @@ abstract class ScrollableListPainter extends Painter {
|
||||
/// Called when a scroll starts. Subclasses may override this method to
|
||||
/// initialize some state or to play an animation. The returned Future should
|
||||
/// complete when the computation triggered by this method has finished.
|
||||
Future<Null> scrollStarted() => new Future<Null>.value();
|
||||
Future scrollStarted() => new Future.value();
|
||||
|
||||
|
||||
/// Similar to scrollStarted(). Called when a scroll ends. For fling scrolls
|
||||
/// "ended" means that the scroll animation either stopped of its own accord
|
||||
/// or was canceled by the user.
|
||||
Future<Null> scrollEnded() => new Future<Null>.value();
|
||||
Future scrollEnded() => new Future.value();
|
||||
}
|
||||
|
||||
/// A general scrollable list for a large number of children that might not all
|
||||
@ -794,7 +793,7 @@ class ScrollableMixedWidgetListState extends ScrollableState<ScrollableMixedWidg
|
||||
);
|
||||
}
|
||||
|
||||
ScrollBehavior<double, double> createScrollBehavior() => new OverscrollBehavior();
|
||||
ScrollBehavior createScrollBehavior() => new OverscrollBehavior();
|
||||
OverscrollBehavior get scrollBehavior => super.scrollBehavior;
|
||||
|
||||
Offset _handlePaintOffsetUpdateNeeded(ViewportDimensions dimensions) {
|
||||
|
@ -41,7 +41,7 @@ class ScrollableGrid extends Scrollable {
|
||||
}
|
||||
|
||||
class _ScrollableGridState extends ScrollableState<ScrollableGrid> {
|
||||
ScrollBehavior<double, double> createScrollBehavior() => new OverscrollBehavior();
|
||||
ScrollBehavior createScrollBehavior() => new OverscrollBehavior();
|
||||
ExtentScrollBehavior get scrollBehavior => super.scrollBehavior;
|
||||
|
||||
void _handleExtentsChanged(double contentExtent, double containerExtent) {
|
||||
@ -85,11 +85,9 @@ class GridViewport extends VirtualViewportFromIterable {
|
||||
_GridViewportElement createElement() => new _GridViewportElement(this);
|
||||
}
|
||||
|
||||
class _GridViewportElement extends VirtualViewportElement {
|
||||
class _GridViewportElement extends VirtualViewportElement<GridViewport> {
|
||||
_GridViewportElement(GridViewport widget) : super(widget);
|
||||
|
||||
GridViewport get widget => super.widget;
|
||||
|
||||
RenderGrid get renderObject => super.renderObject;
|
||||
|
||||
int get materializedChildBase => _materializedChildBase;
|
||||
|
@ -45,7 +45,7 @@ class ScrollableList extends Scrollable {
|
||||
}
|
||||
|
||||
class _ScrollableListState extends ScrollableState<ScrollableList> {
|
||||
ScrollBehavior<double, double> createScrollBehavior() => new OverscrollBehavior();
|
||||
ScrollBehavior createScrollBehavior() => new OverscrollBehavior();
|
||||
ExtentScrollBehavior get scrollBehavior => super.scrollBehavior;
|
||||
|
||||
void _handleExtentsChanged(double contentExtent, double containerExtent) {
|
||||
@ -145,11 +145,9 @@ class _VirtualListViewport extends VirtualViewport {
|
||||
_VirtualListViewportElement createElement() => new _VirtualListViewportElement(this);
|
||||
}
|
||||
|
||||
class _VirtualListViewportElement extends VirtualViewportElement {
|
||||
class _VirtualListViewportElement extends VirtualViewportElement<_VirtualListViewport> {
|
||||
_VirtualListViewportElement(VirtualViewport widget) : super(widget);
|
||||
|
||||
_VirtualListViewport get widget => super.widget;
|
||||
|
||||
RenderList get renderObject => super.renderObject;
|
||||
|
||||
int get materializedChildBase => _materializedChildBase;
|
||||
@ -308,7 +306,7 @@ class ScrollableLazyList extends Scrollable {
|
||||
}
|
||||
|
||||
class _ScrollableLazyListState extends ScrollableState<ScrollableLazyList> {
|
||||
ScrollBehavior<double, double> createScrollBehavior() => new OverscrollBehavior();
|
||||
ScrollBehavior createScrollBehavior() => new OverscrollBehavior();
|
||||
ExtentScrollBehavior get scrollBehavior => super.scrollBehavior;
|
||||
|
||||
void _handleExtentsChanged(double contentExtent, double containerExtent) {
|
||||
|
@ -296,12 +296,12 @@ class _SemanticsDebuggerListener implements mojom.SemanticsListener {
|
||||
}
|
||||
entry.updateMessage();
|
||||
if (node.children != null) {
|
||||
Set<_SemanticsDebuggerEntry> oldChildren = new Set<_SemanticsDebuggerEntry>.from(entry.children ?? const <_SemanticsDebuggerEntry>[]);
|
||||
Set oldChildren = new Set<_SemanticsDebuggerEntry>.from(entry.children ?? const <_SemanticsDebuggerEntry>[]);
|
||||
entry.children?.clear();
|
||||
entry.children ??= new List<_SemanticsDebuggerEntry>();
|
||||
for (mojom.SemanticsNode child in node.children)
|
||||
entry.children.add(_updateNode(child));
|
||||
Set<_SemanticsDebuggerEntry> newChildren = new Set<_SemanticsDebuggerEntry>.from(entry.children);
|
||||
Set newChildren = new Set<_SemanticsDebuggerEntry>.from(entry.children);
|
||||
Set<_SemanticsDebuggerEntry> removedChildren = oldChildren.difference(newChildren);
|
||||
for (_SemanticsDebuggerEntry oldChild in removedChildren)
|
||||
nodes.remove(oldChild.id);
|
||||
|
@ -31,10 +31,8 @@ abstract class _WidgetProvider {
|
||||
/// This class is a building block for building a widget that has more children
|
||||
/// than it wishes to display at any given time. For example, [ScrollableList]
|
||||
/// uses this element to materialize only those children that are visible.
|
||||
abstract class VirtualViewportElement extends RenderObjectElement {
|
||||
VirtualViewportElement(VirtualViewport widget) : super(widget);
|
||||
|
||||
VirtualViewport get widget => super.widget;
|
||||
abstract class VirtualViewportElement<T extends VirtualViewport> extends RenderObjectElement<T> {
|
||||
VirtualViewportElement(T widget) : super(widget);
|
||||
|
||||
/// The index of the first child to materialize.
|
||||
int get materializedChildBase;
|
||||
@ -72,7 +70,7 @@ abstract class VirtualViewportElement extends RenderObjectElement {
|
||||
|
||||
List<Element> _materializedChildren = const <Element>[];
|
||||
|
||||
RenderVirtualViewport<dynamic> get renderObject => super.renderObject;
|
||||
RenderVirtualViewport get renderObject => super.renderObject;
|
||||
|
||||
void visitChildren(ElementVisitor visitor) {
|
||||
if (_materializedChildren == null)
|
||||
@ -96,8 +94,8 @@ abstract class VirtualViewportElement extends RenderObjectElement {
|
||||
super.unmount();
|
||||
}
|
||||
|
||||
void update(VirtualViewport newWidget) {
|
||||
VirtualViewport oldWidget = widget;
|
||||
void update(T newWidget) {
|
||||
T oldWidget = widget;
|
||||
_widgetProvider.didUpdateWidget(oldWidget, newWidget);
|
||||
super.update(newWidget);
|
||||
updateRenderObject(oldWidget);
|
||||
@ -109,7 +107,7 @@ abstract class VirtualViewportElement extends RenderObjectElement {
|
||||
renderObject.paintOffset = scrollOffsetToPixelDelta(widget.startOffset - startOffsetBase);
|
||||
}
|
||||
|
||||
void updateRenderObject(VirtualViewport oldWidget) {
|
||||
void updateRenderObject(T oldWidget) {
|
||||
renderObject.virtualChildCount = _widgetProvider.virtualChildCount;
|
||||
|
||||
if (startOffsetBase != null) {
|
||||
@ -163,7 +161,7 @@ abstract class VirtualViewportElement extends RenderObjectElement {
|
||||
for (int i = 0; i < count; ++i) {
|
||||
int childIndex = base + i;
|
||||
Widget child = _widgetProvider.getChild(childIndex);
|
||||
Key key = new ValueKey<Key>(child.key) ?? new ValueKey<int>(childIndex);
|
||||
Key key = new ValueKey(child.key ?? childIndex);
|
||||
newWidgets[i] = new RepaintBoundary(key: key, child: child);
|
||||
}
|
||||
_materializedChildren = updateChildren(_materializedChildren, newWidgets);
|
||||
|
@ -64,10 +64,10 @@ void main() {
|
||||
});
|
||||
|
||||
test("should not have a 0 sized colored Box", () {
|
||||
RenderBox coloredBox = new RenderDecoratedBox(
|
||||
var coloredBox = new RenderDecoratedBox(
|
||||
decoration: new BoxDecoration()
|
||||
);
|
||||
RenderBox paddingBox = new RenderPadding(padding: const EdgeDims.all(10.0),
|
||||
var paddingBox = new RenderPadding(padding: const EdgeDims.all(10.0),
|
||||
child: coloredBox);
|
||||
RenderBox root = new RenderDecoratedBox(
|
||||
decoration: new BoxDecoration(),
|
||||
|
@ -107,11 +107,11 @@ Widget buildImageAtRatio(String image, Key key, double ratio, bool inferSize) {
|
||||
);
|
||||
}
|
||||
|
||||
RenderImage getRenderImage(WidgetTester tester, Key key) {
|
||||
RenderImage getRenderImage(tester, Key key) {
|
||||
return tester.findElementByKey(key).renderObject;
|
||||
}
|
||||
|
||||
TestImage getTestImage(WidgetTester tester, Key key) {
|
||||
TestImage getTestImage(tester, Key key) {
|
||||
return getRenderImage(tester, key).image;
|
||||
}
|
||||
|
||||
|
@ -10,7 +10,7 @@ void main() {
|
||||
test('Verify that a BottomSheet can be rebuilt with ScaffoldFeatureController.setState()', () {
|
||||
testWidgets((WidgetTester tester) {
|
||||
final GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
|
||||
PersistentBottomSheetController<Null> bottomSheet;
|
||||
ScaffoldFeatureController bottomSheet;
|
||||
int buildCount = 0;
|
||||
|
||||
tester.pumpWidget(new MaterialApp(
|
||||
@ -24,7 +24,7 @@ void main() {
|
||||
}
|
||||
));
|
||||
|
||||
bottomSheet = scaffoldKey.currentState.showBottomSheet/*<Null>*/((_) {
|
||||
bottomSheet = scaffoldKey.currentState.showBottomSheet((_) {
|
||||
return new Builder(
|
||||
builder: (_) {
|
||||
buildCount += 1;
|
||||
|
@ -25,11 +25,10 @@ void main() {
|
||||
tester.pump();
|
||||
expect(tester.findText('BottomSheet'), isNull);
|
||||
|
||||
showModalBottomSheet/*<Null>*/(
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
builder: (BuildContext context) => new Text('BottomSheet')
|
||||
).then((Null result) {
|
||||
expect(result, isNull);
|
||||
).then((_) {
|
||||
showBottomSheetThenCalled = true;
|
||||
});
|
||||
|
||||
@ -46,7 +45,7 @@ void main() {
|
||||
tester.pump(new Duration(seconds: 1)); // frame after the animation (sheet has been removed)
|
||||
expect(tester.findText('BottomSheet'), isNull);
|
||||
|
||||
showModalBottomSheet/*<Null>*/(context: context, builder: (BuildContext context) => new Text('BottomSheet'));
|
||||
showModalBottomSheet(context: context, builder: (BuildContext context) => new Text('BottomSheet'));
|
||||
tester.pump(); // bottom sheet show animation starts
|
||||
tester.pump(new Duration(seconds: 1)); // animation done
|
||||
expect(tester.findText('BottomSheet'), isNotNull);
|
||||
|
@ -46,7 +46,7 @@ class TestOneChildLayoutDelegate extends OneChildLayoutDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
Widget buildFrame(OneChildLayoutDelegate delegate) {
|
||||
Widget buildFrame(delegate) {
|
||||
return new Center(child: new CustomOneChildLayout(delegate: delegate, child: new Container()));
|
||||
}
|
||||
|
||||
|
@ -15,19 +15,19 @@ void main() {
|
||||
routes: <String, RouteBuilder>{
|
||||
'/': (RouteArguments args) { return new Column(
|
||||
children: <Widget>[
|
||||
new Draggable<int>(
|
||||
new Draggable(
|
||||
data: 1,
|
||||
child: new Text('Source'),
|
||||
feedback: new Text('Dragging')
|
||||
),
|
||||
new DragTarget<int>(
|
||||
builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
|
||||
new DragTarget(
|
||||
builder: (context, data, rejects) {
|
||||
return new Container(
|
||||
height: 100.0,
|
||||
child: new Text('Target')
|
||||
);
|
||||
},
|
||||
onAccept: (int data) {
|
||||
onAccept: (data) {
|
||||
accepted.add(data);
|
||||
}
|
||||
),
|
||||
@ -78,7 +78,7 @@ void main() {
|
||||
routes: <String, RouteBuilder>{
|
||||
'/': (RouteArguments args) { return new Column(
|
||||
children: <Widget>[
|
||||
new Draggable<int>(
|
||||
new Draggable(
|
||||
data: 1,
|
||||
child: new Text('Source'),
|
||||
feedback: new Text('Dragging')
|
||||
@ -94,15 +94,15 @@ void main() {
|
||||
child: new Text('Button')
|
||||
)
|
||||
),
|
||||
new DragTarget<int>(
|
||||
builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
|
||||
new DragTarget(
|
||||
builder: (context, data, rejects) {
|
||||
return new IgnorePointer(
|
||||
child: new Container(
|
||||
child: new Text('Target')
|
||||
)
|
||||
);
|
||||
},
|
||||
onAccept: (int data) {
|
||||
onAccept: (data) {
|
||||
events.add('drop');
|
||||
}
|
||||
),
|
||||
@ -176,7 +176,7 @@ void main() {
|
||||
routes: <String, RouteBuilder>{
|
||||
'/': (RouteArguments args) { return new Column(
|
||||
children: <Widget>[
|
||||
new Draggable<int>(
|
||||
new Draggable(
|
||||
data: 1,
|
||||
child: new GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
@ -189,11 +189,11 @@ void main() {
|
||||
),
|
||||
feedback: new Text('Dragging')
|
||||
),
|
||||
new DragTarget<int>(
|
||||
builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
|
||||
new DragTarget(
|
||||
builder: (context, data, rejects) {
|
||||
return new Text('Target');
|
||||
},
|
||||
onAccept: (int data) {
|
||||
onAccept: (data) {
|
||||
events.add('drop');
|
||||
}
|
||||
),
|
||||
@ -237,16 +237,16 @@ void main() {
|
||||
routes: <String, RouteBuilder>{
|
||||
'/': (RouteArguments args) { return new Column(
|
||||
children: <Widget>[
|
||||
new LongPressDraggable<int>(
|
||||
new LongPressDraggable(
|
||||
data: 1,
|
||||
child: new Text('Source'),
|
||||
feedback: new Text('Dragging')
|
||||
),
|
||||
new DragTarget<int>(
|
||||
builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
|
||||
new DragTarget(
|
||||
builder: (context, data, rejects) {
|
||||
return new Text('Target');
|
||||
},
|
||||
onAccept: (int data) {
|
||||
onAccept: (data) {
|
||||
events.add('drop');
|
||||
}
|
||||
),
|
||||
@ -288,16 +288,16 @@ void main() {
|
||||
routes: <String, RouteBuilder>{
|
||||
'/': (RouteArguments args) { return new Column(
|
||||
children: <Widget>[
|
||||
new Draggable<int>(
|
||||
new Draggable(
|
||||
data: 1,
|
||||
child: new Text('Source'),
|
||||
feedback: new Text('Dragging')
|
||||
),
|
||||
new DragTarget<int>(
|
||||
builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
|
||||
new DragTarget(
|
||||
builder: (context, data, rejects) {
|
||||
return new Text('Target');
|
||||
},
|
||||
onAccept: (int data) {
|
||||
onAccept: (data) {
|
||||
events.add('drop');
|
||||
}
|
||||
),
|
||||
@ -341,21 +341,21 @@ void main() {
|
||||
'/': (RouteArguments args) {
|
||||
return new Block(
|
||||
children: <Widget>[
|
||||
new DragTarget<int>(
|
||||
builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
|
||||
new DragTarget(
|
||||
builder: (context, data, rejects) {
|
||||
return new Text('Target');
|
||||
},
|
||||
onAccept: (int data) {
|
||||
onAccept: (data) {
|
||||
events.add('drop $data');
|
||||
}
|
||||
),
|
||||
new Container(height: 400.0),
|
||||
new HorizontalDraggable<int>(
|
||||
new HorizontalDraggable(
|
||||
data: 1,
|
||||
child: new Text('H'),
|
||||
feedback: new Text('Dragging')
|
||||
),
|
||||
new VerticalDraggable<int>(
|
||||
new VerticalDraggable(
|
||||
data: 2,
|
||||
child: new Text('V'),
|
||||
feedback: new Text('Dragging')
|
||||
@ -453,21 +453,21 @@ void main() {
|
||||
return new Block(
|
||||
scrollDirection: Axis.horizontal,
|
||||
children: <Widget>[
|
||||
new DragTarget<int>(
|
||||
builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
|
||||
new DragTarget(
|
||||
builder: (context, data, rejects) {
|
||||
return new Text('Target');
|
||||
},
|
||||
onAccept: (int data) {
|
||||
onAccept: (data) {
|
||||
events.add('drop $data');
|
||||
}
|
||||
),
|
||||
new Container(width: 400.0),
|
||||
new HorizontalDraggable<int>(
|
||||
new HorizontalDraggable(
|
||||
data: 1,
|
||||
child: new Text('H'),
|
||||
feedback: new Text('Dragging')
|
||||
),
|
||||
new VerticalDraggable<int>(
|
||||
new VerticalDraggable(
|
||||
data: 2,
|
||||
child: new Text('V'),
|
||||
feedback: new Text('Dragging')
|
||||
|
@ -31,7 +31,7 @@ final Map<String, RouteBuilder> routes = <String, RouteBuilder>{
|
||||
),
|
||||
};
|
||||
|
||||
class ThreeRoute extends MaterialPageRoute<Null> {
|
||||
class ThreeRoute extends MaterialPageRoute {
|
||||
ThreeRoute() : super(builder: (BuildContext context) {
|
||||
return new Material(
|
||||
child: new Block(children: <Widget>[
|
||||
|
@ -69,7 +69,7 @@ void main() {
|
||||
tester.pumpWidget(new MaterialApp(routes: routes));
|
||||
|
||||
// Initially the barrier is not visible
|
||||
expect(tester.findElementByKey(const ValueKey<String>('barrier')), isNull);
|
||||
expect(tester.findElementByKey(const ValueKey('barrier')), isNull);
|
||||
|
||||
// Tapping on X routes to the barrier
|
||||
tester.tap(tester.findText('X'));
|
||||
@ -77,11 +77,11 @@ void main() {
|
||||
tester.pump(const Duration(seconds: 1)); // end transition
|
||||
|
||||
// Tap on the barrier to dismiss it
|
||||
tester.tap(tester.findElementByKey(const ValueKey<String>('barrier')));
|
||||
tester.tap(tester.findElementByKey(const ValueKey('barrier')));
|
||||
tester.pump(); // begin transition
|
||||
tester.pump(const Duration(seconds: 1)); // end transition
|
||||
|
||||
expect(tester.findElementByKey(const ValueKey<String>('barrier')), isNull,
|
||||
expect(tester.findElementByKey(const ValueKey('barrier')), isNull,
|
||||
reason: 'because the barrier was dismissed');
|
||||
});
|
||||
});
|
||||
@ -103,7 +103,7 @@ class FirstComponent extends StatelessComponent {
|
||||
class SecondComponent extends StatelessComponent {
|
||||
Widget build(BuildContext context) {
|
||||
return new ModalBarrier(
|
||||
key: const ValueKey<String>('barrier'),
|
||||
key: const ValueKey('barrier'),
|
||||
dismissable: true
|
||||
);
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ class SecondComponentState extends State<SecondComponent> {
|
||||
}
|
||||
}
|
||||
|
||||
typedef void ExceptionCallback(dynamic exception);
|
||||
typedef void ExceptionCallback(exception);
|
||||
|
||||
class ThirdComponent extends StatelessComponent {
|
||||
ThirdComponent({ this.targetKey, this.onException });
|
||||
@ -103,7 +103,7 @@ void main() {
|
||||
dynamic exception;
|
||||
Widget widget = new ThirdComponent(
|
||||
targetKey: targetKey,
|
||||
onException: (dynamic e) {
|
||||
onException: (e) {
|
||||
exception = e;
|
||||
}
|
||||
);
|
||||
|
@ -70,12 +70,12 @@ void main() {
|
||||
onGenerateRoute: (RouteSettings settings) {
|
||||
switch (settings.name) {
|
||||
case '/':
|
||||
return new TestRoute<Null>(
|
||||
return new TestRoute(
|
||||
settings: settings,
|
||||
child: new Builder(
|
||||
key: insideKey,
|
||||
builder: (BuildContext context) {
|
||||
PageRoute<Null> route = ModalRoute.of(context);
|
||||
PageRoute route = ModalRoute.of(context);
|
||||
return new Column(
|
||||
children: <Widget>[
|
||||
new TestTransition(
|
||||
@ -93,9 +93,9 @@ void main() {
|
||||
}
|
||||
)
|
||||
);
|
||||
case '/2': return new TestRoute<Null>(settings: settings, child: new Text('E'));
|
||||
case '/3': return new TestRoute<Null> (settings: settings, child: new Text('F'));
|
||||
case '/4': return new TestRoute<Null> (settings: settings, child: new Text('G'));
|
||||
case '/2': return new TestRoute(settings: settings, child: new Text('E'));
|
||||
case '/3': return new TestRoute(settings: settings, child: new Text('F'));
|
||||
case '/4': return new TestRoute(settings: settings, child: new Text('G'));
|
||||
}
|
||||
}
|
||||
)
|
||||
|
@ -8,7 +8,7 @@ import 'package:test/test.dart';
|
||||
|
||||
import 'test_matchers.dart';
|
||||
|
||||
class TestOverlayRoute extends OverlayRoute<Null> {
|
||||
class TestOverlayRoute extends OverlayRoute {
|
||||
List<WidgetBuilder> get builders => <WidgetBuilder>[ _build ];
|
||||
Widget _build(BuildContext context) => new Text('Overlay');
|
||||
}
|
||||
|
@ -28,9 +28,9 @@ void main() {
|
||||
key: navigatorKey,
|
||||
onGenerateRoute: (RouteSettings settings) {
|
||||
if (settings.name == '/')
|
||||
return new MaterialPageRoute<Null>(builder: (_) => new Container(child: new ThePositiveNumbers()));
|
||||
return new MaterialPageRoute(builder: (_) => new Container(child: new ThePositiveNumbers()));
|
||||
else if (settings.name == '/second')
|
||||
return new MaterialPageRoute<Null>(builder: (_) => new Container(child: new ThePositiveNumbers()));
|
||||
return new MaterialPageRoute(builder: (_) => new Container(child: new ThePositiveNumbers()));
|
||||
return null;
|
||||
}
|
||||
));
|
||||
@ -47,10 +47,9 @@ void main() {
|
||||
expect(tester.findText('10'), isNull);
|
||||
expect(tester.findText('100'), isNull);
|
||||
|
||||
StatefulComponentElement target =
|
||||
StatefulComponentElement<ScrollableLazyList, ScrollableState<ScrollableLazyList>> target =
|
||||
tester.findElement((Element element) => element.widget is ScrollableLazyList);
|
||||
ScrollableState targetState = target.state;
|
||||
targetState.scrollTo(1000.0);
|
||||
target.state.scrollTo(1000.0);
|
||||
tester.pump(new Duration(seconds: 1));
|
||||
|
||||
// we're 600 pixels high, each item is 100 pixels high, scroll position is
|
||||
|
@ -144,7 +144,7 @@ void main() {
|
||||
int snackBarCount = 0;
|
||||
Key tapTarget = new Key('tap-target');
|
||||
int time;
|
||||
ScaffoldFeatureController<SnackBar, Null> lastController;
|
||||
ScaffoldFeatureController<SnackBar> lastController;
|
||||
tester.pumpWidget(new MaterialApp(
|
||||
routes: <String, RouteBuilder>{
|
||||
'/': (RouteArguments args) {
|
||||
@ -176,7 +176,7 @@ void main() {
|
||||
expect(tester.findText('bar2'), isNull);
|
||||
time = 1000;
|
||||
tester.tap(tester.findElementByKey(tapTarget)); // queue bar1
|
||||
ScaffoldFeatureController<SnackBar, Null> firstController = lastController;
|
||||
ScaffoldFeatureController<SnackBar> firstController = lastController;
|
||||
time = 2;
|
||||
tester.tap(tester.findElementByKey(tapTarget)); // queue bar2
|
||||
expect(tester.findText('bar1'), isNull);
|
||||
|
@ -47,7 +47,7 @@ void set scrollOffset(double value) {
|
||||
scrollableState.scrollTo(value);
|
||||
}
|
||||
|
||||
Future<Null> fling(double velocity) {
|
||||
Future fling(double velocity) {
|
||||
return scrollableState.fling(velocity);
|
||||
}
|
||||
|
||||
|
@ -155,7 +155,7 @@ void main() {
|
||||
|
||||
Widget buildFrame(int index) {
|
||||
itemsPainted = <int>[];
|
||||
List<Widget> items = new List<Widget>.generate(itemCount, (int i) {
|
||||
List<Widget> items = new List<Widget>.generate(itemCount, (i) {
|
||||
return new CustomPaint(
|
||||
child: new Text('$i'),
|
||||
painter: new TestCallbackPainter(
|
||||
@ -188,7 +188,7 @@ void main() {
|
||||
|
||||
Widget buildFrame(int index) {
|
||||
itemsTapped = <int>[];
|
||||
List<Widget> items = new List<Widget>.generate(itemCount, (int i) {
|
||||
List<Widget> items = new List<Widget>.generate(itemCount, (i) {
|
||||
return new GestureDetector(child: new Text('$i'), onTap: () { itemsTapped.add(i); });
|
||||
});
|
||||
return new Center(child: new IndexedStack(children: items, key: key, index: index));
|
||||
|
@ -20,25 +20,25 @@ bool _hasAncestorOfType(Element element, Type targetType) {
|
||||
|
||||
class _IsOnStage extends Matcher {
|
||||
const _IsOnStage();
|
||||
bool matches(Element item, Map<dynamic, dynamic> matchState) => !_hasAncestorOfType(item, OffStage);
|
||||
bool matches(item, Map matchState) => !_hasAncestorOfType(item, OffStage);
|
||||
Description describe(Description description) => description.add('onstage');
|
||||
}
|
||||
|
||||
class _IsOffStage extends Matcher {
|
||||
const _IsOffStage();
|
||||
bool matches(Element item, Map<dynamic, dynamic> matchState) => _hasAncestorOfType(item, OffStage);
|
||||
bool matches(item, Map matchState) => _hasAncestorOfType(item, OffStage);
|
||||
Description describe(Description description) => description.add('offstage');
|
||||
}
|
||||
|
||||
class _IsInCard extends Matcher {
|
||||
const _IsInCard();
|
||||
bool matches(Element item, Map<dynamic, dynamic> matchState) => _hasAncestorOfType(item, Card);
|
||||
bool matches(item, Map matchState) => _hasAncestorOfType(item, Card);
|
||||
Description describe(Description description) => description.add('in card');
|
||||
}
|
||||
|
||||
class _IsNotInCard extends Matcher {
|
||||
const _IsNotInCard();
|
||||
bool matches(Element item, Map<dynamic, dynamic> matchState) => !_hasAncestorOfType(item, Card);
|
||||
bool matches(item, Map matchState) => !_hasAncestorOfType(item, Card);
|
||||
Description describe(Description description) => description.add('not in card');
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user