Convert some more widget tests to NNBD (#68129)
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user