Unverified Commit 3f56178d authored by Greg Spencer's avatar Greg Spencer Committed by GitHub

Convert some more widget tests to NNBD (#68129)

parent f7ee4402
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/widgets.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
......@@ -29,12 +27,12 @@ void main() {
manager.doSerialization();
final _TestRestorableWidgetState state = tester.state(find.byType(_TestRestorableWidget));
expect(state.bucket.restorationId, id);
expect(state.bucket?.restorationId, id);
expect(rawData[childrenMapKey].containsKey(id), isTrue);
expect(state.property.value, 10);
expect(rawData[childrenMapKey][id][valuesMapKey]['foo'], 10);
expect(state.property.log, <String>['createDefaultValue', 'initWithValue', 'toPrimitives']);
expect(state.toogleBucketLog, isEmpty);
expect(state.toggleBucketLog, isEmpty);
expect(state.restoreStateLog.single, isNull);
});
......@@ -53,10 +51,10 @@ void main() {
manager.doSerialization();
final _TestRestorableWidgetState state = tester.state(find.byType(_TestRestorableWidget));
expect(state.bucket.restorationId, 'child1');
expect(state.bucket!.restorationId, 'child1');
expect(state.property.value, 22);
expect(state.property.log, <String>['fromPrimitives', 'initWithValue']);
expect(state.toogleBucketLog, isEmpty);
expect(state.toggleBucketLog, isEmpty);
expect(state.restoreStateLog.single, isNull);
});
......@@ -76,9 +74,9 @@ void main() {
// Claimed existing bucket with data.
final _TestRestorableWidgetState state = tester.state(find.byType(_TestRestorableWidget));
expect(state.bucket.restorationId, 'child1');
expect(state.bucket.read<int>('foo'), 22);
final RestorationBucket bucket = state.bucket;
expect(state.bucket!.restorationId, 'child1');
expect(state.bucket!.read<int>('foo'), 22);
final RestorationBucket bucket = state.bucket!;
state.property.log.clear();
state.restoreStateLog.clear();
......@@ -94,12 +92,12 @@ void main() {
);
manager.doSerialization();
expect(state.bucket.restorationId, 'something else');
expect(state.bucket.read<int>('foo'), 22);
expect(state.bucket!.restorationId, 'something else');
expect(state.bucket!.read<int>('foo'), 22);
expect(state.bucket, same(bucket));
expect(state.property.log, isEmpty);
expect(state.restoreStateLog, isEmpty);
expect(state.toogleBucketLog, isEmpty);
expect(state.toggleBucketLog, isEmpty);
});
testWidgets('renames existing bucket when didUpdateRestorationId is called', (WidgetTester tester) async {
......@@ -118,9 +116,9 @@ void main() {
// Claimed existing bucket with data.
final _TestRestorableWidgetState state = tester.state(find.byType(_TestRestorableWidget));
expect(state.bucket.restorationId, 'child1');
expect(state.bucket.read<int>('foo'), 22);
final RestorationBucket bucket = state.bucket;
expect(state.bucket!.restorationId, 'child1');
expect(state.bucket!.read<int>('foo'), 22);
final RestorationBucket bucket = state.bucket!;
state.property.log.clear();
state.restoreStateLog.clear();
......@@ -129,12 +127,12 @@ void main() {
state.injectId('newnewnew');
manager.doSerialization();
expect(state.bucket.restorationId, 'newnewnew');
expect(state.bucket.read<int>('foo'), 22);
expect(state.bucket!.restorationId, 'newnewnew');
expect(state.bucket!.read<int>('foo'), 22);
expect(state.bucket, same(bucket));
expect(state.property.log, isEmpty);
expect(state.restoreStateLog, isEmpty);
expect(state.toogleBucketLog, isEmpty);
expect(state.toggleBucketLog, isEmpty);
});
testWidgets('Disposing widget removes its data', (WidgetTester tester) async {
......@@ -185,9 +183,9 @@ void main() {
expect(state.property.log, <String>['createDefaultValue', 'initWithValue']);
state.property.log.clear();
expect(state.restoreStateLog.single, isNull);
expect(state.toogleBucketLog, isEmpty);
expect(state.toggleBucketLog, isEmpty);
state.restoreStateLog.clear();
state.toogleBucketLog.clear();
state.toggleBucketLog.clear();
// Change id to non-null.
await tester.pumpWidget(
......@@ -200,17 +198,17 @@ void main() {
);
manager.doSerialization();
expect(state.bucket, isNotNull);
expect(state.bucket.restorationId, 'child1');
expect(state.bucket!.restorationId, 'child1');
expect(state.property.value, 10);
expect(rawData[childrenMapKey]['child1'][valuesMapKey]['foo'], 10);
expect(state.property.log, <String>['toPrimitives']);
state.property.log.clear();
expect(state.restoreStateLog, isEmpty);
expect(state.toogleBucketLog.single, isNull);
expect(state.toggleBucketLog.single, isNull);
state.restoreStateLog.clear();
state.toogleBucketLog.clear();
state.toggleBucketLog.clear();
final RestorationBucket bucket = state.bucket;
final RestorationBucket bucket = state.bucket!;
// Change id back to null.
await tester.pumpWidget(
......@@ -226,7 +224,7 @@ void main() {
expect(rawData[childrenMapKey].containsKey('child1'), isFalse);
expect(state.property.log, isEmpty);
expect(state.restoreStateLog, isEmpty);
expect(state.toogleBucketLog.single, same(bucket));
expect(state.toggleBucketLog.single, same(bucket));
});
testWidgets('move in and out of scope', (WidgetTester tester) async {
......@@ -248,9 +246,9 @@ void main() {
expect(state.property.log, <String>['createDefaultValue', 'initWithValue']);
state.property.log.clear();
expect(state.restoreStateLog.single, isNull);
expect(state.toogleBucketLog, isEmpty);
expect(state.toggleBucketLog, isEmpty);
state.restoreStateLog.clear();
state.toogleBucketLog.clear();
state.toggleBucketLog.clear();
// Move it under a valid scope.
await tester.pumpWidget(
......@@ -264,17 +262,17 @@ void main() {
);
manager.doSerialization();
expect(state.bucket, isNotNull);
expect(state.bucket.restorationId, 'child1');
expect(state.bucket!.restorationId, 'child1');
expect(state.property.value, 10);
expect(rawData[childrenMapKey]['child1'][valuesMapKey]['foo'], 10);
expect(state.property.log, <String>['toPrimitives']);
state.property.log.clear();
expect(state.restoreStateLog, isEmpty);
expect(state.toogleBucketLog.single, isNull);
expect(state.toggleBucketLog.single, isNull);
state.restoreStateLog.clear();
state.toogleBucketLog.clear();
state.toggleBucketLog.clear();
final RestorationBucket bucket = state.bucket;
final RestorationBucket bucket = state.bucket!;
// Move out of scope again.
await tester.pumpWidget(
......@@ -288,7 +286,7 @@ void main() {
expect(rawData[childrenMapKey].containsKey('child1'), isFalse);
expect(state.property.log, isEmpty);
expect(state.restoreStateLog, isEmpty);
expect(state.toogleBucketLog.single, same(bucket));
expect(state.toggleBucketLog.single, same(bucket));
});
testWidgets('moving scope moves its data', (WidgetTester tester) async {
......@@ -316,13 +314,13 @@ void main() {
);
manager.doSerialization();
final _TestRestorableWidgetState state = tester.state(find.byType(_TestRestorableWidget));
expect(state.bucket.restorationId, 'moving-child');
expect(state.bucket!.restorationId, 'moving-child');
expect(rawData[childrenMapKey]['fixed'][childrenMapKey].containsKey('moving-child'), isTrue);
final RestorationBucket bucket = state.bucket;
final RestorationBucket bucket = state.bucket!;
state.property.log.clear();
state.restoreStateLog.clear();
state.bucket.write('value', 11);
state.bucket!.write('value', 11);
manager.doSerialization();
// Move widget.
......@@ -345,11 +343,11 @@ void main() {
),
);
manager.doSerialization();
expect(state.bucket.restorationId, 'moving-child');
expect(state.bucket!.restorationId, 'moving-child');
expect(state.bucket, same(bucket));
expect(state.bucket.read<int>('value'), 11);
expect(state.bucket!.read<int>('value'), 11);
expect(state.property.log, isEmpty);
expect(state.toogleBucketLog, isEmpty);
expect(state.toggleBucketLog, isEmpty);
expect(state.restoreStateLog, isEmpty);
expect(rawData[childrenMapKey]['fixed'], isEmpty);
......@@ -371,7 +369,7 @@ void main() {
expect(state.property.value, 10); // default
expect(state.property.log, <String>['createDefaultValue', 'initWithValue', 'toPrimitives']);
expect(state.restoreStateLog.single, isNull);
expect(state.toogleBucketLog, isEmpty);
expect(state.toggleBucketLog, isEmpty);
_clearLogs(state);
state.setProperties(() {
......@@ -381,7 +379,7 @@ void main() {
expect(state.property.value, 20);
expect(state.property.log, <String>['toPrimitives']);
expect(state.restoreStateLog, isEmpty);
expect(state.toogleBucketLog, isEmpty);
expect(state.toggleBucketLog, isEmpty);
_clearLogs(state);
final _TestRestorableWidgetState oldState = state;
......@@ -392,7 +390,7 @@ void main() {
expect(state.property.value, 20);
expect(state.property.log, <String>['fromPrimitives', 'initWithValue']);
expect(state.restoreStateLog.single, isNull);
expect(state.toogleBucketLog, isEmpty);
expect(state.toggleBucketLog, isEmpty);
});
testWidgets('restore while running', (WidgetTester tester) async {
......@@ -423,7 +421,7 @@ void main() {
_clearLogs(state);
final _TestRestorableWidgetState oldState = state;
final RestorationBucket oldBucket = oldState.bucket;
final RestorationBucket oldBucket = oldState.bucket!;
await tester.restoreFrom(data);
state = tester.state(find.byType(_TestRestorableWidget));
......@@ -431,7 +429,7 @@ void main() {
expect(state.property.value, 20);
expect(state.property.log, <String>['fromPrimitives', 'initWithValue']);
expect(state.restoreStateLog.single, oldBucket);
expect(state.toogleBucketLog, isEmpty);
expect(state.toggleBucketLog, isEmpty);
});
testWidgets('can register additional property outside of restoreState', (WidgetTester tester) async {
......@@ -446,28 +444,28 @@ void main() {
final _TestRestorableWidgetState state = tester.state(find.byType(_TestRestorableWidget));
state.registerAdditionalProperty();
expect(state.additionalProperty.value, 11);
expect(state.additionalProperty.log, <String>['createDefaultValue', 'initWithValue', 'toPrimitives']);
expect(state.additionalProperty!.value, 11);
expect(state.additionalProperty!.log, <String>['createDefaultValue', 'initWithValue', 'toPrimitives']);
state.setProperties(() {
state.additionalProperty.value = 33;
state.additionalProperty!.value = 33;
});
await tester.pump();
expect(state.additionalProperty.value, 33);
expect(state.additionalProperty!.value, 33);
final TestRestorationData data = await tester.getRestorationData();
state.setProperties(() {
state.additionalProperty.value = 44;
state.additionalProperty!.value = 44;
});
await tester.pump();
expect(state.additionalProperty.value, 44);
expect(state.additionalProperty!.value, 44);
_clearLogs(state);
await tester.restoreFrom(data);
expect(state, same(tester.state(find.byType(_TestRestorableWidget))));
expect(state.additionalProperty.value, 33);
expect(state.additionalProperty!.value, 33);
expect(state.property.log, <String>['fromPrimitives', 'initWithValue']);
});
......@@ -517,7 +515,7 @@ void main() {
});
await tester.pump();
expect(state.property.value, 30);
expect(state.bucket.read<int>('foo'), 30);
expect(state.bucket!.read<int>('foo'), 30);
_clearLogs(state);
state.setProperties(() {
......@@ -525,14 +523,14 @@ void main() {
});
await tester.pump();
expect(state.property.value, 30);
expect(state.bucket.contains('foo'), isFalse);
expect(state.bucket!.contains('foo'), isFalse);
expect(state.property.log, isEmpty);
state.setProperties(() {
state.property.value = 40;
});
await tester.pump();
expect(state.bucket.contains('foo'), isFalse);
expect(state.bucket!.contains('foo'), isFalse);
expect(state.property.log, isEmpty);
await tester.restartAndRestore();
......@@ -557,20 +555,20 @@ void main() {
state.property.enabled = false;
});
await tester.pump();
expect(state.bucket.contains('foo'), isFalse);
expect(state.bucket!.contains('foo'), isFalse);
state.setProperties(() {
state.property.value = 40;
});
await tester.pump();
expect(state.property.value, 40);
expect(state.bucket.contains('foo'), isFalse);
expect(state.bucket!.contains('foo'), isFalse);
expect(state.property.log, isEmpty);
state.setProperties(() {
state.property.enabled = true;
});
await tester.pump();
expect(state.bucket.read<int>('foo'), 40);
expect(state.bucket!.read<int>('foo'), 40);
expect(state.property.log, <String>['toPrimitives']);
await tester.restartAndRestore();
......@@ -591,18 +589,18 @@ void main() {
final _TestRestorableWidgetState state = tester.state(find.byType(_TestRestorableWidget));
state.registerAdditionalProperty();
await tester.pump();
expect(state.additionalProperty.value, 11);
expect(state.bucket.read<int>('additional'), 11);
expect(state.additionalProperty!.value, 11);
expect(state.bucket!.read<int>('additional'), 11);
state.unregisterAdditionalProperty();
await tester.pump();
expect(state.bucket.contains('additional'), isFalse);
expect(() => state.additionalProperty.value, throwsAssertionError); // No longer registered.
expect(state.bucket!.contains('additional'), isFalse);
expect(() => state.additionalProperty!.value, throwsAssertionError); // No longer registered.
// Can register the same property again.
state.registerAdditionalProperty();
await tester.pump();
expect(state.additionalProperty.value, 11);
expect(state.bucket.read<int>('additional'), 11);
expect(state.additionalProperty!.value, 11);
expect(state.bucket!.read<int>('additional'), 11);
});
testWidgets('Disposing a property unregisters it, but keeps data', (WidgetTester tester) async {
......@@ -617,20 +615,20 @@ void main() {
final _TestRestorableWidgetState state = tester.state(find.byType(_TestRestorableWidget));
state.registerAdditionalProperty();
await tester.pump();
expect(state.additionalProperty.value, 11);
expect(state.bucket.read<int>('additional'), 11);
expect(state.additionalProperty!.value, 11);
expect(state.bucket!.read<int>('additional'), 11);
state.additionalProperty.dispose();
state.additionalProperty!.dispose();
await tester.pump();
expect(state.bucket.read<int>('additional'), 11);
expect(state.bucket!.read<int>('additional'), 11);
// Can register property under same id again.
state.additionalProperty = _TestRestorableProperty(22);
state.registerAdditionalProperty();
await tester.pump();
expect(state.additionalProperty.value, 11); // Old value restored.
expect(state.bucket.read<int>('additional'), 11);
expect(state.additionalProperty!.value, 11); // Old value restored.
expect(state.bucket!.read<int>('additional'), 11);
});
test('RestorableProperty throws after disposed', () {
......@@ -642,16 +640,16 @@ void main() {
void _clearLogs(_TestRestorableWidgetState state) {
state.property.log.clear();
state.additionalProperty?.log?.clear();
state.additionalProperty?.log.clear();
state.restoreStateLog.clear();
state.toogleBucketLog.clear();
state.toggleBucketLog.clear();
}
class _TestRestorableWidget extends StatefulWidget {
const _TestRestorableWidget({Key key, this.restorationId}) : super(key: key);
const _TestRestorableWidget({Key? key, this.restorationId}) : super(key: key);
final String restorationId;
final String? restorationId;
@override
State<_TestRestorableWidget> createState() => _TestRestorableWidgetState();
......@@ -659,25 +657,24 @@ class _TestRestorableWidget extends StatefulWidget {
class _TestRestorableWidgetState extends State<_TestRestorableWidget> with RestorationMixin {
final _TestRestorableProperty property = _TestRestorableProperty(10);
_TestRestorableProperty additionalProperty;
_TestRestorableProperty? additionalProperty;
bool _rerigisterAdditionalProperty = false;
final List<RestorationBucket> restoreStateLog = <RestorationBucket>[];
final List<RestorationBucket> toogleBucketLog = <RestorationBucket>[];
final List<RestorationBucket?> restoreStateLog = <RestorationBucket>[];
final List<RestorationBucket?> toggleBucketLog = <RestorationBucket>[];
@override
void restoreState(RestorationBucket oldBucket, bool initialRestore) {
void restoreState(RestorationBucket? oldBucket, bool initialRestore) {
restoreStateLog.add(oldBucket);
registerForRestoration(property, 'foo');
if (_rerigisterAdditionalProperty && additionalProperty != null) {
registerForRestoration(additionalProperty, 'additional');
registerForRestoration(additionalProperty!, 'additional');
}
}
@override
void didToggleBucket(RestorationBucket oldBucket) {
toogleBucketLog.add(oldBucket);
void didToggleBucket(RestorationBucket? oldBucket) {
toggleBucketLog.add(oldBucket);
super.didToggleBucket(oldBucket);
}
......@@ -695,7 +692,7 @@ class _TestRestorableWidgetState extends State<_TestRestorableWidget> with Resto
void setProperties(VoidCallback fn) => setState(fn);
String _injectedId;
String? _injectedId;
void injectId(String id) {
_injectedId = id;
didUpdateRestorationId();
......@@ -703,12 +700,12 @@ class _TestRestorableWidgetState extends State<_TestRestorableWidget> with Resto
void registerAdditionalProperty({bool reregister = true}) {
additionalProperty ??= _TestRestorableProperty(11);
registerForRestoration(additionalProperty, 'additional');
registerForRestoration(additionalProperty!, 'additional');
_rerigisterAdditionalProperty = reregister;
}
void unregisterAdditionalProperty() {
unregisterFromRestoration(additionalProperty);
unregisterFromRestoration(additionalProperty!);
}
void registerPropertyUnderSameId() {
......@@ -716,7 +713,7 @@ class _TestRestorableWidgetState extends State<_TestRestorableWidget> with Resto
}
@override
String get restorationId => _injectedId ?? widget.restorationId;
String? get restorationId => _injectedId ?? widget.restorationId;
}
Map<String, dynamic> _createRawDataSet() {
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/widgets.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
......@@ -74,7 +72,7 @@ void main() {
manager.doSerialization();
final BucketSpyState state = tester.state(find.byType(BucketSpy));
expect(state.bucket.restorationId, id);
expect(state.bucket!.restorationId, id);
expect(rawData[childrenMapKey].containsKey(id), isTrue);
});
......@@ -94,8 +92,8 @@ void main() {
manager.doSerialization();
final BucketSpyState state = tester.state(find.byType(BucketSpy));
expect(state.bucket.restorationId, 'child1');
expect(state.bucket.read<int>('foo'), 22);
expect(state.bucket!.restorationId, 'child1');
expect(state.bucket!.read<int>('foo'), 22);
});
testWidgets('renames existing bucket when new ID is provided', (WidgetTester tester) async {
......@@ -115,9 +113,9 @@ void main() {
// Claimed existing bucket with data.
final BucketSpyState state = tester.state(find.byType(BucketSpy));
expect(state.bucket.restorationId, 'child1');
expect(state.bucket.read<int>('foo'), 22);
final RestorationBucket bucket = state.bucket;
expect(state.bucket!.restorationId, 'child1');
expect(state.bucket!.read<int>('foo'), 22);
final RestorationBucket bucket = state.bucket!;
// Rename the existing bucket.
await tester.pumpWidget(
......@@ -131,8 +129,8 @@ void main() {
);
manager.doSerialization();
expect(state.bucket.restorationId, 'something else');
expect(state.bucket.read<int>('foo'), 22);
expect(state.bucket!.restorationId, 'something else');
expect(state.bucket!.read<int>('foo'), 22);
expect(state.bucket, same(bucket));
});
......@@ -193,7 +191,7 @@ void main() {
);
manager.doSerialization();
expect(state.bucket, isNotNull);
expect(state.bucket.restorationId, 'foo');
expect(state.bucket!.restorationId, 'foo');
// Change id back to null.
await tester.pumpWidget(
......@@ -237,7 +235,7 @@ void main() {
);
manager.doSerialization();
expect(state.bucket, isNotNull);
expect(state.bucket.restorationId, 'foo');
expect(state.bucket!.restorationId, 'foo');
// Move out of scope again.
await tester.pumpWidget(
......@@ -288,11 +286,11 @@ void main() {
);
manager.doSerialization();
final BucketSpyState state = tester.state(find.byType(BucketSpy));
expect(state.bucket.restorationId, 'moving-child');
expect(state.bucket!.restorationId, 'moving-child');
expect(rawData[childrenMapKey]['fixed'][childrenMapKey].containsKey('moving-child'), isTrue);
final RestorationBucket bucket = state.bucket;
final RestorationBucket bucket = state.bucket!;
state.bucket.write('value', 11);
state.bucket!.write('value', 11);
manager.doSerialization();
// Move scope.
......@@ -316,9 +314,9 @@ void main() {
),
);
manager.doSerialization();
expect(state.bucket.restorationId, 'moving-child');
expect(state.bucket!.restorationId, 'moving-child');
expect(state.bucket, same(bucket));
expect(state.bucket.read<int>('value'), 11);
expect(state.bucket!.read<int>('value'), 11);
expect(rawData[childrenMapKey]['fixed'], isEmpty);
expect(rawData[childrenMapKey].containsKey('moving-child'), isTrue);
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
......@@ -123,13 +121,13 @@ class TestWidgetWithCounterChildState extends State<TestWidgetWithCounterChild>
int toggleCount = 0;
@override
void didToggleBucket(RestorationBucket oldBucket) {
void didToggleBucket(RestorationBucket? oldBucket) {
super.didToggleBucket(oldBucket);
toggleCount++;
}
@override
void restoreState(RestorationBucket oldBucket, bool initialRestore) {
void restoreState(RestorationBucket? oldBucket, bool initialRestore) {
registerForRestoration(childRestorationEnabled, 'childRestorationEnabled');
}
......@@ -163,7 +161,7 @@ class TestWidgetWithCounterChildState extends State<TestWidgetWithCounterChild>
class Counter extends StatefulWidget {
const Counter({this.restorationId});
final String restorationId;
final String? restorationId;
@override
State<Counter> createState() => CounterState();
......@@ -173,10 +171,10 @@ class CounterState extends State<Counter> with RestorationMixin {
final RestorableInt count = RestorableInt(0);
@override
String get restorationId => widget.restorationId;
String? get restorationId => widget.restorationId;
@override
void restoreState(RestorationBucket oldBucket, bool initialRestore) {
void restoreState(RestorationBucket? oldBucket, bool initialRestore) {
registerForRestoration(count, 'counter');
}
......@@ -202,20 +200,20 @@ class CounterState extends State<Counter> with RestorationMixin {
}
class TestWidget extends StatefulWidget {
const TestWidget({@required this.restorationId});
const TestWidget({required this.restorationId});
final String restorationId;
final String? restorationId;
@override
State<TestWidget> createState() => TestWidgetState();
}
class TestWidgetState extends State<TestWidget> with RestorationMixin {
List<RestorationBucket> buckets = <RestorationBucket>[];
List<RestorationBucket?> buckets = <RestorationBucket>[];
List<bool> flags = <bool>[];
@override
void restoreState(RestorationBucket oldBucket, bool initialRestore) {
void restoreState(RestorationBucket? oldBucket, bool initialRestore) {
buckets.add(oldBucket);
flags.add(initialRestore);
}
......@@ -223,13 +221,13 @@ class TestWidgetState extends State<TestWidget> with RestorationMixin {
int toggleCount = 0;
@override
void didToggleBucket(RestorationBucket oldBucket) {
void didToggleBucket(RestorationBucket? oldBucket) {
super.didToggleBucket(oldBucket);
toggleCount++;
}
@override
String get restorationId => widget.restorationId;
String? get restorationId => widget.restorationId;
@override
Widget build(BuildContext context) {
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:async';
import 'package:flutter/foundation.dart';
......@@ -44,7 +42,7 @@ void main() {
expect(binding.restorationManager.rootBucketAccessed, 0);
final BucketSpyState state = tester.state(find.byType(BucketSpy));
expect(state.bucket.restorationId, 'root-child');
expect(state.bucket!.restorationId, 'root-child');
expect(rawData[childrenMapKey].containsKey('root-child'), isTrue);
expect(find.text('Hello'), findsOneWidget);
......@@ -82,7 +80,7 @@ void main() {
expect(binding.firstFrameIsDeferred, isFalse);
final BucketSpyState state = tester.state(find.byType(BucketSpy));
expect(state.bucket.restorationId, 'root-child');
expect(state.bucket!.restorationId, 'root-child');
expect(rawData[childrenMapKey].containsKey('root-child'), isTrue);
});
......@@ -108,7 +106,7 @@ void main() {
expect(binding.firstFrameIsDeferred, isFalse);
final BucketSpyState state = tester.state(find.byType(BucketSpy));
expect(state.bucket.restorationId, 'root-child');
expect(state.bucket!.restorationId, 'root-child');
expect(rawData[childrenMapKey].containsKey('root-child'), isTrue);
});
......@@ -158,7 +156,7 @@ void main() {
expect(binding.restorationManager.rootBucketAccessed, 1);
expect(find.text('Hello'), findsOneWidget);
expect(state.bucket.restorationId, 'root-child');
expect(state.bucket!.restorationId, 'root-child');
// Change ID back to null.
await tester.pumpWidget(
......@@ -203,7 +201,7 @@ void main() {
expect(binding.restorationManager.rootBucketAccessed, 0);
expect(find.text('Hello'), findsOneWidget);
final BucketSpyState state = tester.state(find.byType(BucketSpy));
expect(state.bucket.restorationId, 'root-child');
expect(state.bucket!.restorationId, 'root-child');
expect(inScopeRawData[childrenMapKey].containsKey('root-child'), isTrue);
// Move out of scope.
......@@ -232,7 +230,7 @@ void main() {
expect(binding.restorationManager.rootBucketAccessed, 1);
expect(find.text('Hello'), findsOneWidget);
expect(state.bucket.restorationId, 'root-child');
expect(state.bucket!.restorationId, 'root-child');
expect(outOfScopeRawData[childrenMapKey].containsKey('root-child'), isTrue);
expect(inScopeRawData, isEmpty);
......@@ -255,7 +253,7 @@ void main() {
expect(binding.restorationManager.rootBucketAccessed, 1);
expect(find.text('Hello'), findsOneWidget);
expect(state.bucket.restorationId, 'root-child');
expect(state.bucket!.restorationId, 'root-child');
expect(outOfScopeRawData, isEmpty);
expect(inScopeRawData[childrenMapKey].containsKey('root-child'), isTrue);
});
......@@ -280,9 +278,9 @@ void main() {
expect(binding.restorationManager.rootBucketAccessed, 1);
expect(find.text('Hello'), findsOneWidget);
final BucketSpyState state = tester.state(find.byType(BucketSpy));
state.bucket.write('foo', 42);
state.bucket!.write('foo', 42);
expect(firstRawData[childrenMapKey]['root-child'][valuesMapKey]['foo'], 42);
final RestorationBucket firstBucket = state.bucket;
final RestorationBucket firstBucket = state.bucket!;
// Replace with new root.
final Map<String, dynamic> secondRawData = <String, dynamic>{
......@@ -300,7 +298,7 @@ void main() {
firstRoot.dispose();
expect(state.bucket, isNot(same(firstBucket)));
expect(state.bucket.read<int>('foo'), 22);
expect(state.bucket!.read<int>('foo'), 22);
});
testWidgets('injects null when rootBucket is null', (WidgetTester tester) async {
......@@ -361,7 +359,7 @@ void main() {
final BucketSpyState state = tester.state(find.byType(BucketSpy));
expect(state.bucket, isNotNull);
binding.restorationManager.rootBucket = SynchronousFuture<RestorationBucket>(null);
binding.restorationManager.rootBucket = SynchronousFuture<RestorationBucket?>(null);
await tester.pump();
root.dispose();
......@@ -372,7 +370,7 @@ void main() {
}
class TestAutomatedTestWidgetsFlutterBinding extends AutomatedTestWidgetsFlutterBinding {
MockRestorationManager _restorationManager;
late MockRestorationManager _restorationManager;
@override
MockRestorationManager get restorationManager => _restorationManager;
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
@TestOn('chrome')
import 'dart:ui';
......@@ -14,7 +12,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class OnTapPage extends StatelessWidget {
const OnTapPage({Key key, this.id, this.onTap}) : super(key: key);
const OnTapPage({Key? key, required this.id, required this.onTap}) : super(key: key);
final String id;
final VoidCallback onTap;
......@@ -28,7 +26,7 @@ class OnTapPage extends StatelessWidget {
behavior: HitTestBehavior.opaque,
child: Container(
child: Center(
child: Text(id, style: Theme.of(context).textTheme.headline3),
child: Text(id, style: Theme.of(context)!.textTheme.headline3),
),
),
),
......@@ -271,7 +269,7 @@ void main() {
final SimpleRouterDelegate delegate = SimpleRouterDelegate(
reportConfiguration: true,
builder: (BuildContext context, RouteInformation information) {
return Text(information.location);
return Text(information.location!);
}
);
......@@ -323,24 +321,24 @@ class SimpleRouteInformationParser extends RouteInformationParser<RouteInformati
class SimpleRouterDelegate extends RouterDelegate<RouteInformation> with ChangeNotifier {
SimpleRouterDelegate({
@required this.builder,
required this.builder,
this.onPopRoute,
this.reportConfiguration = false,
});
RouteInformation get routeInformation => _routeInformation;
RouteInformation _routeInformation;
late RouteInformation _routeInformation;
set routeInformation(RouteInformation newValue) {
_routeInformation = newValue;
notifyListeners();
}
SimpleRouterDelegateBuilder builder;
SimpleRouterDelegatePopRoute onPopRoute;
SimpleRouterDelegatePopRoute? onPopRoute;
final bool reportConfiguration;
@override
RouteInformation get currentConfiguration {
RouteInformation? get currentConfiguration {
if (reportConfiguration)
return routeInformation;
return null;
......@@ -355,7 +353,7 @@ class SimpleRouterDelegate extends RouterDelegate<RouteInformation> with ChangeN
@override
Future<bool> popRoute() {
if (onPopRoute != null)
return onPopRoute();
return onPopRoute!();
return SynchronousFuture<bool>(true);
}
......@@ -364,7 +362,7 @@ class SimpleRouterDelegate extends RouterDelegate<RouteInformation> with ChangeN
}
class TestPage extends Page<void> {
const TestPage({LocalKey key, String name}) : super(key: key, name: name);
const TestPage({LocalKey? key, String? name}) : super(key: key, name: name);
@override
Route<void> createRoute(BuildContext context) {
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/foundation.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
......@@ -20,8 +18,8 @@ void main() {
routeInformationProvider: provider,
routeInformationParser: SimpleRouteInformationParser(),
routerDelegate: SimpleRouterDelegate(
builder: (BuildContext context, RouteInformation information) {
return Text(information.location);
builder: (BuildContext context, RouteInformation? information) {
return Text(information!.location!);
}
),
)
......@@ -43,10 +41,10 @@ void main() {
);
final SimpleAsyncRouteInformationParser parser = SimpleAsyncRouteInformationParser();
final SimpleAsyncRouterDelegate delegate = SimpleAsyncRouterDelegate(
builder: (BuildContext context, RouteInformation information) {
builder: (BuildContext context, RouteInformation? information) {
if (information == null)
return const Text('waiting');
return Text(information.location);
return Text(information.location!);
}
);
await tester.runAsync(() async {
......@@ -84,10 +82,10 @@ void main() {
await tester.pumpWidget(buildBoilerPlate(
Text('dummy', key: key)
));
final BuildContext textContext = key.currentContext;
final BuildContext textContext = key.currentContext!;
// This should not throw error.
Router<dynamic> router = Router.of(textContext, nullOk: true);
Router<dynamic>? router = Router.of(textContext, nullOk: true);
expect(router, isNull);
// Test when the nullOk is not specified.
......@@ -113,8 +111,8 @@ void main() {
routeInformationProvider: provider,
routeInformationParser: SimpleRouteInformationParser(),
routerDelegate: SimpleRouterDelegate(
builder: (BuildContext context, RouteInformation information) {
return Text(information.location);
builder: (BuildContext context, RouteInformation? information) {
return Text(information!.location!);
},
onPopRoute: () {
provider.value = const RouteInformation(
......@@ -149,8 +147,8 @@ void main() {
Router<RouteInformation>(
routeInformationProvider: provider,
routerDelegate: SimpleRouterDelegate(
builder: (BuildContext context, RouteInformation information) {
return Text(information.location);
builder: (BuildContext context, RouteInformation? information) {
return Text(information!.location!);
},
),
);
......@@ -169,8 +167,8 @@ void main() {
Router<RouteInformation>(
routeInformationParser: SimpleRouteInformationParser(),
routerDelegate: SimpleRouterDelegate(
builder: (BuildContext context, RouteInformation information) {
return Text(information.location);
builder: (BuildContext context, RouteInformation? information) {
return Text(information!.location!);
},
),
);
......@@ -191,8 +189,8 @@ void main() {
);
final BackButtonDispatcher dispatcher = RootBackButtonDispatcher();
final SimpleNavigatorRouterDelegate delegate = SimpleNavigatorRouterDelegate(
builder: (BuildContext context, RouteInformation information) {
return Text(information.location);
builder: (BuildContext context, RouteInformation? information) {
return Text(information!.location!);
},
onPopPage: (Route<void> route, void result) {
provider.value = const RouteInformation(
......@@ -214,7 +212,7 @@ void main() {
// Pushes a nameless route.
showDialog<void>(
useRootNavigator: false,
context: delegate.navigatorKey.currentContext,
context: delegate.navigatorKey.currentContext!,
builder: (BuildContext context) => const Text('dialog')
);
await tester.pumpAndSettle();
......@@ -249,15 +247,15 @@ void main() {
routeInformationProvider: provider,
routeInformationParser: SimpleRouteInformationParser(),
routerDelegate: SimpleRouterDelegate(
builder: (BuildContext context, RouteInformation information) {
builder: (BuildContext context, RouteInformation? information) {
final BackButtonDispatcher innerDispatcher = ChildBackButtonDispatcher(outerDispatcher);
innerDispatcher.takePriority();
// Creates the sub-router.
return Router<RouteInformation>(
backButtonDispatcher: innerDispatcher,
routerDelegate: SimpleRouterDelegate(
builder: (BuildContext context, RouteInformation innerInformation) {
return Text(information.location);
builder: (BuildContext context, RouteInformation? innerInformation) {
return Text(information!.location!);
},
onPopRoute: () {
provider.value = const RouteInformation(
......@@ -301,15 +299,15 @@ void main() {
routeInformationProvider: provider,
routeInformationParser: SimpleRouteInformationParser(),
routerDelegate: SimpleRouterDelegate(
builder: (BuildContext context, RouteInformation information) {
builder: (BuildContext context, RouteInformation? information) {
// Creates the sub-router.
return Column(
children: <Widget>[
Text(information.location),
Text(information!.location!),
Router<RouteInformation>(
backButtonDispatcher: innerDispatcher1,
routerDelegate: SimpleRouterDelegate(
builder: (BuildContext context, RouteInformation innerInformation) {
builder: (BuildContext context, RouteInformation? innerInformation) {
return Container();
},
onPopRoute: () {
......@@ -323,7 +321,7 @@ void main() {
Router<RouteInformation>(
backButtonDispatcher: innerDispatcher2,
routerDelegate: SimpleRouterDelegate(
builder: (BuildContext context, RouteInformation innerInformation) {
builder: (BuildContext context, RouteInformation? innerInformation) {
return Container();
},
onPopRoute: () {
......@@ -373,7 +371,7 @@ void main() {
});
testWidgets('router does report URL change correctly', (WidgetTester tester) async {
RouteInformation reportedRouteInformation;
RouteInformation? reportedRouteInformation;
final SimpleRouteInformationProvider provider = SimpleRouteInformationProvider(
onRouterReport: (RouteInformation information) {
// Makes sure we only report once after manually cleaning up.
......@@ -383,8 +381,8 @@ void main() {
);
final SimpleRouterDelegate delegate = SimpleRouterDelegate(
reportConfiguration: true,
builder: (BuildContext context, RouteInformation information) {
return Text(information.location);
builder: (BuildContext context, RouteInformation? information) {
return Text(information!.location!);
}
);
delegate.onPopRoute = () {
......@@ -415,7 +413,7 @@ void main() {
await tester.pump();
expect(find.text('initial'), findsNothing);
expect(find.text('update'), findsOneWidget);
expect(reportedRouteInformation.location, 'update');
expect(reportedRouteInformation!.location, 'update');
// The router should not report if only state changes.
reportedRouteInformation = null;
......@@ -433,13 +431,13 @@ void main() {
expect(result, isTrue);
await tester.pump();
expect(find.text('popped'), findsOneWidget);
expect(reportedRouteInformation.location, 'popped');
expect(reportedRouteInformation!.location, 'popped');
});
testWidgets('router can be forced to recognize or ignore navigating events', (WidgetTester tester) async {
RouteInformation reportedRouteInformation;
RouteInformation? reportedRouteInformation;
bool isNavigating = false;
RouteInformation nextRouteInformation;
late RouteInformation nextRouteInformation;
final SimpleRouteInformationProvider provider = SimpleRouteInformationProvider(
onRouterReport: (RouteInformation information) {
// Makes sure we only report once after manually cleaning up.
......@@ -451,9 +449,9 @@ void main() {
location: 'initial',
);
final SimpleRouterDelegate delegate = SimpleRouterDelegate(reportConfiguration: true);
delegate.builder = (BuildContext context, RouteInformation information) {
delegate.builder = (BuildContext context, RouteInformation? information) {
return ElevatedButton(
child: Text(information.location),
child: Text(information!.location!),
onPressed: () {
if (isNavigating) {
Router.navigate(context, () {
......@@ -497,11 +495,11 @@ void main() {
// report a route information because isNavigating = true.
await tester.tap(find.byType(ElevatedButton));
await tester.pump();
expect(reportedRouteInformation.location, 'update');
expect(reportedRouteInformation!.location, 'update');
});
testWidgets('router does not report when route information is up to date with route information provider', (WidgetTester tester) async {
RouteInformation reportedRouteInformation;
RouteInformation? reportedRouteInformation;
final SimpleRouteInformationProvider provider = SimpleRouteInformationProvider(
onRouterReport: (RouteInformation information) {
reportedRouteInformation = information;
......@@ -511,8 +509,8 @@ void main() {
location: 'initial',
);
final SimpleRouterDelegate delegate = SimpleRouterDelegate(reportConfiguration: true);
delegate.builder = (BuildContext context, RouteInformation routeInformation) {
return Text(routeInformation.location);
delegate.builder = (BuildContext context, RouteInformation? routeInformation) {
return Text(routeInformation!.location!);
};
await tester.pumpWidget(buildBoilerPlate(
......@@ -546,10 +544,10 @@ void main() {
),
);
final SimpleRouterDelegate delegate = SimpleRouterDelegate(
builder: (BuildContext context, RouteInformation information) {
builder: (BuildContext context, RouteInformation? information) {
final List<Widget> children = <Widget>[];
if (information.location != null)
children.add(Text(information.location));
if (information!.location! != null)
children.add(Text(information.location!));
if (information.state != null)
children.add(Text(information.state.toString()));
return Column(
......@@ -573,7 +571,7 @@ void main() {
final ByteData routerMessage = const JSONMethodCodec().encodeMethodCall(
const MethodCall('pushRouteInformation', testRouteInformation)
);
await ServicesBinding.instance.defaultBinaryMessenger.handlePlatformMessage('flutter/navigation', routerMessage, (_) { });
await ServicesBinding.instance!.defaultBinaryMessenger.handlePlatformMessage('flutter/navigation', routerMessage, (_) { });
await tester.pump();
expect(find.text('testRouteName'), findsOneWidget);
expect(find.text('state'), findsOneWidget);
......@@ -582,7 +580,7 @@ void main() {
const String testRouteName = 'newTestRouteName';
final ByteData message = const JSONMethodCodec().encodeMethodCall(
const MethodCall('pushRoute', testRouteName));
await ServicesBinding.instance.defaultBinaryMessenger.handlePlatformMessage('flutter/navigation', message, (_) { });
await ServicesBinding.instance!.defaultBinaryMessenger.handlePlatformMessage('flutter/navigation', message, (_) { });
await tester.pump();
expect(find.text('newTestRouteName'), findsOneWidget);
});
......@@ -596,8 +594,8 @@ void main() {
);
final SimpleRouterDelegate delegate = SimpleRouterDelegate(
reportConfiguration: true,
builder: (BuildContext context, RouteInformation information) {
return Text(information.location);
builder: (BuildContext context, RouteInformation? information) {
return Text(information!.location!);
}
);
delegate.onPopRoute = () {
......@@ -617,7 +615,7 @@ void main() {
// Pop route through the message channel.
final ByteData message = const JSONMethodCodec().encodeMethodCall(const MethodCall('popRoute'));
await ServicesBinding.instance.defaultBinaryMessenger.handlePlatformMessage('flutter/navigation', message, (_) { });
await ServicesBinding.instance!.defaultBinaryMessenger.handlePlatformMessage('flutter/navigation', message, (_) { });
await tester.pump();
expect(find.text('popped'), findsOneWidget);
});
......@@ -631,7 +629,7 @@ Widget buildBoilerPlate(Widget child) {
);
}
typedef SimpleRouterDelegateBuilder = Widget Function(BuildContext, RouteInformation);
typedef SimpleRouterDelegateBuilder = Widget Function(BuildContext, RouteInformation?);
typedef SimpleRouterDelegatePopRoute = Future<bool> Function();
typedef SimpleNavigatorRouterDelegatePopPage<T> = bool Function(Route<T> route, T result);
typedef RouterReportRouterInformation = void Function(RouteInformation);
......@@ -657,19 +655,19 @@ class SimpleRouterDelegate extends RouterDelegate<RouteInformation> with ChangeN
this.reportConfiguration = false,
});
RouteInformation get routeInformation => _routeInformation;
RouteInformation _routeInformation;
set routeInformation(RouteInformation newValue) {
RouteInformation? get routeInformation => _routeInformation;
RouteInformation? _routeInformation;
set routeInformation(RouteInformation? newValue) {
_routeInformation = newValue;
notifyListeners();
}
SimpleRouterDelegateBuilder builder;
SimpleRouterDelegatePopRoute onPopRoute;
SimpleRouterDelegateBuilder? builder;
SimpleRouterDelegatePopRoute? onPopRoute;
final bool reportConfiguration;
@override
RouteInformation get currentConfiguration {
RouteInformation? get currentConfiguration {
if (reportConfiguration)
return routeInformation;
return null;
......@@ -683,26 +681,24 @@ class SimpleRouterDelegate extends RouterDelegate<RouteInformation> with ChangeN
@override
Future<bool> popRoute() {
if (onPopRoute != null)
return onPopRoute();
return SynchronousFuture<bool>(true);
return onPopRoute?.call() ?? SynchronousFuture<bool>(true);
}
@override
Widget build(BuildContext context) => builder(context, routeInformation);
Widget build(BuildContext context) => builder!(context, routeInformation);
}
class SimpleNavigatorRouterDelegate extends RouterDelegate<RouteInformation> with PopNavigatorRouterDelegateMixin<RouteInformation>, ChangeNotifier {
SimpleNavigatorRouterDelegate({
@required this.builder,
this.onPopPage,
required this.builder,
required this.onPopPage,
});
@override
GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
RouteInformation get routeInformation => _routeInformation;
RouteInformation _routeInformation;
late RouteInformation _routeInformation;
set routeInformation(RouteInformation newValue) {
_routeInformation = newValue;
notifyListeners();
......@@ -733,7 +729,7 @@ class SimpleNavigatorRouterDelegate extends RouterDelegate<RouteInformation> wit
child: Text('base'),
),
MaterialPage<void>(
key: ValueKey<String>(routeInformation?.location),
key: ValueKey<String>(routeInformation.location!),
child: builder(context, routeInformation),
)
],
......@@ -746,11 +742,11 @@ class SimpleRouteInformationProvider extends RouteInformationProvider with Chang
this.onRouterReport
});
RouterReportRouterInformation onRouterReport;
RouterReportRouterInformation? onRouterReport;
@override
RouteInformation get value => _value;
RouteInformation _value;
late RouteInformation _value;
set value(RouteInformation newValue) {
_value = newValue;
notifyListeners();
......@@ -758,15 +754,14 @@ class SimpleRouteInformationProvider extends RouteInformationProvider with Chang
@override
void routerReportsNewRouteInformation(RouteInformation routeInformation) {
if (onRouterReport != null)
onRouterReport(routeInformation);
onRouterReport?.call(routeInformation);
}
}
class SimpleAsyncRouteInformationParser extends RouteInformationParser<RouteInformation> {
SimpleAsyncRouteInformationParser();
Future<RouteInformation> parsingFuture;
late Future<RouteInformation> parsingFuture;
@override
Future<RouteInformation> parseRouteInformation(RouteInformation information) {
......@@ -781,18 +776,18 @@ class SimpleAsyncRouteInformationParser extends RouteInformationParser<RouteInfo
class SimpleAsyncRouterDelegate extends RouterDelegate<RouteInformation> with ChangeNotifier{
SimpleAsyncRouterDelegate({
@required this.builder,
required this.builder,
});
RouteInformation get routeInformation => _routeInformation;
RouteInformation _routeInformation;
set routeInformation(RouteInformation newValue) {
RouteInformation? get routeInformation => _routeInformation;
RouteInformation? _routeInformation;
set routeInformation(RouteInformation? newValue) {
_routeInformation = newValue;
notifyListeners();
}
SimpleRouterDelegateBuilder builder;
Future<void> setNewRouteFuture;
late Future<void> setNewRouteFuture;
@override
Future<void> setNewRoutePath(RouteInformation configuration) {
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/foundation.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
......@@ -37,7 +35,7 @@ void main() {
const Key child1Key = Key('child1');
const Key child2Key = Key('child2');
final FlutterExceptionHandler oldHandler = FlutterError.onError;
final FlutterExceptionHandler? oldHandler = FlutterError.onError;
dynamic exception;
FlutterError.onError = (FlutterErrorDetails details) {
exception ??= details.exception;
......@@ -68,7 +66,7 @@ void main() {
const Key child1Key = Key('child1');
const Key child2Key = Key('child2');
final FlutterExceptionHandler oldHandler = FlutterError.onError;
final FlutterExceptionHandler? oldHandler = FlutterError.onError;
dynamic exception;
FlutterError.onError = (FlutterErrorDetails details) {
exception ??= details.exception;
......@@ -98,7 +96,7 @@ void main() {
const Key child0Key = Key('child0');
const Key child1Key = Key('child1');
final FlutterExceptionHandler oldHandler = FlutterError.onError;
final FlutterExceptionHandler? oldHandler = FlutterError.onError;
dynamic exception;
FlutterError.onError = (FlutterErrorDetails details) {
exception ??= details.exception;
......@@ -129,7 +127,7 @@ void main() {
const Key child1Key = Key('child1');
const Key child2Key = Key('child2');
final FlutterExceptionHandler oldHandler = FlutterError.onError;
final FlutterExceptionHandler? oldHandler = FlutterError.onError;
dynamic exception;
FlutterError.onError = (FlutterErrorDetails details) {
exception ??= details.exception;
......@@ -161,7 +159,7 @@ void main() {
const Key child1Key = Key('child1');
const Key child2Key = Key('child2');
final FlutterExceptionHandler oldHandler = FlutterError.onError;
final FlutterExceptionHandler? oldHandler = FlutterError.onError;
dynamic exception;
FlutterError.onError = (FlutterErrorDetails details) {
exception ??= details.exception;
......@@ -194,7 +192,7 @@ void main() {
const Key child2Key = Key('child2');
const Key child3Key = Key('child3');
final FlutterExceptionHandler oldHandler = FlutterError.onError;
final FlutterExceptionHandler? oldHandler = FlutterError.onError;
dynamic exception;
FlutterError.onError = (FlutterErrorDetails details) {
exception ??= details.exception;
......@@ -227,7 +225,7 @@ void main() {
const Key child1Key = Key('child1');
const Key child2Key = Key('child2');
final FlutterExceptionHandler oldHandler = FlutterError.onError;
final FlutterExceptionHandler? oldHandler = FlutterError.onError;
dynamic exception;
FlutterError.onError = (FlutterErrorDetails details) {
exception ??= details.exception;
......@@ -258,7 +256,7 @@ void main() {
const Key child0Key = Key('child0');
const Key child1Key = Key('child1');
final FlutterExceptionHandler oldHandler = FlutterError.onError;
final FlutterExceptionHandler? oldHandler = FlutterError.onError;
dynamic exception;
FlutterError.onError = (FlutterErrorDetails details) {
exception ??= details.exception;
......@@ -344,19 +342,19 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(0.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(600.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(100.0));
renderBox = tester.renderObject(find.byKey(child2Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(700.0));
expect(OrderPainter.log, <int>[1, 2, 3]);
......@@ -394,19 +392,19 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(0.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(100.0));
renderBox = tester.renderObject(find.byKey(child2Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(200.0));
expect(OrderPainter.log, <int>[1, 2, 3]);
......@@ -442,13 +440,13 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(300.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(400.0));
expect(OrderPainter.log, <int>[1, 2]);
......@@ -486,19 +484,19 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(500.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(600.0));
renderBox = tester.renderObject(find.byKey(child2Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(700.0));
expect(OrderPainter.log, <int>[1, 2, 3]);
......@@ -536,19 +534,19 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(0.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(350.0));
renderBox = tester.renderObject(find.byKey(child2Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(700.0));
expect(OrderPainter.log, <int>[1, 2, 3]);
......@@ -588,25 +586,25 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(50.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(250.0));
renderBox = tester.renderObject(find.byKey(child2Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(450.0));
renderBox = tester.renderObject(find.byKey(child3Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(650.0));
expect(OrderPainter.log, <int>[1, 2, 3, 4]);
......@@ -644,19 +642,19 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(200.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(50.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(200.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(300.0));
renderBox = tester.renderObject(find.byKey(child2Key));
expect(renderBox.size.width, equals(200.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(550.0));
expect(OrderPainter.log, <int>[1, 2, 3]);
......@@ -692,13 +690,13 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(0.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(150.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(100.0));
expect(OrderPainter.log, <int>[1, 2]);
......@@ -767,19 +765,19 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(700.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(600.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(100.0));
renderBox = tester.renderObject(find.byKey(child2Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(0.0));
expect(OrderPainter.log, <int>[1, 2, 3]);
......@@ -817,19 +815,19 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(700.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(600.0));
renderBox = tester.renderObject(find.byKey(child2Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(500.0));
expect(OrderPainter.log, <int>[1, 2, 3]);
......@@ -865,13 +863,13 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(400.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(300.0));
expect(OrderPainter.log, <int>[1, 2]);
......@@ -909,19 +907,19 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(200.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(100.0));
renderBox = tester.renderObject(find.byKey(child2Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(0.0));
expect(OrderPainter.log, <int>[1, 2, 3]);
......@@ -959,19 +957,19 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(700.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(350.0));
renderBox = tester.renderObject(find.byKey(child2Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(0.0));
expect(OrderPainter.log, <int>[1, 2, 3]);
......@@ -1011,25 +1009,25 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(650.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(450.0));
renderBox = tester.renderObject(find.byKey(child2Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(250.0));
renderBox = tester.renderObject(find.byKey(child3Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(50.0));
expect(OrderPainter.log, <int>[1, 2, 3, 4]);
......@@ -1067,19 +1065,19 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(200.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(550.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(200.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(300.0));
renderBox = tester.renderObject(find.byKey(child2Key));
expect(renderBox.size.width, equals(200.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(50.0));
expect(OrderPainter.log, <int>[1, 2, 3]);
......@@ -1115,13 +1113,13 @@ void main() {
renderBox = tester.renderObject(find.byKey(child0Key));
expect(renderBox.size.width, equals(100.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(150.0));
renderBox = tester.renderObject(find.byKey(child1Key));
expect(renderBox.size.width, equals(150.0));
expect(renderBox.size.height, equals(100.0));
boxParentData = renderBox.parentData as BoxParentData;
boxParentData = renderBox.parentData! as BoxParentData;
expect(boxParentData.offset.dx, equals(0.0));
expect(OrderPainter.log, <int>[1, 2]);
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
......@@ -26,20 +24,20 @@ void main() {
await tester.pumpWidget(
const Padding(
key: GlobalObjectKey<State<StatefulWidget>>(null),
key: GlobalObjectKey<State<StatefulWidget>>(Object()),
padding: EdgeInsets.only(left: 1.0),
),
);
await tester.pumpWidget(const Directionality(
textDirection: TextDirection.rtl,
child: Padding(
key: GlobalObjectKey<State<StatefulWidget>>(null),
key: GlobalObjectKey<State<StatefulWidget>>(Object()),
padding: EdgeInsetsDirectional.only(start: 1.0),
),
));
await tester.pumpWidget(
const Padding(
key: GlobalObjectKey<State<StatefulWidget>>(null),
key: GlobalObjectKey<State<StatefulWidget>>(Object()),
padding: EdgeInsets.only(left: 1.0),
),
);
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:fake_async/fake_async.dart';
......@@ -11,7 +9,7 @@ import 'package:fake_async/fake_async.dart';
void main() {
setUp(() {
WidgetsFlutterBinding.ensureInitialized();
WidgetsBinding.instance.resetEpoch();
WidgetsBinding.instance!.resetEpoch();
});
test('WidgetBinding build rendering tree and warm up frame back to back', () {
......@@ -25,9 +23,9 @@ void main() {
),
);
// Rendering tree is not built synchronously.
expect(WidgetsBinding.instance.renderViewElement, isNull);
expect(WidgetsBinding.instance!.renderViewElement, isNull);
fakeAsync.flushTimers();
expect(WidgetsBinding.instance.renderViewElement, isNotNull);
expect(WidgetsBinding.instance!.renderViewElement, isNotNull);
});
});
}
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_test/flutter_test.dart';
......@@ -167,7 +165,7 @@ class _PageView62209State extends State<PageView62209> {
}
class Carousel62209Page extends StatelessWidget {
const Carousel62209Page({this.number, Key key}) : super(key: key);
const Carousel62209Page({required this.number, Key? key}) : super(key: key);
final int number;
......@@ -178,7 +176,7 @@ class Carousel62209Page extends StatelessWidget {
}
class Carousel62209 extends StatefulWidget {
const Carousel62209({Key key, this.pages}) : super(key: key);
const Carousel62209({Key? key, required this.pages}) : super(key: key);
final List<Carousel62209Page> pages;
......@@ -188,11 +186,11 @@ class Carousel62209 extends StatefulWidget {
class _Carousel62209State extends State<Carousel62209> {
// page variables
PageController _pageController;
late PageController _pageController;
int _currentPage = 0;
// controls updates outside of user interaction
List<Carousel62209Page> _pages;
late List<Carousel62209Page> _pages;
bool _jumpingToPage = false;
@override
......@@ -216,13 +214,13 @@ class _Carousel62209State extends State<Carousel62209> {
_pages = widget.pages.toList();
} else {
_jumpingToPage = true;
SchedulerBinding.instance.addPostFrameCallback((_) {
SchedulerBinding.instance!.addPostFrameCallback((_) {
if (mounted) {
setState(() {
_pages = widget.pages.toList();
_currentPage = newPage;
_pageController.jumpToPage(_currentPage);
SchedulerBinding.instance.addPostFrameCallback((_) {
SchedulerBinding.instance!.addPostFrameCallback((_) {
_jumpingToPage = false;
});
});
......@@ -240,7 +238,7 @@ class _Carousel62209State extends State<Carousel62209> {
bool _handleScrollNotification(ScrollNotification notification) {
if (notification is ScrollUpdateNotification) {
final int page = _pageController.page.round();
final int page = _pageController.page!.round();
if (!_jumpingToPage && _currentPage != page) {
_currentPage = page;
}
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:ui' as ui show Image;
import 'package:flutter_test/flutter_test.dart';
......@@ -13,29 +11,29 @@ import '../painting/image_test_utils.dart';
void main() {
ui.Image testImage;
late ui.Image testImage;
setUpAll(() async {
testImage = await createTestImage(width: 10, height: 10);
});
tearDown(() {
imageCache.clear();
imageCache?.clear();
});
T _findPhysics<T extends ScrollPhysics>(WidgetTester tester) {
return Scrollable.of(find.byType(TestWidget).evaluate().first).position.physics as T;
return Scrollable.of(find.byType(TestWidget).evaluate().first)!.position.physics as T;
}
ScrollMetrics _findMetrics(WidgetTester tester) {
return Scrollable.of(find.byType(TestWidget).evaluate().first).position;
return Scrollable.of(find.byType(TestWidget).evaluate().first)!.position;
}
testWidgets('ScrollAwareImageProvider does not delay if widget is not in scrollable', (WidgetTester tester) async {
final GlobalKey<TestWidgetState> key = GlobalKey<TestWidgetState>();
await tester.pumpWidget(TestWidget(key));
final DisposableBuildContext context = DisposableBuildContext(key.currentState);
final DisposableBuildContext context = DisposableBuildContext(key.currentState!);
final TestImageProvider testImageProvider = TestImageProvider(testImage);
final ScrollAwareImageProvider<TestImageProvider> imageProvider = ScrollAwareImageProvider<TestImageProvider>(
context: context,
......@@ -43,19 +41,19 @@ void main() {
);
expect(testImageProvider.configuration, null);
expect(imageCache.containsKey(testImageProvider), false);
expect(imageCache!.containsKey(testImageProvider), false);
final ImageStream stream = imageProvider.resolve(ImageConfiguration.empty);
expect(testImageProvider.configuration, ImageConfiguration.empty);
expect(stream.completer, isNotNull);
expect(stream.completer.hasListeners, true);
expect(imageCache.containsKey(testImageProvider), true);
expect(imageCache.currentSize, 0);
expect(stream.completer!.hasListeners, true);
expect(imageCache!.containsKey(testImageProvider), true);
expect(imageCache!.currentSize, 0);
testImageProvider.complete();
expect(imageCache.currentSize, 1);
expect(imageCache!.currentSize, 1);
});
testWidgets('ScrollAwareImageProvider does not delay if in scrollable that is not scrolling', (WidgetTester tester) async {
......@@ -70,7 +68,7 @@ void main() {
),
));
final DisposableBuildContext context = DisposableBuildContext(key.currentState);
final DisposableBuildContext context = DisposableBuildContext(key.currentState!);
final TestImageProvider testImageProvider = TestImageProvider(testImage);
final ScrollAwareImageProvider<TestImageProvider> imageProvider = ScrollAwareImageProvider<TestImageProvider>(
context: context,
......@@ -78,19 +76,19 @@ void main() {
);
expect(testImageProvider.configuration, null);
expect(imageCache.containsKey(testImageProvider), false);
expect(imageCache!.containsKey(testImageProvider), false);
final ImageStream stream = imageProvider.resolve(ImageConfiguration.empty);
expect(testImageProvider.configuration, ImageConfiguration.empty);
expect(stream.completer, isNotNull);
expect(stream.completer.hasListeners, true);
expect(imageCache.containsKey(testImageProvider), true);
expect(imageCache.currentSize, 0);
expect(stream.completer!.hasListeners, true);
expect(imageCache!.containsKey(testImageProvider), true);
expect(imageCache!.currentSize, 0);
testImageProvider.complete();
expect(imageCache.currentSize, 1);
expect(imageCache!.currentSize, 1);
expect(_findPhysics<RecordingPhysics>(tester).velocities, <double>[0]);
});
......@@ -110,7 +108,7 @@ void main() {
),
));
final DisposableBuildContext context = DisposableBuildContext(keys.last.currentState);
final DisposableBuildContext context = DisposableBuildContext(keys.last.currentState!);
final TestImageProvider testImageProvider = TestImageProvider(testImage);
final ScrollAwareImageProvider<TestImageProvider> imageProvider = ScrollAwareImageProvider<TestImageProvider>(
context: context,
......@@ -118,7 +116,7 @@ void main() {
);
expect(testImageProvider.configuration, null);
expect(imageCache.containsKey(testImageProvider), false);
expect(imageCache!.containsKey(testImageProvider), false);
scrollController.animateTo(
100,
......@@ -142,13 +140,13 @@ void main() {
expect(testImageProvider.configuration, ImageConfiguration.empty);
expect(stream.completer, isNotNull);
expect(stream.completer.hasListeners, true);
expect(imageCache.containsKey(testImageProvider), true);
expect(imageCache.currentSize, 0);
expect(stream.completer!.hasListeners, true);
expect(imageCache!.containsKey(testImageProvider), true);
expect(imageCache!.currentSize, 0);
testImageProvider.complete();
expect(imageCache.currentSize, 1);
expect(imageCache!.currentSize, 1);
});
testWidgets('ScrollAwareImageProvider delays if in scrollable that is scrolling fast', (WidgetTester tester) async {
......@@ -167,7 +165,7 @@ void main() {
),
));
final DisposableBuildContext context = DisposableBuildContext(keys.last.currentState);
final DisposableBuildContext context = DisposableBuildContext(keys.last.currentState!);
final TestImageProvider testImageProvider = TestImageProvider(testImage);
final ScrollAwareImageProvider<TestImageProvider> imageProvider = ScrollAwareImageProvider<TestImageProvider>(
context: context,
......@@ -175,7 +173,7 @@ void main() {
);
expect(testImageProvider.configuration, null);
expect(imageCache.containsKey(testImageProvider), false);
expect(imageCache!.containsKey(testImageProvider), false);
scrollController.animateTo(
3000,
......@@ -200,22 +198,22 @@ void main() {
expect(testImageProvider.configuration, null);
expect(stream.completer, null);
expect(imageCache.containsKey(testImageProvider), false);
expect(imageCache.currentSize, 0);
expect(imageCache!.containsKey(testImageProvider), false);
expect(imageCache!.currentSize, 0);
await tester.pump(const Duration(seconds: 1));
expect(physics.velocities.last, 0);
expect(testImageProvider.configuration, ImageConfiguration.empty);
expect(stream.completer, isNotNull);
expect(stream.completer.hasListeners, true);
expect(stream.completer!.hasListeners, true);
expect(imageCache.containsKey(testImageProvider), true);
expect(imageCache.currentSize, 0);
expect(imageCache!.containsKey(testImageProvider), true);
expect(imageCache!.currentSize, 0);
testImageProvider.complete();
expect(imageCache.currentSize, 1);
expect(imageCache!.currentSize, 1);
});
testWidgets('ScrollAwareImageProvider delays if in scrollable that is scrolling fast and fizzles if disposed', (WidgetTester tester) async {
......@@ -234,7 +232,7 @@ void main() {
),
));
final DisposableBuildContext context = DisposableBuildContext(keys.last.currentState);
final DisposableBuildContext context = DisposableBuildContext(keys.last.currentState!);
final TestImageProvider testImageProvider = TestImageProvider(testImage);
final ScrollAwareImageProvider<TestImageProvider> imageProvider = ScrollAwareImageProvider<TestImageProvider>(
context: context,
......@@ -242,7 +240,7 @@ void main() {
);
expect(testImageProvider.configuration, null);
expect(imageCache.containsKey(testImageProvider), false);
expect(imageCache!.containsKey(testImageProvider), false);
scrollController.animateTo(
3000,
......@@ -267,8 +265,8 @@ void main() {
expect(testImageProvider.configuration, null);
expect(stream.completer, null);
expect(imageCache.containsKey(testImageProvider), false);
expect(imageCache.currentSize, 0);
expect(imageCache!.containsKey(testImageProvider), false);
expect(imageCache!.currentSize, 0);
// as if we had picked a context that scrolled out of the tree.
context.dispose();
......@@ -279,12 +277,12 @@ void main() {
expect(testImageProvider.configuration, null);
expect(stream.completer, null);
expect(imageCache.containsKey(testImageProvider), false);
expect(imageCache.currentSize, 0);
expect(imageCache!.containsKey(testImageProvider), false);
expect(imageCache!.currentSize, 0);
testImageProvider.complete();
expect(imageCache.currentSize, 0);
expect(imageCache!.currentSize, 0);
});
testWidgets('ScrollAwareImageProvider resolves from ImageCache and does not set completer twice', (WidgetTester tester) async {
......@@ -299,7 +297,7 @@ void main() {
),
));
final DisposableBuildContext context = DisposableBuildContext(key.currentState);
final DisposableBuildContext context = DisposableBuildContext(key.currentState!);
final TestImageProvider testImageProvider = TestImageProvider(testImage);
final ScrollAwareImageProvider<TestImageProvider> imageProvider = ScrollAwareImageProvider<TestImageProvider>(
context: context,
......@@ -307,7 +305,7 @@ void main() {
);
expect(testImageProvider.configuration, null);
expect(imageCache.containsKey(testImageProvider), false);
expect(imageCache!.containsKey(testImageProvider), false);
final ControllablePhysics physics = _findPhysics<ControllablePhysics>(tester);
physics.recommendDeferredLoadingValue = true;
......@@ -316,28 +314,28 @@ void main() {
expect(testImageProvider.configuration, null);
expect(stream.completer, null);
expect(imageCache.containsKey(testImageProvider), false);
expect(imageCache.currentSize, 0);
expect(imageCache!.containsKey(testImageProvider), false);
expect(imageCache!.currentSize, 0);
// Simulate a case where someone else has managed to complete this stream -
// so it can land in the cache right before we stop scrolling fast.
// If we miss the early return, we will fail.
testImageProvider.complete();
imageCache.putIfAbsent(testImageProvider, () => testImageProvider.load(testImageProvider, PaintingBinding.instance.instantiateImageCodec));
imageCache!.putIfAbsent(testImageProvider, () => testImageProvider.load(testImageProvider, PaintingBinding.instance!.instantiateImageCodec));
// We've stopped scrolling fast.
physics.recommendDeferredLoadingValue = false;
await tester.idle();
expect(imageCache.containsKey(testImageProvider), true);
expect(imageCache.currentSize, 1);
expect(imageCache!.containsKey(testImageProvider), true);
expect(imageCache!.currentSize, 1);
expect(testImageProvider.loadCallCount, 1);
expect(stream.completer, null);
});
testWidgets('ScrollAwareImageProvider does not block LRU updates to image cache', (WidgetTester tester) async {
final int oldSize = imageCache.maximumSize;
imageCache.maximumSize = 1;
final int oldSize = imageCache!.maximumSize;
imageCache!.maximumSize = 1;
final GlobalKey<TestWidgetState> key = GlobalKey<TestWidgetState>();
final ScrollController scrollController = ScrollController();
......@@ -350,7 +348,7 @@ void main() {
),
));
final DisposableBuildContext context = DisposableBuildContext(key.currentState);
final DisposableBuildContext context = DisposableBuildContext(key.currentState!);
final TestImageProvider testImageProvider = TestImageProvider(testImage);
final ScrollAwareImageProvider<TestImageProvider> imageProvider = ScrollAwareImageProvider<TestImageProvider>(
context: context,
......@@ -358,7 +356,7 @@ void main() {
);
expect(testImageProvider.configuration, null);
expect(imageCache.containsKey(testImageProvider), false);
expect(imageCache!.containsKey(testImageProvider), false);
final ControllablePhysics physics = _findPhysics<ControllablePhysics>(tester);
physics.recommendDeferredLoadingValue = true;
......@@ -367,41 +365,41 @@ void main() {
expect(testImageProvider.configuration, null);
expect(stream.completer, null);
expect(imageCache.currentSize, 0);
expect(imageCache!.currentSize, 0);
// Occupy the only slot in the cache with another image.
final TestImageProvider testImageProvider2 = TestImageProvider(testImage);
testImageProvider2.complete();
await precacheImage(testImageProvider2, context.context);
expect(imageCache.containsKey(testImageProvider), false);
expect(imageCache.containsKey(testImageProvider2), true);
expect(imageCache.currentSize, 1);
await precacheImage(testImageProvider2, context.context!);
expect(imageCache!.containsKey(testImageProvider), false);
expect(imageCache!.containsKey(testImageProvider2), true);
expect(imageCache!.currentSize, 1);
// Complete the original image while we're still scrolling fast.
testImageProvider.complete();
stream.setCompleter(testImageProvider.load(testImageProvider, PaintingBinding.instance.instantiateImageCodec));
stream.setCompleter(testImageProvider.load(testImageProvider, PaintingBinding.instance!.instantiateImageCodec));
// Verify that this hasn't changed the cache state yet
expect(imageCache.containsKey(testImageProvider), false);
expect(imageCache.containsKey(testImageProvider2), true);
expect(imageCache.currentSize, 1);
expect(imageCache!.containsKey(testImageProvider), false);
expect(imageCache!.containsKey(testImageProvider2), true);
expect(imageCache!.currentSize, 1);
expect(testImageProvider.loadCallCount, 1);
await tester.pump();
// After pumping a frame, the original image should be in the cache because
// it took the LRU slot.
expect(imageCache.containsKey(testImageProvider), true);
expect(imageCache.containsKey(testImageProvider2), false);
expect(imageCache.currentSize, 1);
expect(imageCache!.containsKey(testImageProvider), true);
expect(imageCache!.containsKey(testImageProvider2), false);
expect(imageCache!.currentSize, 1);
expect(testImageProvider.loadCallCount, 1);
imageCache.maximumSize = oldSize;
imageCache!.maximumSize = oldSize;
});
}
class TestWidget extends StatefulWidget {
const TestWidget(Key key) : super(key: key);
const TestWidget(Key? key) : super(key: key);
@override
State<TestWidget> createState() => TestWidgetState();
......@@ -413,13 +411,13 @@ class TestWidgetState extends State<TestWidget> {
}
class RecordingPhysics extends ScrollPhysics {
RecordingPhysics({ ScrollPhysics parent }) : super(parent: parent);
RecordingPhysics({ ScrollPhysics? parent }) : super(parent: parent);
final List<double> velocities = <double>[];
@override
RecordingPhysics applyTo(ScrollPhysics ancestor) {
return RecordingPhysics(parent: buildParent(ancestor));
RecordingPhysics applyTo(ScrollPhysics? ancestor) {
return RecordingPhysics(parent: buildParent(ancestor)!);
}
@override
......@@ -433,13 +431,13 @@ class RecordingPhysics extends ScrollPhysics {
// times without worrying about actual scrolling mechanics.
// ignore: must_be_immutable
class ControllablePhysics extends ScrollPhysics {
ControllablePhysics({ ScrollPhysics parent }) : super(parent: parent);
ControllablePhysics({ ScrollPhysics? parent }) : super(parent: parent);
bool recommendDeferredLoadingValue = false;
@override
ControllablePhysics applyTo(ScrollPhysics ancestor) {
return ControllablePhysics(parent: buildParent(ancestor));
ControllablePhysics applyTo(ScrollPhysics? ancestor) {
return ControllablePhysics(parent: buildParent(ancestor)!);
}
@override
......
......@@ -2,13 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/gestures.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
GestureVelocityTrackerBuilder lastCreatedBuilder;
late GestureVelocityTrackerBuilder lastCreatedBuilder;
class TestScrollBehavior extends ScrollBehavior {
const TestScrollBehavior(this.flag);
......@@ -36,15 +34,15 @@ class TestScrollBehavior extends ScrollBehavior {
void main() {
testWidgets('Inherited ScrollConfiguration changed', (WidgetTester tester) async {
final GlobalKey key = GlobalKey(debugLabel: 'scrollable');
TestScrollBehavior behavior;
ScrollPositionWithSingleContext position;
TestScrollBehavior? behavior;
late ScrollPositionWithSingleContext position;
final Widget scrollView = SingleChildScrollView(
key: key,
child: Builder(
builder: (BuildContext context) {
behavior = ScrollConfiguration.of(context) as TestScrollBehavior;
position = Scrollable.of(context).position as ScrollPositionWithSingleContext;
position = Scrollable.of(context)!.position as ScrollPositionWithSingleContext;
return Container(height: 1000.0);
},
),
......@@ -58,7 +56,7 @@ void main() {
);
expect(behavior, isNotNull);
expect(behavior.flag, isTrue);
expect(behavior!.flag, isTrue);
expect(position.physics, isA<ClampingScrollPhysics>());
expect(lastCreatedBuilder(const PointerDownEvent()), isA<VelocityTracker>());
ScrollMetrics metrics = position.copyWith();
......@@ -74,7 +72,7 @@ void main() {
);
expect(behavior, isNotNull);
expect(behavior.flag, isFalse);
expect(behavior!.flag, isFalse);
expect(position.physics, isA<BouncingScrollPhysics>());
expect(lastCreatedBuilder(const PointerDownEvent()), isA<IOSScrollViewFlingVelocityTracker>());
// Regression test for https://github.com/flutter/flutter/issues/5856
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
......
......@@ -2,15 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:async';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
import 'package:meta/meta.dart';
Widget _buildScroller({ List<String> log }) {
Widget _buildScroller({ required List<String> log }) {
return NotificationListener<ScrollNotification>(
onNotification: (ScrollNotification notification) {
if (notification is ScrollStartNotification) {
......@@ -29,7 +26,7 @@ Widget _buildScroller({ List<String> log }) {
}
void main() {
Completer<void> animateTo(WidgetTester tester, double newScrollOffset, { @required Duration duration }) {
Completer<void> animateTo(WidgetTester tester, double newScrollOffset, { required Duration duration }) {
final Completer<void> completer = Completer<void>();
final ScrollableState scrollable = tester.state(find.byType(Scrollable));
scrollable.position.animateTo(newScrollOffset, duration: duration, curve: Curves.linear).whenComplete(completer.complete);
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
......@@ -11,7 +9,7 @@ import 'package:flutter/widgets.dart';
void main() {
testWidgets('Scroll notification basics', (WidgetTester tester) async {
ScrollNotification notification;
late ScrollNotification notification;
await tester.pumpWidget(NotificationListener<ScrollNotification>(
onNotification: (ScrollNotification value) {
......@@ -30,7 +28,7 @@ void main() {
expect(notification.depth, equals(0));
final ScrollStartNotification start = notification as ScrollStartNotification;
expect(start.dragDetails, isNotNull);
expect(start.dragDetails.globalPosition, equals(const Offset(100.0, 100.0)));
expect(start.dragDetails!.globalPosition, equals(const Offset(100.0, 100.0)));
await gesture.moveBy(const Offset(-10.0, -10.0));
await tester.pump(const Duration(seconds: 1));
......@@ -38,8 +36,8 @@ void main() {
expect(notification.depth, equals(0));
final ScrollUpdateNotification update = notification as ScrollUpdateNotification;
expect(update.dragDetails, isNotNull);
expect(update.dragDetails.globalPosition, equals(const Offset(90.0, 90.0)));
expect(update.dragDetails.delta, equals(const Offset(0.0, -10.0)));
expect(update.dragDetails!.globalPosition, equals(const Offset(90.0, 90.0)));
expect(update.dragDetails!.delta, equals(const Offset(0.0, -10.0)));
await gesture.up();
await tester.pump(const Duration(seconds: 1));
......@@ -47,7 +45,7 @@ void main() {
expect(notification.depth, equals(0));
final ScrollEndNotification end = notification as ScrollEndNotification;
expect(end.dragDetails, isNotNull);
expect(end.dragDetails.velocity, equals(Velocity.zero));
expect(end.dragDetails!.velocity, equals(Velocity.zero));
});
testWidgets('Scroll notification depth', (WidgetTester tester) async {
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
......@@ -12,20 +10,20 @@ import 'package:flutter_test/flutter_test.dart';
class TestScrollPhysics extends ScrollPhysics {
const TestScrollPhysics({
this.name,
ScrollPhysics parent
required this.name,
ScrollPhysics? parent
}) : super(parent: parent);
final String name;
@override
TestScrollPhysics applyTo(ScrollPhysics ancestor) {
TestScrollPhysics applyTo(ScrollPhysics? ancestor) {
return TestScrollPhysics(
name: name,
parent: parent?.applyTo(ancestor) ?? ancestor,
parent: parent?.applyTo(ancestor) ?? ancestor!,
);
}
TestScrollPhysics get namedParent => parent as TestScrollPhysics;
TestScrollPhysics get namedParent => parent! as TestScrollPhysics;
String get names => parent == null ? name : '$name ${namedParent.names}';
@override
......@@ -69,7 +67,7 @@ void main() {
const ScrollPhysics always = AlwaysScrollableScrollPhysics();
const ScrollPhysics page = PageScrollPhysics();
String types(ScrollPhysics s) => s.parent == null ? '${s.runtimeType}' : '${s.runtimeType} ${types(s.parent)}';
String types(ScrollPhysics? value) => value!.parent == null ? '${value.runtimeType}' : '${value.runtimeType} ${types(value.parent)}';
expect(
types(bounce.applyTo(clamp.applyTo(never.applyTo(always.applyTo(page))))),
......@@ -112,13 +110,13 @@ void main() {
// Calls to createBallisticSimulation may happen on every frame (i.e. when the maxScrollExtent changes)
// Changing velocity for time 0 may cause a sudden, unwanted damping/speedup effect
expect(bounce.createBallisticSimulation(position, 1000).dx(0), moreOrLessEquals(1000));
expect(clamp.createBallisticSimulation(position, 1000).dx(0), moreOrLessEquals(1000));
expect(page.createBallisticSimulation(position, 1000).dx(0), moreOrLessEquals(1000));
expect(bounce.createBallisticSimulation(position, 1000)!.dx(0), moreOrLessEquals(1000));
expect(clamp.createBallisticSimulation(position, 1000)!.dx(0), moreOrLessEquals(1000));
expect(page.createBallisticSimulation(position, 1000)!.dx(0), moreOrLessEquals(1000));
});
group('BouncingScrollPhysics test', () {
BouncingScrollPhysics physicsUnderTest;
late BouncingScrollPhysics physicsUnderTest;
setUp(() {
physicsUnderTest = const BouncingScrollPhysics();
......@@ -253,7 +251,7 @@ void main() {
axisDirection: AxisDirection.down,
);
expect(position.pixels, pixels);
FlutterError error;
late FlutterError error;
try {
physics.applyBoundaryConditions(position, pixels);
} on FlutterError catch (e) {
......
......@@ -2,11 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:ui';
import 'package:meta/meta.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
......@@ -16,8 +13,8 @@ ScrollController _controller = ScrollController(
class ThePositiveNumbers extends StatelessWidget {
const ThePositiveNumbers({
Key key,
@required this.from,
Key? key,
required this.from,
}) : super(key: key);
final int from;
@override
......@@ -93,7 +90,7 @@ Future<void> performTest(WidgetTester tester, bool maintainState) async {
expect(find.text('16'), findsNothing, reason: 'with maintainState: $maintainState');
expect(find.text('100'), findsNothing, reason: 'with maintainState: $maintainState');
navigatorKey.currentState.pushNamed('/second');
navigatorKey.currentState!.pushNamed('/second');
await tester.pump(); // navigating always takes two frames, one to start...
await tester.pump(const Duration(seconds: 1)); // ...and one to end the transition
......@@ -114,7 +111,7 @@ Future<void> performTest(WidgetTester tester, bool maintainState) async {
expect(find.text('10010'), findsNothing, reason: 'with maintainState: $maintainState');
expect(find.text('10100'), findsNothing, reason: 'with maintainState: $maintainState');
navigatorKey.currentState.pop();
navigatorKey.currentState!.pop();
await tester.pump(); // again, navigating always takes two frames
// Ensure we don't clamp the scroll offset even during the navigation.
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter/gestures.dart' show DragStartBehavior;
......@@ -33,7 +31,7 @@ class WidgetsLocalizationsDelegate extends LocalizationsDelegate<WidgetsLocaliza
bool shouldReload(WidgetsLocalizationsDelegate old) => false;
}
Widget textFieldBoilerplate({ Widget child }) {
Widget textFieldBoilerplate({ required Widget child }) {
return MaterialApp(
home: Localizations(
locale: const Locale('en', 'US'),
......@@ -125,11 +123,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isFalse);
expect(textField.focusNode!.hasFocus, isFalse);
});
testWidgets('ListView.builder dismiss keyboard onDrag test', (WidgetTester tester) async {
......@@ -159,11 +157,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isFalse);
expect(textField.focusNode!.hasFocus, isFalse);
});
testWidgets('ListView.custom dismiss keyboard onDrag test', (WidgetTester tester) async {
......@@ -195,11 +193,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isFalse);
expect(textField.focusNode!.hasFocus, isFalse);
});
testWidgets('ListView.separated dismiss keyboard onDrag test', (WidgetTester tester) async {
......@@ -230,11 +228,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isFalse);
expect(textField.focusNode!.hasFocus, isFalse);
});
testWidgets('GridView dismiss keyboard onDrag test', (WidgetTester tester) async {
......@@ -264,11 +262,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isFalse);
expect(textField.focusNode!.hasFocus, isFalse);
});
testWidgets('GridView.builder dismiss keyboard onDrag test', (WidgetTester tester) async {
......@@ -299,11 +297,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isFalse);
expect(textField.focusNode!.hasFocus, isFalse);
});
testWidgets('GridView.count dismiss keyboard onDrag test', (WidgetTester tester) async {
......@@ -333,11 +331,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isFalse);
expect(textField.focusNode!.hasFocus, isFalse);
});
testWidgets('GridView.extent dismiss keyboard onDrag test', (WidgetTester tester) async {
......@@ -367,11 +365,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isFalse);
expect(textField.focusNode!.hasFocus, isFalse);
});
testWidgets('GridView.custom dismiss keyboard onDrag test', (WidgetTester tester) async {
......@@ -404,11 +402,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isFalse);
expect(textField.focusNode!.hasFocus, isFalse);
});
testWidgets('ListView dismiss keyboard manual test', (WidgetTester tester) async {
......@@ -435,11 +433,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
});
testWidgets('ListView.builder dismiss keyboard manual test', (WidgetTester tester) async {
......@@ -469,11 +467,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
});
testWidgets('ListView.custom dismiss keyboard manual test', (WidgetTester tester) async {
......@@ -505,11 +503,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
});
testWidgets('ListView.separated dismiss keyboard manual test', (WidgetTester tester) async {
......@@ -540,11 +538,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
});
testWidgets('GridView dismiss keyboard manual test', (WidgetTester tester) async {
......@@ -574,11 +572,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
});
testWidgets('GridView.builder dismiss keyboard manual test', (WidgetTester tester) async {
......@@ -609,11 +607,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
});
testWidgets('GridView.count dismiss keyboard manual test', (WidgetTester tester) async {
......@@ -643,11 +641,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
});
testWidgets('GridView.extent dismiss keyboard manual test', (WidgetTester tester) async {
......@@ -677,11 +675,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
});
testWidgets('GridView.custom dismiss keyboard manual test', (WidgetTester tester) async {
......@@ -714,11 +712,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
});
testWidgets('ListView restart ballistic activity out of range', (WidgetTester tester) async {
......@@ -831,11 +829,11 @@ void main() {
final Finder finder = find.byType(TextField).first;
final TextField textField = tester.widget(finder);
await tester.showKeyboard(finder);
expect(textField.focusNode.hasFocus, isTrue);
expect(textField.focusNode!.hasFocus, isTrue);
await tester.drag(finder, const Offset(0.0, -40.0));
await tester.pumpAndSettle();
expect(textField.focusNode.hasFocus, isFalse);
expect(textField.focusNode!.hasFocus, isFalse);
});
testWidgets('Can jumpTo during drag', (WidgetTester tester) async {
......@@ -1164,41 +1162,6 @@ void main() {
// A separatorBuilder that always returns a Divider is fine
await tester.pumpWidget(buildFrame(const Divider()));
expect(tester.takeException(), isNull);
// A separatorBuilder that returns null throws a FlutterError
await tester.pumpWidget(buildFrame(null));
expect(tester.takeException(), isFlutterError);
expect(find.byType(ErrorWidget), findsOneWidget);
});
testWidgets('itemBuilder can return null', (WidgetTester tester) async {
const List<String> listOfValues = <String>['ALPHA', 'BETA', 'GAMMA', 'DELTA'];
const Key key = Key('list');
const int RENDER_NULL_AT = 2; // only render the first 2 values
Widget buildFrame() {
return MaterialApp(
home: Material(
child: ListView.builder(
key: key,
itemBuilder: (BuildContext context, int index) {
if (index == RENDER_NULL_AT) {
return null;
}
return Text(listOfValues[index]);
},
itemCount: listOfValues.length,
),
),
);
}
// The length of a list is itemCount or the index of the first itemBuilder
// that returns null, whichever is smaller
await tester.pumpWidget(buildFrame());
expect(tester.takeException(), isNull);
expect(find.byType(ErrorWidget), findsNothing);
expect(find.byType(Text), findsNWidgets(RENDER_NULL_AT));
});
testWidgets('when itemBuilder throws, creates Error Widget', (WidgetTester tester) async {
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/widgets.dart';
......@@ -71,10 +69,10 @@ void main() {
final double targetPosition = controller.position.pixels + doubleTolerance;
controller.position.animateTo(targetPosition, duration: const Duration(seconds: 10), curve: Curves.linear);
expect(SchedulerBinding.instance.transientCallbackCount, equals(1), reason: 'Expected an animation.');
expect(SchedulerBinding.instance!.transientCallbackCount, equals(1), reason: 'Expected an animation.');
});
}
void expectNoAnimation() {
expect(SchedulerBinding.instance.transientCallbackCount, equals(0), reason: 'Expected no animation.');
expect(SchedulerBinding.instance!.transientCallbackCount, equals(0), reason: 'Expected no animation.');
}
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import 'package:flutter/gestures.dart' show DragStartBehavior;
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter/rendering.dart';
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
......
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
......
......@@ -2,13 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
class ScrollPositionListener extends StatefulWidget {
const ScrollPositionListener({ Key key, this.child, this.log}) : super(key: key);
const ScrollPositionListener({ Key? key, required this.child, required this.log}) : super(key: key);
final Widget child;
final ValueChanged<String> log;
......@@ -18,7 +16,7 @@ class ScrollPositionListener extends StatefulWidget {
}
class _ScrollPositionListenerState extends State<ScrollPositionListener> {
ScrollPosition _position;
ScrollPosition? _position;
@override
void didChangeDependencies() {
......@@ -26,7 +24,7 @@ class _ScrollPositionListenerState extends State<ScrollPositionListener> {
_position?.removeListener(listener);
_position = Scrollable.of(context)?.position;
_position?.addListener(listener);
widget.log('didChangeDependencies ${_position?.pixels?.toStringAsFixed(1)}');
widget.log('didChangeDependencies ${_position?.pixels.toStringAsFixed(1)}');
}
@override
......@@ -39,20 +37,20 @@ class _ScrollPositionListenerState extends State<ScrollPositionListener> {
Widget build(BuildContext context) => widget.child;
void listener() {
widget.log('listener ${_position?.pixels?.toStringAsFixed(1)}');
widget.log('listener ${_position?.pixels.toStringAsFixed(1)}');
}
}
void main() {
testWidgets('Scrollable.of() dependent rebuilds when Scrollable position changes', (WidgetTester tester) async {
String logValue;
late String logValue;
final ScrollController controller = ScrollController();
// Changing the SingleChildScrollView's physics causes the
// ScrollController's ScrollPosition to be rebuilt.
Widget buildFrame(ScrollPhysics physics) {
Widget buildFrame(ScrollPhysics? physics) {
return SingleChildScrollView(
controller: controller,
physics: physics,
......@@ -86,7 +84,7 @@ void main() {
});
testWidgets('Scrollable.of() is possible using ScrollNotification context', (WidgetTester tester) async {
ScrollNotification notification;
late ScrollNotification notification;
await tester.pumpWidget(NotificationListener<ScrollNotification>(
onNotification: (ScrollNotification value) {
......@@ -102,6 +100,6 @@ void main() {
await tester.pump(const Duration(seconds: 1));
final StatefulElement scrollableElement = find.byType(Scrollable).evaluate().first as StatefulElement;
expect(Scrollable.of(notification.context), equals(scrollableElement.state));
expect(Scrollable.of(notification.context!), equals(scrollableElement.state));
});
}
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
......@@ -397,20 +395,20 @@ void main() {
),
);
expect(tester.renderObject<RenderSliver>(find.byType(SliverAppBar)).geometry.paintExtent, 150);
expect(tester.renderObject<RenderSliver>(find.byType(SliverAppBar)).geometry!.paintExtent, 150);
expect(find.text('Tile 0'), findsOneWidget);
expect(find.text('Tile 10'), findsNothing);
await tester.drag(find.byType(ListView), const Offset(0, -500));
await tester.pump();
expect(tester.renderObject<RenderSliver>(find.byType(SliverAppBar)).geometry.paintExtent, 56);
expect(tester.renderObject<RenderSliver>(find.byType(SliverAppBar)).geometry!.paintExtent, 56);
expect(find.text('Tile 0'), findsNothing);
expect(find.text('Tile 10'), findsOneWidget);
await tester.restartAndRestore();
expect(tester.renderObject<RenderSliver>(find.byType(SliverAppBar)).geometry.paintExtent, 56);
expect(tester.renderObject<RenderSliver>(find.byType(SliverAppBar)).geometry!.paintExtent, 56);
expect(find.text('Tile 0'), findsNothing);
expect(find.text('Tile 10'), findsOneWidget);
......@@ -418,13 +416,13 @@ void main() {
await tester.drag(find.byType(ListView), const Offset(0, 600));
await tester.pump();
expect(tester.renderObject<RenderSliver>(find.byType(SliverAppBar)).geometry.paintExtent, 150);
expect(tester.renderObject<RenderSliver>(find.byType(SliverAppBar)).geometry!.paintExtent, 150);
expect(find.text('Tile 0'), findsOneWidget);
expect(find.text('Tile 10'), findsNothing);
await tester.restoreFrom(data);
expect(tester.renderObject<RenderSliver>(find.byType(SliverAppBar)).geometry.paintExtent, 56);
expect(tester.renderObject<RenderSliver>(find.byType(SliverAppBar)).geometry!.paintExtent, 56);
expect(find.text('Tile 0'), findsNothing);
expect(find.text('Tile 10'), findsOneWidget);
});
......@@ -552,7 +550,7 @@ Future<void> restoreScrollAndVerify(WidgetTester tester, {double secondOffset =
}
class TestHarness extends StatelessWidget {
const TestHarness({Key key, this.child, this.height = 100}) : super(key: key);
const TestHarness({Key? key, required this.child, this.height = 100}) : super(key: key);
final Widget child;
final double height;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment