blob: b9d397af404e6df33a9fd01d6e025c7e03ae6306 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
class InnerWidget extends StatefulWidget {
const InnerWidget({ Key? key }) : super(key: key);
@override
InnerWidgetState createState() => InnerWidgetState();
}
class InnerWidgetState extends State<InnerWidget> {
bool _didInitState = false;
@override
void initState() {
super.initState();
_didInitState = true;
}
@override
Widget build(BuildContext context) {
return Container();
}
}
class OuterContainer extends StatefulWidget {
const OuterContainer({ Key? key, required this.child }) : super(key: key);
final InnerWidget child;
@override
OuterContainerState createState() => OuterContainerState();
}
class OuterContainerState extends State<OuterContainer> {
@override
Widget build(BuildContext context) {
return widget.child;
}
}
void main() {
testWidgets('resync stateful widget', (WidgetTester tester) async {
const Key innerKey = Key('inner');
const Key outerKey = Key('outer');
const InnerWidget inner1 = InnerWidget(key: innerKey);
InnerWidget inner2;
const OuterContainer outer1 = OuterContainer(key: outerKey, child: inner1);
OuterContainer outer2;
await tester.pumpWidget(outer1);
final StatefulElement innerElement = tester.element(find.byKey(innerKey));
final InnerWidgetState innerElementState = innerElement.state as InnerWidgetState;
expect(innerElementState.widget, equals(inner1));
expect(innerElementState._didInitState, isTrue);
expect(innerElement.renderObject!.attached, isTrue);
inner2 = const InnerWidget(key: innerKey);
outer2 = OuterContainer(key: outerKey, child: inner2);
await tester.pumpWidget(outer2);
expect(tester.element(find.byKey(innerKey)), equals(innerElement));
expect(innerElement.state, equals(innerElementState));
expect(innerElementState.widget, equals(inner2));
expect(innerElementState._didInitState, isTrue);
expect(innerElement.renderObject!.attached, isTrue);
final StatefulElement outerElement = tester.element(find.byKey(outerKey));
expect(outerElement.state.widget, equals(outer2));
outerElement.markNeedsBuild();
await tester.pump();
expect(tester.element(find.byKey(innerKey)), equals(innerElement));
expect(innerElement.state, equals(innerElementState));
expect(innerElementState.widget, equals(inner2));
expect(innerElement.renderObject!.attached, isTrue);
});
}