mirror of
https://github.com/flutter/flutter
synced 2024-10-13 19:52:53 +00:00
[NNBD] Migrate some Widgets tests (#68157)
This commit is contained in:
parent
73301a35a2
commit
5aef988adc
|
@ -412,7 +412,7 @@ class MethodChannel {
|
||||||
/// return value of the call. The value will be encoded using
|
/// return value of the call. The value will be encoded using
|
||||||
/// [MethodCodec.encodeSuccessEnvelope], to act as if platform plugin had
|
/// [MethodCodec.encodeSuccessEnvelope], to act as if platform plugin had
|
||||||
/// returned that value.
|
/// returned that value.
|
||||||
void setMockMethodCallHandler(Future<dynamic> Function(MethodCall call)? handler) {
|
void setMockMethodCallHandler(Future<dynamic>? Function(MethodCall call)? handler) {
|
||||||
_methodChannelMockHandlers[this] = handler;
|
_methodChannelMockHandlers[this] = handler;
|
||||||
binaryMessenger.setMockMessageHandler(
|
binaryMessenger.setMockMessageHandler(
|
||||||
name,
|
name,
|
||||||
|
@ -430,7 +430,7 @@ class MethodChannel {
|
||||||
/// is not set.
|
/// is not set.
|
||||||
bool checkMockMethodCallHandler(Future<dynamic> Function(MethodCall call)? handler) => _methodChannelMockHandlers[this] == handler;
|
bool checkMockMethodCallHandler(Future<dynamic> Function(MethodCall call)? handler) => _methodChannelMockHandlers[this] == handler;
|
||||||
|
|
||||||
Future<ByteData?> _handleAsMethodCall(ByteData? message, Future<dynamic> handler(MethodCall call)) async {
|
Future<ByteData?> _handleAsMethodCall(ByteData? message, Future<dynamic>? handler(MethodCall call)) async {
|
||||||
final MethodCall call = codec.decodeMethodCall(message);
|
final MethodCall call = codec.decodeMethodCall(message);
|
||||||
try {
|
try {
|
||||||
return codec.encodeSuccessEnvelope(await handler(call));
|
return codec.encodeSuccessEnvelope(await handler(call));
|
||||||
|
|
|
@ -195,7 +195,7 @@ class FakeTextChannel implements MethodChannel {
|
||||||
bool checkMethodCallHandler(Future<void> Function(MethodCall call)? handler) => throw UnimplementedError();
|
bool checkMethodCallHandler(Future<void> Function(MethodCall call)? handler) => throw UnimplementedError();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void setMockMethodCallHandler(Future<void> Function(MethodCall call)? handler) => throw UnimplementedError();
|
void setMockMethodCallHandler(Future<void>? Function(MethodCall call)? handler) => throw UnimplementedError();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool checkMockMethodCallHandler(Future<void> Function(MethodCall call)? handler) => throw UnimplementedError();
|
bool checkMockMethodCallHandler(Future<void> Function(MethodCall call)? handler) => throw UnimplementedError();
|
||||||
|
|
|
@ -460,7 +460,7 @@ class FakeTextChannel implements MethodChannel {
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void setMockMethodCallHandler(Future<void> Function(MethodCall call)? handler) => throw UnimplementedError();
|
void setMockMethodCallHandler(Future<void>? Function(MethodCall call)? handler) => throw UnimplementedError();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool checkMockMethodCallHandler(Future<void> Function(MethodCall call)? handler) => throw UnimplementedError();
|
bool checkMockMethodCallHandler(Future<void> Function(MethodCall call)? handler) => throw UnimplementedError();
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
@ -27,7 +25,7 @@ void main() {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
final RenderBox box = inner.currentContext.findRenderObject() as RenderBox;
|
final RenderBox box = inner.currentContext!.findRenderObject()! as RenderBox;
|
||||||
expect(box.localToGlobal(Offset.zero), equals(const Offset(745.0, 565.0)));
|
expect(box.localToGlobal(Offset.zero), equals(const Offset(745.0, 565.0)));
|
||||||
expect(box.size, equals(const Size(100.0, 50.0)));
|
expect(box.size, equals(const Size(100.0, 50.0)));
|
||||||
});
|
});
|
||||||
|
@ -64,7 +62,7 @@ void main() {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
final RenderBox box = inner.currentContext.findRenderObject() as RenderBox;
|
final RenderBox box = inner.currentContext!.findRenderObject()! as RenderBox;
|
||||||
expect(box.size, equals(const Size(50.0, 50.0)));
|
expect(box.size, equals(const Size(50.0, 50.0)));
|
||||||
expect(
|
expect(
|
||||||
box.localToGlobal(box.size.center(Offset.zero)),
|
box.localToGlobal(box.size.center(Offset.zero)),
|
||||||
|
@ -87,7 +85,7 @@ void main() {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
final RenderBox box = inner.currentContext.findRenderObject() as RenderBox;
|
final RenderBox box = inner.currentContext!.findRenderObject()! as RenderBox;
|
||||||
expect(box.size, equals(const Size(50.0, 50.0)));
|
expect(box.size, equals(const Size(50.0, 50.0)));
|
||||||
expect(
|
expect(
|
||||||
box.localToGlobal(box.size.center(Offset.zero)),
|
box.localToGlobal(box.size.center(Offset.zero)),
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
@ -23,8 +21,7 @@ void main() {
|
||||||
OverlayEntry(
|
OverlayEntry(
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
didBuild = true;
|
didBuild = true;
|
||||||
final Overlay overlay = context.findAncestorWidgetOfExactType<Overlay>();
|
final Overlay overlay = context.findAncestorWidgetOfExactType<Overlay>()!;
|
||||||
expect(overlay, isNotNull);
|
|
||||||
expect(overlay.key, equals(overlayKey));
|
expect(overlay.key, equals(overlayKey));
|
||||||
return Container();
|
return Container();
|
||||||
},
|
},
|
||||||
|
@ -37,7 +34,7 @@ void main() {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
expect(didBuild, isTrue);
|
expect(didBuild, isTrue);
|
||||||
final RenderObject theater = overlayKey.currentContext.findRenderObject();
|
final RenderObject theater = overlayKey.currentContext!.findRenderObject()!;
|
||||||
|
|
||||||
expect(theater, hasAGoodToStringDeep);
|
expect(theater, hasAGoodToStringDeep);
|
||||||
expect(
|
expect(
|
||||||
|
@ -110,7 +107,7 @@ void main() {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
final RenderObject theater = overlayKey.currentContext.findRenderObject();
|
final RenderObject theater = overlayKey.currentContext!.findRenderObject()!;
|
||||||
|
|
||||||
expect(theater, hasAGoodToStringDeep);
|
expect(theater, hasAGoodToStringDeep);
|
||||||
expect(
|
expect(
|
||||||
|
@ -189,7 +186,7 @@ void main() {
|
||||||
expect(buildOrder, <String>['Base']);
|
expect(buildOrder, <String>['Base']);
|
||||||
|
|
||||||
buildOrder.clear();
|
buildOrder.clear();
|
||||||
final OverlayState overlay = overlayKey.currentState as OverlayState;
|
final OverlayState overlay = overlayKey.currentState! as OverlayState;
|
||||||
overlay.insert(
|
overlay.insert(
|
||||||
OverlayEntry(
|
OverlayEntry(
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
|
@ -227,7 +224,7 @@ void main() {
|
||||||
expect(buildOrder, <String>['Base']);
|
expect(buildOrder, <String>['Base']);
|
||||||
|
|
||||||
buildOrder.clear();
|
buildOrder.clear();
|
||||||
final OverlayState overlay = overlayKey.currentState as OverlayState;
|
final OverlayState overlay = overlayKey.currentState! as OverlayState;
|
||||||
overlay.insert(
|
overlay.insert(
|
||||||
OverlayEntry(
|
OverlayEntry(
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
|
@ -272,7 +269,7 @@ void main() {
|
||||||
expect(buildOrder, <String>['Base', 'Top']);
|
expect(buildOrder, <String>['Base', 'Top']);
|
||||||
|
|
||||||
buildOrder.clear();
|
buildOrder.clear();
|
||||||
final OverlayState overlay = overlayKey.currentState as OverlayState;
|
final OverlayState overlay = overlayKey.currentState! as OverlayState;
|
||||||
overlay.insert(
|
overlay.insert(
|
||||||
OverlayEntry(
|
OverlayEntry(
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
|
@ -325,7 +322,7 @@ void main() {
|
||||||
];
|
];
|
||||||
|
|
||||||
buildOrder.clear();
|
buildOrder.clear();
|
||||||
final OverlayState overlay = overlayKey.currentState as OverlayState;
|
final OverlayState overlay = overlayKey.currentState! as OverlayState;
|
||||||
overlay.insertAll(entries);
|
overlay.insertAll(entries);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
|
||||||
|
@ -371,7 +368,7 @@ void main() {
|
||||||
];
|
];
|
||||||
|
|
||||||
buildOrder.clear();
|
buildOrder.clear();
|
||||||
final OverlayState overlay = overlayKey.currentState as OverlayState;
|
final OverlayState overlay = overlayKey.currentState! as OverlayState;
|
||||||
overlay.insertAll(entries, below: base);
|
overlay.insertAll(entries, below: base);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
|
||||||
|
@ -423,7 +420,7 @@ void main() {
|
||||||
];
|
];
|
||||||
|
|
||||||
buildOrder.clear();
|
buildOrder.clear();
|
||||||
final OverlayState overlay = overlayKey.currentState as OverlayState;
|
final OverlayState overlay = overlayKey.currentState! as OverlayState;
|
||||||
overlay.insertAll(entries, above: base);
|
overlay.insertAll(entries, above: base);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
|
||||||
|
@ -486,7 +483,7 @@ void main() {
|
||||||
];
|
];
|
||||||
|
|
||||||
buildOrder.clear();
|
buildOrder.clear();
|
||||||
final OverlayState overlay = overlayKey.currentState as OverlayState;
|
final OverlayState overlay = overlayKey.currentState! as OverlayState;
|
||||||
overlay.rearrange(rearranged);
|
overlay.rearrange(rearranged);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
|
||||||
|
@ -549,7 +546,7 @@ void main() {
|
||||||
];
|
];
|
||||||
|
|
||||||
buildOrder.clear();
|
buildOrder.clear();
|
||||||
final OverlayState overlay = overlayKey.currentState as OverlayState;
|
final OverlayState overlay = overlayKey.currentState! as OverlayState;
|
||||||
overlay.rearrange(rearranged, above: initialEntries[2]);
|
overlay.rearrange(rearranged, above: initialEntries[2]);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
|
||||||
|
@ -612,7 +609,7 @@ void main() {
|
||||||
];
|
];
|
||||||
|
|
||||||
buildOrder.clear();
|
buildOrder.clear();
|
||||||
final OverlayState overlay = overlayKey.currentState as OverlayState;
|
final OverlayState overlay = overlayKey.currentState! as OverlayState;
|
||||||
overlay.rearrange(rearranged, below: initialEntries[2]);
|
overlay.rearrange(rearranged, below: initialEntries[2]);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
|
||||||
|
@ -639,7 +636,7 @@ void main() {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
final OverlayState overlay = overlayKey.currentState as OverlayState;
|
final OverlayState overlay = overlayKey.currentState! as OverlayState;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
overlay.insert(
|
overlay.insert(
|
||||||
|
@ -657,8 +654,7 @@ void main() {
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} on AssertionError catch (e) {
|
||||||
expect(e, isAssertionError);
|
|
||||||
expect(e.message, 'Only one of `above` and `below` may be specified.');
|
expect(e.message, 'Only one of `above` and `below` may be specified.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -680,8 +676,7 @@ void main() {
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} on AssertionError catch (e) {
|
||||||
expect(e, isAssertionError);
|
|
||||||
expect(e.message, 'The provided entry used for `above` must be present in the Overlay.');
|
expect(e.message, 'The provided entry used for `above` must be present in the Overlay.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -692,8 +687,7 @@ void main() {
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
|
|
||||||
} catch (e) {
|
} on AssertionError catch (e) {
|
||||||
expect(e, isAssertionError);
|
|
||||||
expect(e.message, 'The provided entry used for `above` must be present in the Overlay and in the `newEntriesList`.');
|
expect(e.message, 'The provided entry used for `above` must be present in the Overlay and in the `newEntriesList`.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -706,7 +700,7 @@ void main() {
|
||||||
textDirection: TextDirection.ltr,
|
textDirection: TextDirection.ltr,
|
||||||
child: Builder(
|
child: Builder(
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
FlutterError error;
|
late FlutterError error;
|
||||||
final Widget debugRequiredFor = Container();
|
final Widget debugRequiredFor = Container();
|
||||||
try {
|
try {
|
||||||
Overlay.of(context, debugRequiredFor: debugRequiredFor);
|
Overlay.of(context, debugRequiredFor: debugRequiredFor);
|
||||||
|
@ -778,7 +772,7 @@ void main() {
|
||||||
expect(newEntry.opaque, isTrue);
|
expect(newEntry.opaque, isTrue);
|
||||||
|
|
||||||
// The new opaqueness is honored when inserted into an overlay.
|
// The new opaqueness is honored when inserted into an overlay.
|
||||||
overlayKey.currentState.insert(newEntry);
|
overlayKey.currentState!.insert(newEntry);
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
expect(find.byKey(root), findsNothing);
|
expect(find.byKey(root), findsNothing);
|
||||||
|
@ -892,7 +886,7 @@ void main() {
|
||||||
expect(tester.state<StatefulTestState>(find.byKey(bottom)).rebuildCount, 1);
|
expect(tester.state<StatefulTestState>(find.byKey(bottom)).rebuildCount, 1);
|
||||||
expect(tester.state<StatefulTestState>(find.byKey(top)).rebuildCount, 1);
|
expect(tester.state<StatefulTestState>(find.byKey(top)).rebuildCount, 1);
|
||||||
|
|
||||||
overlayKey.currentState.rearrange(<OverlayEntry>[
|
overlayKey.currentState!.rearrange(<OverlayEntry>[
|
||||||
bottomEntry, middleEntry, topEntry,
|
bottomEntry, middleEntry, topEntry,
|
||||||
]);
|
]);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
@ -932,7 +926,7 @@ void main() {
|
||||||
await tester.tap(find.byKey(overlayKey));
|
await tester.tap(find.byKey(overlayKey));
|
||||||
expect(bottomTapCount, 1);
|
expect(bottomTapCount, 1);
|
||||||
|
|
||||||
overlayKey.currentState.insert(OverlayEntry(
|
overlayKey.currentState!.insert(OverlayEntry(
|
||||||
maintainState: true,
|
maintainState: true,
|
||||||
opaque: true,
|
opaque: true,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
|
@ -948,7 +942,7 @@ void main() {
|
||||||
expect(bottomTapCount, 1);
|
expect(bottomTapCount, 1);
|
||||||
|
|
||||||
int topTapCount = 0;
|
int topTapCount = 0;
|
||||||
overlayKey.currentState.insert(OverlayEntry(
|
overlayKey.currentState!.insert(OverlayEntry(
|
||||||
maintainState: true,
|
maintainState: true,
|
||||||
opaque: true,
|
opaque: true,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
|
@ -1026,6 +1020,7 @@ void main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('Overlay can set and update clipBehavior', (WidgetTester tester) async {
|
testWidgets('Overlay can set and update clipBehavior', (WidgetTester tester) async {
|
||||||
|
|
||||||
await tester.pumpWidget(
|
await tester.pumpWidget(
|
||||||
Directionality(
|
Directionality(
|
||||||
textDirection: TextDirection.ltr,
|
textDirection: TextDirection.ltr,
|
||||||
|
@ -1040,6 +1035,7 @@ void main() {
|
||||||
);
|
);
|
||||||
|
|
||||||
// By default, clipBehavior should be Clip.hardEdge
|
// By default, clipBehavior should be Clip.hardEdge
|
||||||
|
// ignore: unnecessary_nullable_for_final_variable_declarations
|
||||||
final dynamic renderObject = tester.renderObject(find.byType(Overlay));
|
final dynamic renderObject = tester.renderObject(find.byType(Overlay));
|
||||||
expect(renderObject.clipBehavior, equals(Clip.hardEdge));
|
expect(renderObject.clipBehavior, equals(Clip.hardEdge));
|
||||||
|
|
||||||
|
@ -1063,7 +1059,7 @@ void main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
class StatefulTestWidget extends StatefulWidget {
|
class StatefulTestWidget extends StatefulWidget {
|
||||||
const StatefulTestWidget({Key key}) : super(key: key);
|
const StatefulTestWidget({Key? key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<StatefulTestWidget> createState() => StatefulTestState();
|
State<StatefulTestWidget> createState() => StatefulTestState();
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'dart:math' as math;
|
import 'dart:math' as math;
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
|
|
@ -2,18 +2,16 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
|
|
||||||
class TestTransition extends AnimatedWidget {
|
class TestTransition extends AnimatedWidget {
|
||||||
const TestTransition({
|
const TestTransition({
|
||||||
Key key,
|
Key? key,
|
||||||
this.childFirstHalf,
|
required this.childFirstHalf,
|
||||||
this.childSecondHalf,
|
required this.childSecondHalf,
|
||||||
Animation<double> animation,
|
required Animation<double> animation,
|
||||||
}) : super(key: key, listenable: animation);
|
}) : super(key: key, listenable: animation);
|
||||||
|
|
||||||
final Widget childFirstHalf;
|
final Widget childFirstHalf;
|
||||||
|
@ -29,7 +27,11 @@ class TestTransition extends AnimatedWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class TestRoute<T> extends PageRoute<T> {
|
class TestRoute<T> extends PageRoute<T> {
|
||||||
TestRoute({ this.child, RouteSettings settings, this.barrierColor }) : super(settings: settings);
|
TestRoute({
|
||||||
|
required this.child,
|
||||||
|
required RouteSettings settings,
|
||||||
|
this.barrierColor,
|
||||||
|
}) : super(settings: settings);
|
||||||
|
|
||||||
final Widget child;
|
final Widget child;
|
||||||
|
|
||||||
|
@ -37,10 +39,10 @@ class TestRoute<T> extends PageRoute<T> {
|
||||||
Duration get transitionDuration => const Duration(milliseconds: 150);
|
Duration get transitionDuration => const Duration(milliseconds: 150);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
final Color barrierColor;
|
final Color? barrierColor;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get barrierLabel => null;
|
String? get barrierLabel => null;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get maintainState => false;
|
bool get maintainState => false;
|
||||||
|
@ -88,18 +90,18 @@ void main() {
|
||||||
child: Builder(
|
child: Builder(
|
||||||
key: insideKey,
|
key: insideKey,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
final PageRoute<void> route = ModalRoute.of(context) as PageRoute<void>;
|
final PageRoute<void> route = ModalRoute.of(context)! as PageRoute<void>;
|
||||||
return Column(
|
return Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
TestTransition(
|
TestTransition(
|
||||||
childFirstHalf: const Text('A'),
|
childFirstHalf: const Text('A'),
|
||||||
childSecondHalf: const Text('B'),
|
childSecondHalf: const Text('B'),
|
||||||
animation: route.animation,
|
animation: route.animation!,
|
||||||
),
|
),
|
||||||
TestTransition(
|
TestTransition(
|
||||||
childFirstHalf: const Text('C'),
|
childFirstHalf: const Text('C'),
|
||||||
childSecondHalf: const Text('D'),
|
childSecondHalf: const Text('D'),
|
||||||
animation: route.secondaryAnimation,
|
animation: route.secondaryAnimation!,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
@ -115,7 +117,7 @@ void main() {
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
final NavigatorState navigator = insideKey.currentContext.findAncestorStateOfType<NavigatorState>();
|
final NavigatorState navigator = insideKey.currentContext!.findAncestorStateOfType<NavigatorState>()!;
|
||||||
|
|
||||||
expect(state(), equals('BC')); // transition ->1 is at 1.0
|
expect(state(), equals('BC')); // transition ->1 is at 1.0
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
@ -28,7 +26,7 @@ class HomePage extends StatefulWidget {
|
||||||
|
|
||||||
class _HomePageState extends State<HomePage> {
|
class _HomePageState extends State<HomePage> {
|
||||||
void _presentModalPage() {
|
void _presentModalPage() {
|
||||||
Navigator.of(context).push(PageRouteBuilder<void>(
|
Navigator.of(context)!.push(PageRouteBuilder<void>(
|
||||||
transitionDuration: const Duration(milliseconds: 300),
|
transitionDuration: const Duration(milliseconds: 300),
|
||||||
barrierColor: Colors.black54,
|
barrierColor: Colors.black54,
|
||||||
opaque: false,
|
opaque: false,
|
||||||
|
@ -64,7 +62,7 @@ class ModalPage extends StatelessWidget {
|
||||||
highlightColor: Colors.transparent,
|
highlightColor: Colors.transparent,
|
||||||
splashColor: Colors.transparent,
|
splashColor: Colors.transparent,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context)!.pop();
|
||||||
},
|
},
|
||||||
child: const SizedBox.expand(),
|
child: const SizedBox.expand(),
|
||||||
),
|
),
|
||||||
|
|
|
@ -2,15 +2,13 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
testWidgets('PageStorage read and write', (WidgetTester tester) async {
|
testWidgets('PageStorage read and write', (WidgetTester tester) async {
|
||||||
const Key builderKey = PageStorageKey<String>('builderKey');
|
const Key builderKey = PageStorageKey<String>('builderKey');
|
||||||
StateSetter setState;
|
late StateSetter setState;
|
||||||
int storedValue = 0;
|
int storedValue = 0;
|
||||||
|
|
||||||
await tester.pumpWidget(
|
await tester.pumpWidget(
|
||||||
|
@ -18,7 +16,7 @@ void main() {
|
||||||
home: StatefulBuilder(
|
home: StatefulBuilder(
|
||||||
key: builderKey,
|
key: builderKey,
|
||||||
builder: (BuildContext context, StateSetter setter) {
|
builder: (BuildContext context, StateSetter setter) {
|
||||||
PageStorage.of(context).writeState(context, storedValue);
|
PageStorage.of(context)!.writeState(context, storedValue);
|
||||||
setState = setter;
|
setState = setter;
|
||||||
return Center(
|
return Center(
|
||||||
child: Text('storedValue: $storedValue'),
|
child: Text('storedValue: $storedValue'),
|
||||||
|
@ -30,17 +28,17 @@ void main() {
|
||||||
|
|
||||||
final Element builderElement = tester.element(find.byKey(builderKey));
|
final Element builderElement = tester.element(find.byKey(builderKey));
|
||||||
expect(PageStorage.of(builderElement), isNotNull);
|
expect(PageStorage.of(builderElement), isNotNull);
|
||||||
expect(PageStorage.of(builderElement).readState(builderElement), equals(storedValue));
|
expect(PageStorage.of(builderElement)!.readState(builderElement), equals(storedValue));
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
storedValue = 1;
|
storedValue = 1;
|
||||||
});
|
});
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
expect(PageStorage.of(builderElement).readState(builderElement), equals(storedValue));
|
expect(PageStorage.of(builderElement)!.readState(builderElement), equals(storedValue));
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('PageStorage read and write by identifier', (WidgetTester tester) async {
|
testWidgets('PageStorage read and write by identifier', (WidgetTester tester) async {
|
||||||
StateSetter setState;
|
late StateSetter setState;
|
||||||
int storedValue = 0;
|
int storedValue = 0;
|
||||||
|
|
||||||
Widget buildWidthKey(Key key) {
|
Widget buildWidthKey(Key key) {
|
||||||
|
@ -48,7 +46,7 @@ void main() {
|
||||||
home: StatefulBuilder(
|
home: StatefulBuilder(
|
||||||
key: key,
|
key: key,
|
||||||
builder: (BuildContext context, StateSetter setter) {
|
builder: (BuildContext context, StateSetter setter) {
|
||||||
PageStorage.of(context).writeState(context, storedValue, identifier: 123);
|
PageStorage.of(context)!.writeState(context, storedValue, identifier: 123);
|
||||||
setState = setter;
|
setState = setter;
|
||||||
return Center(
|
return Center(
|
||||||
child: Text('storedValue: $storedValue'),
|
child: Text('storedValue: $storedValue'),
|
||||||
|
@ -62,8 +60,8 @@ void main() {
|
||||||
await tester.pumpWidget(buildWidthKey(key));
|
await tester.pumpWidget(buildWidthKey(key));
|
||||||
Element builderElement = tester.element(find.byKey(key));
|
Element builderElement = tester.element(find.byKey(key));
|
||||||
expect(PageStorage.of(builderElement), isNotNull);
|
expect(PageStorage.of(builderElement), isNotNull);
|
||||||
expect(PageStorage.of(builderElement).readState(builderElement), isNull);
|
expect(PageStorage.of(builderElement)!.readState(builderElement), isNull);
|
||||||
expect(PageStorage.of(builderElement).readState(builderElement, identifier: 123), equals(storedValue));
|
expect(PageStorage.of(builderElement)!.readState(builderElement, identifier: 123), equals(storedValue));
|
||||||
|
|
||||||
// New StatefulBuilder widget - different key - but the same PageStorage identifier.
|
// New StatefulBuilder widget - different key - but the same PageStorage identifier.
|
||||||
|
|
||||||
|
@ -71,14 +69,14 @@ void main() {
|
||||||
await tester.pumpWidget(buildWidthKey(key));
|
await tester.pumpWidget(buildWidthKey(key));
|
||||||
builderElement = tester.element(find.byKey(key));
|
builderElement = tester.element(find.byKey(key));
|
||||||
expect(PageStorage.of(builderElement), isNotNull);
|
expect(PageStorage.of(builderElement), isNotNull);
|
||||||
expect(PageStorage.of(builderElement).readState(builderElement), isNull);
|
expect(PageStorage.of(builderElement)!.readState(builderElement), isNull);
|
||||||
expect(PageStorage.of(builderElement).readState(builderElement, identifier: 123), equals(storedValue));
|
expect(PageStorage.of(builderElement)!.readState(builderElement, identifier: 123), equals(storedValue));
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
storedValue = 1;
|
storedValue = 1;
|
||||||
});
|
});
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
expect(PageStorage.of(builderElement).readState(builderElement, identifier: 123), equals(storedValue));
|
expect(PageStorage.of(builderElement)!.readState(builderElement, identifier: 123), equals(storedValue));
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,13 +2,11 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class TestOverlayRoute extends OverlayRoute<void> {
|
class TestOverlayRoute extends OverlayRoute<void> {
|
||||||
TestOverlayRoute({ RouteSettings settings }) : super(settings: settings);
|
TestOverlayRoute({ RouteSettings? settings }) : super(settings: settings);
|
||||||
@override
|
@override
|
||||||
Iterable<OverlayEntry> createOverlayEntries() sync* {
|
Iterable<OverlayEntry> createOverlayEntries() sync* {
|
||||||
yield OverlayEntry(builder: _build);
|
yield OverlayEntry(builder: _build);
|
||||||
|
@ -17,7 +15,7 @@ class TestOverlayRoute extends OverlayRoute<void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
class PersistentBottomSheetTest extends StatefulWidget {
|
class PersistentBottomSheetTest extends StatefulWidget {
|
||||||
const PersistentBottomSheetTest({ Key key }) : super(key: key);
|
const PersistentBottomSheetTest({ Key? key }) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
PersistentBottomSheetTestState createState() => PersistentBottomSheetTestState();
|
PersistentBottomSheetTestState createState() => PersistentBottomSheetTestState();
|
||||||
|
@ -29,7 +27,7 @@ class PersistentBottomSheetTestState extends State<PersistentBottomSheetTest> {
|
||||||
bool setStateCalled = false;
|
bool setStateCalled = false;
|
||||||
|
|
||||||
void showBottomSheet() {
|
void showBottomSheet() {
|
||||||
_scaffoldKey.currentState.showBottomSheet<void>((BuildContext context) {
|
_scaffoldKey.currentState!.showBottomSheet<void>((BuildContext context) {
|
||||||
return const Text('bottomSheet');
|
return const Text('bottomSheet');
|
||||||
})
|
})
|
||||||
.closed.whenComplete(() {
|
.closed.whenComplete(() {
|
||||||
|
@ -63,9 +61,9 @@ void main() {
|
||||||
expect(find.text('Settings'), findsNothing);
|
expect(find.text('Settings'), findsNothing);
|
||||||
expect(find.text('Overlay'), findsNothing);
|
expect(find.text('Overlay'), findsNothing);
|
||||||
|
|
||||||
expect(Navigator.canPop(containerKey1.currentContext), isFalse);
|
expect(Navigator.canPop(containerKey1.currentContext!), isFalse);
|
||||||
Navigator.pushNamed(containerKey1.currentContext, '/settings');
|
Navigator.pushNamed(containerKey1.currentContext!, '/settings');
|
||||||
expect(Navigator.canPop(containerKey1.currentContext), isTrue);
|
expect(Navigator.canPop(containerKey1.currentContext!), isTrue);
|
||||||
|
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
|
||||||
|
@ -85,7 +83,7 @@ void main() {
|
||||||
expect(find.text('Settings'), isOnstage);
|
expect(find.text('Settings'), isOnstage);
|
||||||
expect(find.text('Overlay'), findsNothing);
|
expect(find.text('Overlay'), findsNothing);
|
||||||
|
|
||||||
Navigator.push(containerKey2.currentContext, TestOverlayRoute());
|
Navigator.push(containerKey2.currentContext!, TestOverlayRoute());
|
||||||
|
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
|
||||||
|
@ -99,8 +97,8 @@ void main() {
|
||||||
expect(find.text('Settings'), isOnstage);
|
expect(find.text('Settings'), isOnstage);
|
||||||
expect(find.text('Overlay'), isOnstage);
|
expect(find.text('Overlay'), isOnstage);
|
||||||
|
|
||||||
expect(Navigator.canPop(containerKey2.currentContext), isTrue);
|
expect(Navigator.canPop(containerKey2.currentContext!), isTrue);
|
||||||
Navigator.pop(containerKey2.currentContext);
|
Navigator.pop(containerKey2.currentContext!);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
|
||||||
expect(find.text('Home'), findsNothing);
|
expect(find.text('Home'), findsNothing);
|
||||||
|
@ -113,8 +111,8 @@ void main() {
|
||||||
expect(find.text('Settings'), isOnstage);
|
expect(find.text('Settings'), isOnstage);
|
||||||
expect(find.text('Overlay'), findsNothing);
|
expect(find.text('Overlay'), findsNothing);
|
||||||
|
|
||||||
expect(Navigator.canPop(containerKey2.currentContext), isTrue);
|
expect(Navigator.canPop(containerKey2.currentContext!), isTrue);
|
||||||
Navigator.pop(containerKey2.currentContext);
|
Navigator.pop(containerKey2.currentContext!);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
|
||||||
|
@ -128,7 +126,7 @@ void main() {
|
||||||
expect(find.text('Settings'), findsNothing);
|
expect(find.text('Settings'), findsNothing);
|
||||||
expect(find.text('Overlay'), findsNothing);
|
expect(find.text('Overlay'), findsNothing);
|
||||||
|
|
||||||
expect(Navigator.canPop(containerKey1.currentContext), isFalse);
|
expect(Navigator.canPop(containerKey1.currentContext!), isFalse);
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('Check back gesture disables Heroes', (WidgetTester tester) async {
|
testWidgets('Check back gesture disables Heroes', (WidgetTester tester) async {
|
||||||
|
@ -161,7 +159,7 @@ void main() {
|
||||||
|
|
||||||
await tester.pumpWidget(MaterialApp(routes: routes));
|
await tester.pumpWidget(MaterialApp(routes: routes));
|
||||||
|
|
||||||
Navigator.pushNamed(containerKey1.currentContext, '/settings');
|
Navigator.pushNamed(containerKey1.currentContext!, '/settings');
|
||||||
|
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
await tester.pump(const Duration(milliseconds: 16));
|
await tester.pump(const Duration(milliseconds: 16));
|
||||||
|
@ -210,7 +208,7 @@ void main() {
|
||||||
|
|
||||||
await tester.pumpWidget(MaterialApp(routes: routes));
|
await tester.pumpWidget(MaterialApp(routes: routes));
|
||||||
|
|
||||||
Navigator.pushNamed(containerKey1.currentContext, '/settings');
|
Navigator.pushNamed(containerKey1.currentContext!, '/settings');
|
||||||
|
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
await tester.pump(const Duration(milliseconds: 100));
|
await tester.pump(const Duration(milliseconds: 100));
|
||||||
|
@ -254,7 +252,7 @@ void main() {
|
||||||
|
|
||||||
await tester.pumpWidget(MaterialApp(routes: routes));
|
await tester.pumpWidget(MaterialApp(routes: routes));
|
||||||
|
|
||||||
Navigator.pushNamed(containerKey1.currentContext, '/sheet');
|
Navigator.pushNamed(containerKey1.currentContext!, '/sheet');
|
||||||
|
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
await tester.pump(const Duration(seconds: 1));
|
await tester.pump(const Duration(seconds: 1));
|
||||||
|
@ -269,7 +267,7 @@ void main() {
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
await tester.pump(const Duration(seconds: 1));
|
await tester.pump(const Duration(seconds: 1));
|
||||||
|
|
||||||
Navigator.pushNamed(containerKey1.currentContext, '/sheet');
|
Navigator.pushNamed(containerKey1.currentContext!, '/sheet');
|
||||||
|
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
await tester.pump(const Duration(seconds: 1));
|
await tester.pump(const Duration(seconds: 1));
|
||||||
|
@ -278,7 +276,7 @@ void main() {
|
||||||
expect(find.text('Sheet'), isOnstage);
|
expect(find.text('Sheet'), isOnstage);
|
||||||
|
|
||||||
// Show the bottom sheet.
|
// Show the bottom sheet.
|
||||||
final PersistentBottomSheetTestState sheet = containerKey2.currentState as PersistentBottomSheetTestState;
|
final PersistentBottomSheetTestState sheet = containerKey2.currentState! as PersistentBottomSheetTestState;
|
||||||
sheet.showBottomSheet();
|
sheet.showBottomSheet();
|
||||||
|
|
||||||
await tester.pump(const Duration(seconds: 1));
|
await tester.pump(const Duration(seconds: 1));
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
|
@ -333,7 +331,7 @@ void main() {
|
||||||
final List<int> log = <int>[];
|
final List<int> log = <int>[];
|
||||||
final PageController controller = PageController(viewportFraction: 0.9);
|
final PageController controller = PageController(viewportFraction: 0.9);
|
||||||
|
|
||||||
Widget build(PageController controller, { Size size }) {
|
Widget build(PageController controller, { Size? size }) {
|
||||||
final Widget pageView = Directionality(
|
final Widget pageView = Directionality(
|
||||||
textDirection: TextDirection.ltr,
|
textDirection: TextDirection.ltr,
|
||||||
child: PageView(
|
child: PageView(
|
||||||
|
@ -429,7 +427,7 @@ void main() {
|
||||||
testWidgets('Page snapping disable and reenable', (WidgetTester tester) async {
|
testWidgets('Page snapping disable and reenable', (WidgetTester tester) async {
|
||||||
final List<int> log = <int>[];
|
final List<int> log = <int>[];
|
||||||
|
|
||||||
Widget build({ bool pageSnapping }) {
|
Widget build({ required bool pageSnapping }) {
|
||||||
return Directionality(
|
return Directionality(
|
||||||
textDirection: TextDirection.ltr,
|
textDirection: TextDirection.ltr,
|
||||||
child: PageView(
|
child: PageView(
|
||||||
|
@ -643,7 +641,7 @@ void main() {
|
||||||
(WidgetTester tester) async {
|
(WidgetTester tester) async {
|
||||||
// Regression test for https://github.com/flutter/flutter/issues/23873.
|
// Regression test for https://github.com/flutter/flutter/issues/23873.
|
||||||
final PageController controller = PageController(viewportFraction: 1/4, initialPage: 0);
|
final PageController controller = PageController(viewportFraction: 1/4, initialPage: 0);
|
||||||
int tappedIndex;
|
late int tappedIndex;
|
||||||
|
|
||||||
Widget build() {
|
Widget build() {
|
||||||
return Directionality(
|
return Directionality(
|
||||||
|
|
|
@ -2,17 +2,14 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:meta/meta.dart';
|
|
||||||
|
|
||||||
Size pageSize = const Size(600.0, 300.0);
|
Size pageSize = const Size(600.0, 300.0);
|
||||||
const List<int> defaultPages = <int>[0, 1, 2, 3, 4, 5];
|
const List<int> defaultPages = <int>[0, 1, 2, 3, 4, 5];
|
||||||
final List<GlobalKey> globalKeys = defaultPages.map<GlobalKey>((_) => GlobalKey()).toList();
|
final List<GlobalKey> globalKeys = defaultPages.map<GlobalKey>((_) => GlobalKey()).toList();
|
||||||
int currentPage;
|
int? currentPage;
|
||||||
|
|
||||||
Widget buildPage(int page) {
|
Widget buildPage(int page) {
|
||||||
return Container(
|
return Container(
|
||||||
|
@ -26,7 +23,7 @@ Widget buildPage(int page) {
|
||||||
Widget buildFrame({
|
Widget buildFrame({
|
||||||
bool reverse = false,
|
bool reverse = false,
|
||||||
List<int> pages = defaultPages,
|
List<int> pages = defaultPages,
|
||||||
@required TextDirection textDirection,
|
required TextDirection textDirection,
|
||||||
}) {
|
}) {
|
||||||
final PageView child = PageView(
|
final PageView child = PageView(
|
||||||
scrollDirection: Axis.horizontal,
|
scrollDirection: Axis.horizontal,
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
@ -13,10 +11,10 @@ import 'test_widgets.dart';
|
||||||
class TestParentData {
|
class TestParentData {
|
||||||
TestParentData({ this.top, this.right, this.bottom, this.left });
|
TestParentData({ this.top, this.right, this.bottom, this.left });
|
||||||
|
|
||||||
final double top;
|
final double? top;
|
||||||
final double right;
|
final double? right;
|
||||||
final double bottom;
|
final double? bottom;
|
||||||
final double left;
|
final double? left;
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkTree(WidgetTester tester, List<TestParentData> expectedParentData) {
|
void checkTree(WidgetTester tester, List<TestParentData> expectedParentData) {
|
||||||
|
@ -27,18 +25,18 @@ void checkTree(WidgetTester tester, List<TestParentData> expectedParentData) {
|
||||||
expect(element.renderObject, isA<RenderStack>());
|
expect(element.renderObject, isA<RenderStack>());
|
||||||
final RenderStack renderObject = element.renderObject as RenderStack;
|
final RenderStack renderObject = element.renderObject as RenderStack;
|
||||||
try {
|
try {
|
||||||
RenderObject child = renderObject.firstChild;
|
RenderObject? child = renderObject.firstChild;
|
||||||
for (final TestParentData expected in expectedParentData) {
|
for (final TestParentData expected in expectedParentData) {
|
||||||
expect(child, isA<RenderDecoratedBox>());
|
expect(child, isA<RenderDecoratedBox>());
|
||||||
final RenderDecoratedBox decoratedBox = child as RenderDecoratedBox;
|
final RenderDecoratedBox decoratedBox = child! as RenderDecoratedBox;
|
||||||
expect(decoratedBox.parentData, isA<StackParentData>());
|
expect(decoratedBox.parentData, isA<StackParentData>());
|
||||||
final StackParentData parentData = decoratedBox.parentData as StackParentData;
|
final StackParentData parentData = decoratedBox.parentData! as StackParentData;
|
||||||
expect(parentData.top, equals(expected.top));
|
expect(parentData.top, equals(expected.top));
|
||||||
expect(parentData.right, equals(expected.right));
|
expect(parentData.right, equals(expected.right));
|
||||||
expect(parentData.bottom, equals(expected.bottom));
|
expect(parentData.bottom, equals(expected.bottom));
|
||||||
expect(parentData.left, equals(expected.left));
|
expect(parentData.left, equals(expected.left));
|
||||||
final StackParentData decoratedBoxParentData = decoratedBox.parentData as StackParentData;
|
final StackParentData? decoratedBoxParentData = decoratedBox.parentData as StackParentData?;
|
||||||
child = decoratedBoxParentData.nextSibling;
|
child = decoratedBoxParentData?.nextSibling;
|
||||||
}
|
}
|
||||||
expect(child, isNull);
|
expect(child, isNull);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -431,7 +429,7 @@ void main() {
|
||||||
child: Container(),
|
child: Container(),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
DummyParentData parentData = tester.renderObject(find.byType(Container)).parentData as DummyParentData;
|
DummyParentData parentData = tester.renderObject(find.byType(Container)).parentData! as DummyParentData;
|
||||||
expect(parentData.string, isNull);
|
expect(parentData.string, isNull);
|
||||||
|
|
||||||
await tester.pumpWidget(
|
await tester.pumpWidget(
|
||||||
|
@ -442,7 +440,7 @@ void main() {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
parentData = tester.renderObject(find.byType(Container)).parentData as DummyParentData;
|
parentData = tester.renderObject(find.byType(Container)).parentData! as DummyParentData;
|
||||||
expect(parentData.string, 'Foo');
|
expect(parentData.string, 'Foo');
|
||||||
|
|
||||||
await tester.pumpWidget(
|
await tester.pumpWidget(
|
||||||
|
@ -453,16 +451,16 @@ void main() {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
parentData = tester.renderObject(find.byType(Container)).parentData as DummyParentData;
|
parentData = tester.renderObject(find.byType(Container)).parentData! as DummyParentData;
|
||||||
expect(parentData.string, 'Bar');
|
expect(parentData.string, 'Bar');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
class TestParentDataWidget extends ParentDataWidget<DummyParentData> {
|
class TestParentDataWidget extends ParentDataWidget<DummyParentData> {
|
||||||
const TestParentDataWidget({
|
const TestParentDataWidget({
|
||||||
Key key,
|
Key? key,
|
||||||
this.string,
|
required this.string,
|
||||||
Widget child,
|
required Widget child,
|
||||||
}) : super(key: key, child: child);
|
}) : super(key: key, child: child);
|
||||||
|
|
||||||
final String string;
|
final String string;
|
||||||
|
@ -470,7 +468,7 @@ class TestParentDataWidget extends ParentDataWidget<DummyParentData> {
|
||||||
@override
|
@override
|
||||||
void applyParentData(RenderObject renderObject) {
|
void applyParentData(RenderObject renderObject) {
|
||||||
assert(renderObject.parentData is DummyParentData);
|
assert(renderObject.parentData is DummyParentData);
|
||||||
final DummyParentData parentData = renderObject.parentData as DummyParentData;
|
final DummyParentData parentData = renderObject.parentData! as DummyParentData;
|
||||||
parentData.string = string;
|
parentData.string = string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -479,13 +477,13 @@ class TestParentDataWidget extends ParentDataWidget<DummyParentData> {
|
||||||
}
|
}
|
||||||
|
|
||||||
class DummyParentData extends ParentData {
|
class DummyParentData extends ParentData {
|
||||||
String string;
|
String? string;
|
||||||
}
|
}
|
||||||
|
|
||||||
class OneAncestorWidget extends SingleChildRenderObjectWidget {
|
class OneAncestorWidget extends SingleChildRenderObjectWidget {
|
||||||
const OneAncestorWidget({
|
const OneAncestorWidget({
|
||||||
Key key,
|
Key? key,
|
||||||
Widget child,
|
required Widget child,
|
||||||
}) : super(key: key, child: child);
|
}) : super(key: key, child: child);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -494,8 +492,8 @@ class OneAncestorWidget extends SingleChildRenderObjectWidget {
|
||||||
|
|
||||||
class AnotherAncestorWidget extends SingleChildRenderObjectWidget {
|
class AnotherAncestorWidget extends SingleChildRenderObjectWidget {
|
||||||
const AnotherAncestorWidget({
|
const AnotherAncestorWidget({
|
||||||
Key key,
|
Key? key,
|
||||||
Widget child,
|
required Widget child,
|
||||||
}) : super(key: key, child: child);
|
}) : super(key: key, child: child);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/widgets.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
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'dart:math' as math show pi;
|
import 'dart:math' as math show pi;
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -106,7 +104,7 @@ void main() {
|
||||||
Future<void> _testStackChildren(
|
Future<void> _testStackChildren(
|
||||||
WidgetTester tester,
|
WidgetTester tester,
|
||||||
List<Widget> children, {
|
List<Widget> children, {
|
||||||
@required int expectedErrorCount,
|
required int expectedErrorCount,
|
||||||
bool enableCheck = true,
|
bool enableCheck = true,
|
||||||
}) async {
|
}) async {
|
||||||
assert(expectedErrorCount != null);
|
assert(expectedErrorCount != null);
|
||||||
|
@ -117,7 +115,7 @@ void main() {
|
||||||
}
|
}
|
||||||
debugDisableShadows = false;
|
debugDisableShadows = false;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
final void Function(FlutterErrorDetails) oldOnError = FlutterError.onError;
|
final void Function(FlutterErrorDetails)? oldOnError = FlutterError.onError;
|
||||||
FlutterError.onError = (FlutterErrorDetails details) {
|
FlutterError.onError = (FlutterErrorDetails details) {
|
||||||
count++;
|
count++;
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/widgets.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
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
@TestOn('!chrome')
|
@TestOn('!chrome')
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
@ -65,7 +63,7 @@ void main() {
|
||||||
);
|
);
|
||||||
|
|
||||||
final FakeAndroidPlatformView fakeView = viewsController.views.first;
|
final FakeAndroidPlatformView fakeView = viewsController.views.first;
|
||||||
final Uint8List rawCreationParams = fakeView.creationParams;
|
final Uint8List rawCreationParams = fakeView.creationParams!;
|
||||||
final ByteData byteData = ByteData.view(
|
final ByteData byteData = ByteData.view(
|
||||||
rawCreationParams.buffer,
|
rawCreationParams.buffer,
|
||||||
rawCreationParams.offsetInBytes,
|
rawCreationParams.offsetInBytes,
|
||||||
|
@ -141,7 +139,7 @@ void main() {
|
||||||
]),
|
]),
|
||||||
);
|
);
|
||||||
|
|
||||||
viewsController.resizeCompleter.complete();
|
viewsController.resizeCompleter!.complete();
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
|
@ -946,7 +944,7 @@ void main() {
|
||||||
expect(semantics.transform, Matrix4.translationValues(600, 500, 0));
|
expect(semantics.transform, Matrix4.translationValues(600, 500, 0));
|
||||||
expect(semantics.childrenCount, 0);
|
expect(semantics.childrenCount, 0);
|
||||||
|
|
||||||
viewsController.createCompleter.complete();
|
viewsController.createCompleter!.complete();
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
expect(semantics.platformViewId, currentViewId + 1);
|
expect(semantics.platformViewId, currentViewId + 1);
|
||||||
|
@ -992,8 +990,8 @@ void main() {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
final Element containerElement = tester.element(find.byKey(containerKey));
|
final Element containerElement = tester.element(find.byKey(containerKey));
|
||||||
final FocusNode androidViewFocusNode = androidViewFocusWidget.focusNode;
|
final FocusNode androidViewFocusNode = androidViewFocusWidget.focusNode!;
|
||||||
final FocusNode containerFocusNode = Focus.of(containerElement);
|
final FocusNode containerFocusNode = Focus.of(containerElement)!;
|
||||||
|
|
||||||
containerFocusNode.requestFocus();
|
containerFocusNode.requestFocus();
|
||||||
|
|
||||||
|
@ -1036,16 +1034,16 @@ void main() {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
viewsController.createCompleter.complete();
|
viewsController.createCompleter!.complete();
|
||||||
|
|
||||||
|
|
||||||
final Element containerElement = tester.element(find.byKey(containerKey));
|
final Element containerElement = tester.element(find.byKey(containerKey));
|
||||||
final FocusNode containerFocusNode = Focus.of(containerElement);
|
final FocusNode containerFocusNode = Focus.of(containerElement)!;
|
||||||
|
|
||||||
containerFocusNode.requestFocus();
|
containerFocusNode.requestFocus();
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
|
||||||
int lastPlatformViewTextClient;
|
late int lastPlatformViewTextClient;
|
||||||
SystemChannels.textInput.setMockMethodCallHandler((MethodCall call) {
|
SystemChannels.textInput.setMockMethodCallHandler((MethodCall call) {
|
||||||
if (call.method == 'TextInput.setPlatformViewClient') {
|
if (call.method == 'TextInput.setPlatformViewClient') {
|
||||||
lastPlatformViewTextClient = call.arguments as int;
|
lastPlatformViewTextClient = call.arguments as int;
|
||||||
|
@ -1085,10 +1083,10 @@ void main() {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
viewsController.createCompleter.complete();
|
viewsController.createCompleter!.complete();
|
||||||
|
|
||||||
final Element containerElement = tester.element(find.byKey(containerKey));
|
final Element containerElement = tester.element(find.byKey(containerKey));
|
||||||
final FocusNode containerFocusNode = Focus.of(containerElement);
|
final FocusNode containerFocusNode = Focus.of(containerElement)!;
|
||||||
|
|
||||||
containerFocusNode.requestFocus();
|
containerFocusNode.requestFocus();
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
@ -1190,7 +1188,7 @@ void main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
group('AndroidViewSurface', () {
|
group('AndroidViewSurface', () {
|
||||||
FakeAndroidViewController controller;
|
late FakeAndroidViewController controller;
|
||||||
|
|
||||||
setUp(() {
|
setUp(() {
|
||||||
controller = FakeAndroidViewController(0);
|
controller = FakeAndroidViewController(0);
|
||||||
|
@ -1314,7 +1312,7 @@ void main() {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
viewsController.creationDelay.complete();
|
viewsController.creationDelay!.complete();
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
viewsController.views,
|
viewsController.views,
|
||||||
|
@ -1378,7 +1376,7 @@ void main() {
|
||||||
);
|
);
|
||||||
|
|
||||||
final FakeUiKitView fakeView = viewsController.views.first;
|
final FakeUiKitView fakeView = viewsController.views.first;
|
||||||
final Uint8List rawCreationParams = fakeView.creationParams;
|
final Uint8List rawCreationParams = fakeView.creationParams!;
|
||||||
final ByteData byteData = ByteData.view(
|
final ByteData byteData = ByteData.view(
|
||||||
rawCreationParams.buffer,
|
rawCreationParams.buffer,
|
||||||
rawCreationParams.offsetInBytes,
|
rawCreationParams.offsetInBytes,
|
||||||
|
@ -1994,7 +1992,7 @@ void main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
group('Common PlatformView', () {
|
group('Common PlatformView', () {
|
||||||
FakePlatformViewController controller;
|
late FakePlatformViewController controller;
|
||||||
|
|
||||||
setUp((){
|
setUp((){
|
||||||
controller = FakePlatformViewController(0);
|
controller = FakePlatformViewController(0);
|
||||||
|
@ -2257,9 +2255,9 @@ void main() {
|
||||||
|
|
||||||
testWidgets('PlatformViewLink Widget init, should create a SizedBox widget before onPlatformViewCreated and a PlatformViewSurface after', (WidgetTester tester) async {
|
testWidgets('PlatformViewLink Widget init, should create a SizedBox widget before onPlatformViewCreated and a PlatformViewSurface after', (WidgetTester tester) async {
|
||||||
final int currentViewId = platformViewsRegistry.getNextPlatformViewId();
|
final int currentViewId = platformViewsRegistry.getNextPlatformViewId();
|
||||||
int createdPlatformViewId;
|
late int createdPlatformViewId;
|
||||||
|
|
||||||
PlatformViewCreatedCallback onPlatformViewCreatedCallBack;
|
late PlatformViewCreatedCallback onPlatformViewCreatedCallBack;
|
||||||
|
|
||||||
final PlatformViewLink platformViewLink = PlatformViewLink(
|
final PlatformViewLink platformViewLink = PlatformViewLink(
|
||||||
viewType: 'webview',
|
viewType: 'webview',
|
||||||
|
@ -2289,7 +2287,7 @@ void main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('PlatformViewLink Widget dispose', (WidgetTester tester) async {
|
testWidgets('PlatformViewLink Widget dispose', (WidgetTester tester) async {
|
||||||
FakePlatformViewController disposedController;
|
late FakePlatformViewController disposedController;
|
||||||
final PlatformViewLink platformViewLink = PlatformViewLink(
|
final PlatformViewLink platformViewLink = PlatformViewLink(
|
||||||
viewType: 'webview',
|
viewType: 'webview',
|
||||||
onCreatePlatformView: (PlatformViewCreationParams params){
|
onCreatePlatformView: (PlatformViewCreationParams params){
|
||||||
|
@ -2454,8 +2452,8 @@ void main() {
|
||||||
|
|
||||||
testWidgets('PlatformViewLink manages the focus properly', (WidgetTester tester) async {
|
testWidgets('PlatformViewLink manages the focus properly', (WidgetTester tester) async {
|
||||||
final GlobalKey containerKey = GlobalKey();
|
final GlobalKey containerKey = GlobalKey();
|
||||||
FakePlatformViewController controller;
|
late FakePlatformViewController controller;
|
||||||
ValueChanged<bool> focusChanged;
|
late ValueChanged<bool> focusChanged;
|
||||||
final PlatformViewLink platformViewLink = PlatformViewLink(
|
final PlatformViewLink platformViewLink = PlatformViewLink(
|
||||||
viewType: 'webview',
|
viewType: 'webview',
|
||||||
onCreatePlatformView: (PlatformViewCreationParams params){
|
onCreatePlatformView: (PlatformViewCreationParams params){
|
||||||
|
@ -2491,9 +2489,9 @@ void main() {
|
||||||
matching: find.byType(Focus),
|
matching: find.byType(Focus),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
final FocusNode platformViewFocusNode = platformViewFocusWidget.focusNode;
|
final FocusNode platformViewFocusNode = platformViewFocusWidget.focusNode!;
|
||||||
final Element containerElement = tester.element(find.byKey(containerKey));
|
final Element containerElement = tester.element(find.byKey(containerKey));
|
||||||
final FocusNode containerFocusNode = Focus.of(containerElement);
|
final FocusNode containerFocusNode = Focus.of(containerElement)!;
|
||||||
|
|
||||||
containerFocusNode.requestFocus();
|
containerFocusNode.requestFocus();
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
@ -78,8 +76,8 @@ void main() {
|
||||||
final GlobalKey key = GlobalKey();
|
final GlobalKey key = GlobalKey();
|
||||||
|
|
||||||
void recordMetrics() {
|
void recordMetrics() {
|
||||||
final RenderBox box = key.currentContext.findRenderObject() as RenderBox;
|
final RenderBox box = key.currentContext!.findRenderObject()! as RenderBox;
|
||||||
final BoxParentData boxParentData = box.parentData as BoxParentData;
|
final BoxParentData boxParentData = box.parentData! as BoxParentData;
|
||||||
sizes.add(box.size);
|
sizes.add(box.size);
|
||||||
positions.add(boxParentData.offset);
|
positions.add(boxParentData.offset);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,14 +2,12 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/gestures.dart';
|
import 'package:flutter/gestures.dart';
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
|
||||||
class ExpandingBox extends StatefulWidget {
|
class ExpandingBox extends StatefulWidget {
|
||||||
const ExpandingBox({this.collapsedSize, this.expandedSize});
|
const ExpandingBox({ required this.collapsedSize, required this.expandedSize });
|
||||||
|
|
||||||
final double collapsedSize;
|
final double collapsedSize;
|
||||||
final double expandedSize;
|
final double expandedSize;
|
||||||
|
@ -19,7 +17,7 @@ class ExpandingBox extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _ExpandingBoxState extends State<ExpandingBox> with AutomaticKeepAliveClientMixin<ExpandingBox>{
|
class _ExpandingBoxState extends State<ExpandingBox> with AutomaticKeepAliveClientMixin<ExpandingBox>{
|
||||||
double _height;
|
late double _height;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:flutter_test/flutter_test.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
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_test/flutter_test.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
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
|
@ -12,7 +10,7 @@ import 'package:flutter/widgets.dart';
|
||||||
@immutable
|
@immutable
|
||||||
class Pair<T> {
|
class Pair<T> {
|
||||||
const Pair(this.first, this.second);
|
const Pair(this.first, this.second);
|
||||||
final T first;
|
final T? first;
|
||||||
final T second;
|
final T second;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -31,10 +29,10 @@ class Pair<T> {
|
||||||
/// and the other child in the bottom half. It will swap which child is on top
|
/// and the other child in the bottom half. It will swap which child is on top
|
||||||
/// and which is on bottom every time the widget is rendered.
|
/// and which is on bottom every time the widget is rendered.
|
||||||
abstract class Swapper extends RenderObjectWidget {
|
abstract class Swapper extends RenderObjectWidget {
|
||||||
const Swapper({this.stable, this.swapper});
|
const Swapper({ this.stable, this.swapper });
|
||||||
|
|
||||||
final Widget stable;
|
final Widget? stable;
|
||||||
final Widget swapper;
|
final Widget? swapper;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
SwapperElement createElement();
|
SwapperElement createElement();
|
||||||
|
@ -45,8 +43,8 @@ abstract class Swapper extends RenderObjectWidget {
|
||||||
|
|
||||||
class SwapperWithProperOverrides extends Swapper {
|
class SwapperWithProperOverrides extends Swapper {
|
||||||
const SwapperWithProperOverrides({
|
const SwapperWithProperOverrides({
|
||||||
Widget stable,
|
Widget? stable,
|
||||||
Widget swapper,
|
Widget? swapper,
|
||||||
}) : super(stable: stable, swapper: swapper);
|
}) : super(stable: stable, swapper: swapper);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -55,8 +53,8 @@ class SwapperWithProperOverrides extends Swapper {
|
||||||
|
|
||||||
class SwapperWithNoOverrides extends Swapper {
|
class SwapperWithNoOverrides extends Swapper {
|
||||||
const SwapperWithNoOverrides({
|
const SwapperWithNoOverrides({
|
||||||
Widget stable,
|
Widget? stable,
|
||||||
Widget swapper,
|
Widget? swapper,
|
||||||
}) : super(stable: stable, swapper: swapper);
|
}) : super(stable: stable, swapper: swapper);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -65,8 +63,8 @@ class SwapperWithNoOverrides extends Swapper {
|
||||||
|
|
||||||
class SwapperWithDeprecatedOverrides extends Swapper {
|
class SwapperWithDeprecatedOverrides extends Swapper {
|
||||||
const SwapperWithDeprecatedOverrides({
|
const SwapperWithDeprecatedOverrides({
|
||||||
Widget stable,
|
Widget? stable,
|
||||||
Widget swapper,
|
Widget? swapper,
|
||||||
}) : super(stable: stable, swapper: swapper);
|
}) : super(stable: stable, swapper: swapper);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -76,8 +74,8 @@ class SwapperWithDeprecatedOverrides extends Swapper {
|
||||||
abstract class SwapperElement extends RenderObjectElement {
|
abstract class SwapperElement extends RenderObjectElement {
|
||||||
SwapperElement(Swapper widget) : super(widget);
|
SwapperElement(Swapper widget) : super(widget);
|
||||||
|
|
||||||
Element stable;
|
Element? stable;
|
||||||
Element swapper;
|
Element? swapper;
|
||||||
bool swapperIsOnTop = true;
|
bool swapperIsOnTop = true;
|
||||||
List<dynamic> insertSlots = <dynamic>[];
|
List<dynamic> insertSlots = <dynamic>[];
|
||||||
List<Pair<dynamic>> moveSlots = <Pair<dynamic>>[];
|
List<Pair<dynamic>> moveSlots = <Pair<dynamic>>[];
|
||||||
|
@ -92,9 +90,9 @@ abstract class SwapperElement extends RenderObjectElement {
|
||||||
@override
|
@override
|
||||||
void visitChildren(ElementVisitor visitor) {
|
void visitChildren(ElementVisitor visitor) {
|
||||||
if (stable != null)
|
if (stable != null)
|
||||||
visitor(stable);
|
visitor(stable!);
|
||||||
if (swapper != null)
|
if (swapper != null)
|
||||||
visitor(swapper);
|
visitor(swapper!);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -104,7 +102,7 @@ abstract class SwapperElement extends RenderObjectElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void mount(Element parent, dynamic newSlot) {
|
void mount(Element? parent, dynamic newSlot) {
|
||||||
super.mount(parent, newSlot);
|
super.mount(parent, newSlot);
|
||||||
_updateChildren(widget);
|
_updateChildren(widget);
|
||||||
}
|
}
|
||||||
|
@ -183,22 +181,22 @@ class SwapperElementWithDeprecatedOverrides extends SwapperElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
class RenderSwapper extends RenderBox {
|
class RenderSwapper extends RenderBox {
|
||||||
RenderBox _stable;
|
RenderBox? _stable;
|
||||||
RenderBox get stable => _stable;
|
RenderBox? get stable => _stable;
|
||||||
set stable(RenderBox child) {
|
set stable(RenderBox? child) {
|
||||||
if (child == _stable)
|
if (child == _stable)
|
||||||
return;
|
return;
|
||||||
if (_stable != null)
|
if (_stable != null)
|
||||||
dropChild(_stable);
|
dropChild(_stable!);
|
||||||
_stable = child;
|
_stable = child;
|
||||||
if (child != null)
|
if (child != null)
|
||||||
adoptChild(child);
|
adoptChild(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _swapperIsOnTop;
|
bool? _swapperIsOnTop;
|
||||||
RenderBox _swapper;
|
RenderBox? _swapper;
|
||||||
RenderBox get swapper => _swapper;
|
RenderBox? get swapper => _swapper;
|
||||||
void setSwapper(RenderBox child, bool isOnTop) {
|
void setSwapper(RenderBox? child, bool isOnTop) {
|
||||||
if (isOnTop != _swapperIsOnTop) {
|
if (isOnTop != _swapperIsOnTop) {
|
||||||
_swapperIsOnTop = isOnTop;
|
_swapperIsOnTop = isOnTop;
|
||||||
markNeedsLayout();
|
markNeedsLayout();
|
||||||
|
@ -206,7 +204,7 @@ class RenderSwapper extends RenderBox {
|
||||||
if (child == _swapper)
|
if (child == _swapper)
|
||||||
return;
|
return;
|
||||||
if (_swapper != null)
|
if (_swapper != null)
|
||||||
dropChild(_swapper);
|
dropChild(_swapper!);
|
||||||
_swapper = child;
|
_swapper = child;
|
||||||
if (child != null)
|
if (child != null)
|
||||||
adoptChild(child);
|
adoptChild(child);
|
||||||
|
@ -215,9 +213,9 @@ class RenderSwapper extends RenderBox {
|
||||||
@override
|
@override
|
||||||
void visitChildren(RenderObjectVisitor visitor) {
|
void visitChildren(RenderObjectVisitor visitor) {
|
||||||
if (_stable != null)
|
if (_stable != null)
|
||||||
visitor(_stable);
|
visitor(_stable!);
|
||||||
if (_swapper != null)
|
if (_swapper != null)
|
||||||
visitor(_swapper);
|
visitor(_swapper!);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -244,21 +242,21 @@ class RenderSwapper extends RenderBox {
|
||||||
maxHeight: constraints.maxHeight / 2,
|
maxHeight: constraints.maxHeight / 2,
|
||||||
);
|
);
|
||||||
if (_stable != null) {
|
if (_stable != null) {
|
||||||
final BoxParentData stableParentData = _stable.parentData as BoxParentData;
|
final BoxParentData stableParentData = _stable!.parentData! as BoxParentData;
|
||||||
_stable.layout(childConstraints);
|
_stable!.layout(childConstraints);
|
||||||
stableParentData.offset = _swapperIsOnTop ? bottomOffset : topOffset;
|
stableParentData.offset = _swapperIsOnTop! ? bottomOffset : topOffset;
|
||||||
}
|
}
|
||||||
if (_swapper != null) {
|
if (_swapper != null) {
|
||||||
final BoxParentData swapperParentData = _swapper.parentData as BoxParentData;
|
final BoxParentData swapperParentData = _swapper!.parentData! as BoxParentData;
|
||||||
_swapper.layout(childConstraints);
|
_swapper!.layout(childConstraints);
|
||||||
swapperParentData.offset = _swapperIsOnTop ? topOffset : bottomOffset;
|
swapperParentData.offset = _swapperIsOnTop! ? topOffset : bottomOffset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void paint(PaintingContext context, Offset offset) {
|
void paint(PaintingContext context, Offset offset) {
|
||||||
visitChildren((RenderObject child) {
|
visitChildren((RenderObject child) {
|
||||||
final BoxParentData childParentData = child.parentData as BoxParentData;
|
final BoxParentData childParentData = child.parentData! as BoxParentData;
|
||||||
context.paintChild(child, offset + childParentData.offset);
|
context.paintChild(child, offset + childParentData.offset);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -269,7 +267,7 @@ class RenderSwapper extends RenderBox {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BoxParentData parentDataFor(RenderObject renderObject) => renderObject.parentData as BoxParentData;
|
BoxParentData parentDataFor(RenderObject renderObject) => renderObject.parentData! as BoxParentData;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
testWidgets('RenderObjectElement *RenderObjectChild methods get called with correct arguments', (WidgetTester tester) async {
|
testWidgets('RenderObjectElement *RenderObjectChild methods get called with correct arguments', (WidgetTester tester) async {
|
||||||
|
@ -356,7 +354,7 @@ void main() {
|
||||||
expect(swapper.insertSlots.length, 2);
|
expect(swapper.insertSlots.length, 2);
|
||||||
expect(swapper.moveSlots.length, 1);
|
expect(swapper.moveSlots.length, 1);
|
||||||
expect(swapper.removeSlots.length, 2);
|
expect(swapper.removeSlots.length, 2);
|
||||||
expect(swapper.removeSlots, <bool>[null,null]);
|
expect(swapper.removeSlots, <bool?>[null,null]);
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('RenderObjectElement *ChildRenderObject methods fail with deprecation message', (WidgetTester tester) async {
|
testWidgets('RenderObjectElement *ChildRenderObject methods fail with deprecation message', (WidgetTester tester) async {
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
@ -16,8 +14,8 @@ final BoxDecoration kBoxDecorationC = BoxDecoration(border: nonconst(null));
|
||||||
|
|
||||||
class TestWidget extends StatelessWidget {
|
class TestWidget extends StatelessWidget {
|
||||||
const TestWidget({
|
const TestWidget({
|
||||||
Key key,
|
Key? key,
|
||||||
this.child,
|
required this.child,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
final Widget child;
|
final Widget child;
|
||||||
|
@ -27,18 +25,16 @@ class TestWidget extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class TestOrientedBox extends SingleChildRenderObjectWidget {
|
class TestOrientedBox extends SingleChildRenderObjectWidget {
|
||||||
const TestOrientedBox({ Key key, Widget child }) : super(key: key, child: child);
|
const TestOrientedBox({ Key? key, Widget? child }) : super(key: key, child: child);
|
||||||
|
|
||||||
Decoration _getDecoration(BuildContext context) {
|
Decoration _getDecoration(BuildContext context) {
|
||||||
final Orientation orientation = MediaQuery.of(context).orientation;
|
final Orientation orientation = MediaQuery.of(context)!.orientation;
|
||||||
switch (orientation) {
|
switch (orientation) {
|
||||||
case Orientation.landscape:
|
case Orientation.landscape:
|
||||||
return const BoxDecoration(color: Color(0xFF00FF00));
|
return const BoxDecoration(color: Color(0xFF00FF00));
|
||||||
case Orientation.portrait:
|
case Orientation.portrait:
|
||||||
return const BoxDecoration(color: Color(0xFF0000FF));
|
return const BoxDecoration(color: Color(0xFF0000FF));
|
||||||
}
|
}
|
||||||
assert(orientation != null);
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -51,7 +47,7 @@ class TestOrientedBox extends SingleChildRenderObjectWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class TestNonVisitingWidget extends SingleChildRenderObjectWidget {
|
class TestNonVisitingWidget extends SingleChildRenderObjectWidget {
|
||||||
const TestNonVisitingWidget({ Key key, Widget child }) : super(key: key, child: child);
|
const TestNonVisitingWidget({ Key? key, required Widget child }) : super(key: key, child: child);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
RenderObject createRenderObject(BuildContext context) => TestNonVisitingRenderObject();
|
RenderObject createRenderObject(BuildContext context) => TestNonVisitingRenderObject();
|
||||||
|
@ -60,13 +56,13 @@ class TestNonVisitingWidget extends SingleChildRenderObjectWidget {
|
||||||
class TestNonVisitingRenderObject extends RenderBox with RenderObjectWithChildMixin<RenderBox> {
|
class TestNonVisitingRenderObject extends RenderBox with RenderObjectWithChildMixin<RenderBox> {
|
||||||
@override
|
@override
|
||||||
void performLayout() {
|
void performLayout() {
|
||||||
child.layout(constraints, parentUsesSize: true);
|
child!.layout(constraints, parentUsesSize: true);
|
||||||
size = child.size;
|
size = child!.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void paint(PaintingContext context, Offset offset) {
|
void paint(PaintingContext context, Offset offset) {
|
||||||
context.paintChild(child, offset);
|
context.paintChild(child!, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -107,7 +103,7 @@ void main() {
|
||||||
expect(renderObject.position, equals(DecorationPosition.background));
|
expect(renderObject.position, equals(DecorationPosition.background));
|
||||||
expect(renderObject.child, isNotNull);
|
expect(renderObject.child, isNotNull);
|
||||||
expect(renderObject.child, isA<RenderDecoratedBox>());
|
expect(renderObject.child, isA<RenderDecoratedBox>());
|
||||||
final RenderDecoratedBox child = renderObject.child as RenderDecoratedBox;
|
final RenderDecoratedBox child = renderObject.child! as RenderDecoratedBox;
|
||||||
expect(child.decoration, equals(kBoxDecorationB));
|
expect(child.decoration, equals(kBoxDecorationB));
|
||||||
expect(child.position, equals(DecorationPosition.background));
|
expect(child.position, equals(DecorationPosition.background));
|
||||||
expect(child.child, isNull);
|
expect(child.child, isNull);
|
||||||
|
@ -196,10 +192,10 @@ void main() {
|
||||||
expect(element.renderObject, isA<RenderDecoratedBox>());
|
expect(element.renderObject, isA<RenderDecoratedBox>());
|
||||||
final RenderDecoratedBox parent = element.renderObject as RenderDecoratedBox;
|
final RenderDecoratedBox parent = element.renderObject as RenderDecoratedBox;
|
||||||
expect(parent.child, isA<RenderDecoratedBox>());
|
expect(parent.child, isA<RenderDecoratedBox>());
|
||||||
final RenderDecoratedBox child = parent.child as RenderDecoratedBox;
|
final RenderDecoratedBox child = parent.child! as RenderDecoratedBox;
|
||||||
expect(child.decoration, equals(kBoxDecorationB));
|
expect(child.decoration, equals(kBoxDecorationB));
|
||||||
expect(child.child, isA<RenderDecoratedBox>());
|
expect(child.child, isA<RenderDecoratedBox>());
|
||||||
final RenderDecoratedBox grandChild = child.child as RenderDecoratedBox;
|
final RenderDecoratedBox grandChild = child.child! as RenderDecoratedBox;
|
||||||
expect(grandChild.decoration, equals(kBoxDecorationC));
|
expect(grandChild.decoration, equals(kBoxDecorationC));
|
||||||
expect(grandChild.child, isNull);
|
expect(grandChild.child, isNull);
|
||||||
|
|
||||||
|
|
|
@ -2,15 +2,17 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
|
||||||
// This is a regression test for https://github.com/flutter/flutter/issues/5588.
|
// This is a regression test for https://github.com/flutter/flutter/issues/5588.
|
||||||
|
|
||||||
class OrderSwitcher extends StatefulWidget {
|
class OrderSwitcher extends StatefulWidget {
|
||||||
const OrderSwitcher({ Key key, this.a, this.b }) : super(key: key);
|
const OrderSwitcher({
|
||||||
|
Key? key,
|
||||||
|
required this.a,
|
||||||
|
required this.b,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
final Widget a;
|
final Widget a;
|
||||||
final Widget b;
|
final Widget b;
|
||||||
|
@ -47,7 +49,7 @@ class OrderSwitcherState extends State<OrderSwitcher> {
|
||||||
}
|
}
|
||||||
|
|
||||||
class DummyStatefulWidget extends StatefulWidget {
|
class DummyStatefulWidget extends StatefulWidget {
|
||||||
const DummyStatefulWidget(Key key) : super(key: key);
|
const DummyStatefulWidget(Key? key) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
DummyStatefulWidgetState createState() => DummyStatefulWidgetState();
|
DummyStatefulWidgetState createState() => DummyStatefulWidgetState();
|
||||||
|
@ -60,18 +62,18 @@ class DummyStatefulWidgetState extends State<DummyStatefulWidget> {
|
||||||
|
|
||||||
class RekeyableDummyStatefulWidgetWrapper extends StatefulWidget {
|
class RekeyableDummyStatefulWidgetWrapper extends StatefulWidget {
|
||||||
const RekeyableDummyStatefulWidgetWrapper({
|
const RekeyableDummyStatefulWidgetWrapper({
|
||||||
Key key,
|
Key? key,
|
||||||
this.child,
|
this.child,
|
||||||
this.initialKey,
|
required this.initialKey,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
final Widget child;
|
final Widget? child;
|
||||||
final GlobalKey initialKey;
|
final GlobalKey initialKey;
|
||||||
@override
|
@override
|
||||||
RekeyableDummyStatefulWidgetWrapperState createState() => RekeyableDummyStatefulWidgetWrapperState();
|
RekeyableDummyStatefulWidgetWrapperState createState() => RekeyableDummyStatefulWidgetWrapperState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class RekeyableDummyStatefulWidgetWrapperState extends State<RekeyableDummyStatefulWidgetWrapper> {
|
class RekeyableDummyStatefulWidgetWrapperState extends State<RekeyableDummyStatefulWidgetWrapper> {
|
||||||
GlobalKey _key;
|
GlobalKey? _key;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
@ -79,7 +81,7 @@ class RekeyableDummyStatefulWidgetWrapperState extends State<RekeyableDummyState
|
||||||
_key = widget.initialKey;
|
_key = widget.initialKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _setChild(GlobalKey value) {
|
void _setChild(GlobalKey? value) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_key = value;
|
_key = value;
|
||||||
});
|
});
|
||||||
|
@ -160,7 +162,7 @@ void main() {
|
||||||
expect(find.byType(RekeyableDummyStatefulWidgetWrapper), findsNWidgets(2));
|
expect(find.byType(RekeyableDummyStatefulWidgetWrapper), findsNWidgets(2));
|
||||||
expect(find.byType(DummyStatefulWidget), findsNWidgets(2));
|
expect(find.byType(DummyStatefulWidget), findsNWidgets(2));
|
||||||
|
|
||||||
keyRoot.currentState.switchChildren();
|
keyRoot.currentState!.switchChildren();
|
||||||
final List<State> states = tester.stateList(find.byType(RekeyableDummyStatefulWidgetWrapper)).toList();
|
final List<State> states = tester.stateList(find.byType(RekeyableDummyStatefulWidgetWrapper)).toList();
|
||||||
final RekeyableDummyStatefulWidgetWrapperState a = states[0] as RekeyableDummyStatefulWidgetWrapperState;
|
final RekeyableDummyStatefulWidgetWrapperState a = states[0] as RekeyableDummyStatefulWidgetWrapperState;
|
||||||
a._setChild(null);
|
a._setChild(null);
|
||||||
|
|
|
@ -2,33 +2,31 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
class StateMarker extends StatefulWidget {
|
class StateMarker extends StatefulWidget {
|
||||||
const StateMarker({ Key key, this.child }) : super(key: key);
|
const StateMarker({ Key? key, this.child }) : super(key: key);
|
||||||
|
|
||||||
final Widget child;
|
final Widget? child;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
StateMarkerState createState() => StateMarkerState();
|
StateMarkerState createState() => StateMarkerState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class StateMarkerState extends State<StateMarker> {
|
class StateMarkerState extends State<StateMarker> {
|
||||||
String marker;
|
String? marker;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (widget.child != null)
|
if (widget.child != null)
|
||||||
return widget.child;
|
return widget.child!;
|
||||||
return Container();
|
return Container();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class DeactivateLogger extends StatefulWidget {
|
class DeactivateLogger extends StatefulWidget {
|
||||||
const DeactivateLogger({ Key key, this.log }) : super(key: key);
|
const DeactivateLogger({ required Key key, required this.log }) : super(key: key);
|
||||||
|
|
||||||
final List<String> log;
|
final List<String> log;
|
||||||
|
|
||||||
|
@ -73,9 +71,9 @@ void main() {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
final StateMarkerState leftState = left.currentState as StateMarkerState;
|
final StateMarkerState leftState = left.currentState! as StateMarkerState;
|
||||||
leftState.marker = 'left';
|
leftState.marker = 'left';
|
||||||
final StateMarkerState rightState = right.currentState as StateMarkerState;
|
final StateMarkerState rightState = right.currentState! as StateMarkerState;
|
||||||
rightState.marker = 'right';
|
rightState.marker = 'right';
|
||||||
|
|
||||||
final StateMarkerState grandchildState = tester.state(find.byWidget(grandchild));
|
final StateMarkerState grandchildState = tester.state(find.byWidget(grandchild));
|
||||||
|
@ -144,9 +142,9 @@ void main() {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
final StateMarkerState leftState = left.currentState as StateMarkerState;
|
final StateMarkerState leftState = left.currentState! as StateMarkerState;
|
||||||
leftState.marker = 'left';
|
leftState.marker = 'left';
|
||||||
final StateMarkerState rightState = right.currentState as StateMarkerState;
|
final StateMarkerState rightState = right.currentState! as StateMarkerState;
|
||||||
rightState.marker = 'right';
|
rightState.marker = 'right';
|
||||||
|
|
||||||
final StateMarkerState grandchildState = tester.state(find.byWidget(grandchild));
|
final StateMarkerState grandchildState = tester.state(find.byWidget(grandchild));
|
||||||
|
@ -198,7 +196,7 @@ void main() {
|
||||||
|
|
||||||
await tester.pumpWidget(StateMarker(key: key));
|
await tester.pumpWidget(StateMarker(key: key));
|
||||||
|
|
||||||
final StateMarkerState keyState = key.currentState as StateMarkerState;
|
final StateMarkerState keyState = key.currentState! as StateMarkerState;
|
||||||
keyState.marker = 'marked';
|
keyState.marker = 'marked';
|
||||||
|
|
||||||
await tester.pumpWidget(
|
await tester.pumpWidget(
|
||||||
|
@ -237,7 +235,7 @@ void main() {
|
||||||
],
|
],
|
||||||
));
|
));
|
||||||
|
|
||||||
final StateMarkerState keyState = key.currentState as StateMarkerState;
|
final StateMarkerState keyState = key.currentState!as StateMarkerState;
|
||||||
keyState.marker = 'marked';
|
keyState.marker = 'marked';
|
||||||
|
|
||||||
await tester.pumpWidget(Stack(
|
await tester.pumpWidget(Stack(
|
||||||
|
@ -275,7 +273,7 @@ void main() {
|
||||||
],
|
],
|
||||||
));
|
));
|
||||||
|
|
||||||
final StateMarkerState keyState = key.currentState as StateMarkerState;
|
final StateMarkerState keyState = key.currentState! as StateMarkerState;
|
||||||
keyState.marker = 'marked';
|
keyState.marker = 'marked';
|
||||||
|
|
||||||
await tester.pumpWidget(Stack(
|
await tester.pumpWidget(Stack(
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'dart:ui' as ui show window;
|
import 'dart:ui' as ui show window;
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -12,7 +10,7 @@ import 'package:flutter_test/flutter_test.dart';
|
||||||
// This is a regression test for https://github.com/flutter/flutter/issues/5840.
|
// This is a regression test for https://github.com/flutter/flutter/issues/5840.
|
||||||
|
|
||||||
class Bar extends StatefulWidget {
|
class Bar extends StatefulWidget {
|
||||||
const Bar({ Key key }) : super(key: key);
|
const Bar({ Key? key }) : super(key: key);
|
||||||
@override
|
@override
|
||||||
BarState createState() => BarState();
|
BarState createState() => BarState();
|
||||||
}
|
}
|
||||||
|
@ -49,7 +47,7 @@ class BarState extends State<Bar> {
|
||||||
}
|
}
|
||||||
|
|
||||||
class StatefulCreationCounter extends StatefulWidget {
|
class StatefulCreationCounter extends StatefulWidget {
|
||||||
const StatefulCreationCounter({ Key key }) : super(key: key);
|
const StatefulCreationCounter({ Key? key }) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
StatefulCreationCounterState createState() => StatefulCreationCounterState();
|
StatefulCreationCounterState createState() => StatefulCreationCounterState();
|
||||||
|
@ -82,9 +80,9 @@ void main() {
|
||||||
testWidgets('Clean then reparent with dependencies', (WidgetTester tester) async {
|
testWidgets('Clean then reparent with dependencies', (WidgetTester tester) async {
|
||||||
int layoutBuilderBuildCount = 0;
|
int layoutBuilderBuildCount = 0;
|
||||||
|
|
||||||
StateSetter keyedSetState;
|
late StateSetter keyedSetState;
|
||||||
StateSetter layoutBuilderSetState;
|
late StateSetter layoutBuilderSetState;
|
||||||
StateSetter childSetState;
|
late StateSetter childSetState;
|
||||||
|
|
||||||
final GlobalKey key = GlobalKey();
|
final GlobalKey key = GlobalKey();
|
||||||
final Widget keyedWidget = StatefulBuilder(
|
final Widget keyedWidget = StatefulBuilder(
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
// @dart = 2.8
|
|
||||||
|
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
@ -19,14 +17,6 @@ void main() {
|
||||||
expect(() => _TestRestorableValue().value, throwsAssertionError);
|
expect(() => _TestRestorableValue().value, throwsAssertionError);
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('cannot initialize with null', (WidgetTester tester) async {
|
|
||||||
expect(() => RestorableNum<num>(null), throwsAssertionError);
|
|
||||||
expect(() => RestorableDouble(null), throwsAssertionError);
|
|
||||||
expect(() => RestorableInt(null), throwsAssertionError);
|
|
||||||
expect(() => RestorableString(null).value, throwsAssertionError);
|
|
||||||
expect(() => RestorableBool(null).value, throwsAssertionError);
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('work when not in restoration scope', (WidgetTester tester) async {
|
testWidgets('work when not in restoration scope', (WidgetTester tester) async {
|
||||||
await tester.pumpWidget(const _RestorableWidget());
|
await tester.pumpWidget(const _RestorableWidget());
|
||||||
|
|
||||||
|
@ -119,22 +109,6 @@ void main() {
|
||||||
expect(find.text('guten tag'), findsOneWidget);
|
expect(find.text('guten tag'), findsOneWidget);
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('cannot set to null', (WidgetTester tester) async {
|
|
||||||
await tester.pumpWidget(const RootRestorationScope(
|
|
||||||
restorationId: 'root-child',
|
|
||||||
child: _RestorableWidget(),
|
|
||||||
));
|
|
||||||
|
|
||||||
expect(find.text('hello world'), findsOneWidget);
|
|
||||||
final _RestorableWidgetState state = tester.state(find.byType(_RestorableWidget));
|
|
||||||
|
|
||||||
expect(() => state.numValue.value = null, throwsAssertionError);
|
|
||||||
expect(() => state.doubleValue.value = null, throwsAssertionError);
|
|
||||||
expect(() => state.intValue.value = null, throwsAssertionError);
|
|
||||||
expect(() => state.stringValue.value = null, throwsAssertionError);
|
|
||||||
expect(() => state.boolValue.value = null, throwsAssertionError);
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('restore to older state', (WidgetTester tester) async {
|
testWidgets('restore to older state', (WidgetTester tester) async {
|
||||||
await tester.pumpWidget(const RootRestorationScope(
|
await tester.pumpWidget(const RootRestorationScope(
|
||||||
restorationId: 'root-child',
|
restorationId: 'root-child',
|
||||||
|
@ -320,7 +294,7 @@ class _TestRestorableValue extends RestorableValue<Object> {
|
||||||
int didUpdateValueCallCount = 0;
|
int didUpdateValueCallCount = 0;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void didUpdateValue(Object oldValue) {
|
void didUpdateValue(Object? oldValue) {
|
||||||
didUpdateValueCallCount++;
|
didUpdateValueCallCount++;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
@ -337,7 +311,7 @@ class _TestRestorableValue extends RestorableValue<Object> {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _RestorableWidget extends StatefulWidget {
|
class _RestorableWidget extends StatefulWidget {
|
||||||
const _RestorableWidget({Key key}) : super(key: key);
|
const _RestorableWidget({Key? key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<_RestorableWidget> createState() => _RestorableWidgetState();
|
State<_RestorableWidget> createState() => _RestorableWidgetState();
|
||||||
|
@ -353,7 +327,7 @@ class _RestorableWidgetState extends State<_RestorableWidget> with RestorationMi
|
||||||
final _TestRestorableValue objectValue = _TestRestorableValue();
|
final _TestRestorableValue objectValue = _TestRestorableValue();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void restoreState(RestorationBucket oldBucket, bool initialRestore) {
|
void restoreState(RestorationBucket? oldBucket, bool initialRestore) {
|
||||||
registerForRestoration(numValue, 'num');
|
registerForRestoration(numValue, 'num');
|
||||||
registerForRestoration(doubleValue, 'double');
|
registerForRestoration(doubleValue, 'double');
|
||||||
registerForRestoration(intValue, 'int');
|
registerForRestoration(intValue, 'int');
|
||||||
|
@ -369,7 +343,7 @@ class _RestorableWidgetState extends State<_RestorableWidget> with RestorationMi
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Text(stringValue.value ?? 'null', textDirection: TextDirection.ltr,);
|
return Text(stringValue.value, textDirection: TextDirection.ltr,);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
Loading…
Reference in a new issue