stateful_components_test.dart 2.59 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
Hixie's avatar
Hixie committed
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

Adam Barth's avatar
Adam Barth committed
5
import 'package:flutter_test/flutter_test.dart';
6
import 'package:flutter/widgets.dart';
7

8
class InnerWidget extends StatefulWidget {
9
  const InnerWidget({ Key? key }) : super(key: key);
10 11

  @override
12
  InnerWidgetState createState() => InnerWidgetState();
13
}
14

15
class InnerWidgetState extends State<InnerWidget> {
16 17
  bool _didInitState = false;

18
  @override
19 20
  void initState() {
    super.initState();
21 22 23
    _didInitState = true;
  }

24
  @override
25
  Widget build(BuildContext context) {
26
    return Container();
27 28 29
  }
}

30
class OuterContainer extends StatefulWidget {
31
  const OuterContainer({ Key? key, required this.child }) : super(key: key);
32

33
  final InnerWidget child;
34

35
  @override
36
  OuterContainerState createState() => OuterContainerState();
37
}
38

39
class OuterContainerState extends State<OuterContainer> {
40
  @override
41
  Widget build(BuildContext context) {
42
    return widget.child;
43 44 45 46
  }
}

void main() {
47
  testWidgets('resync stateful widget', (WidgetTester tester) async {
48 49
    const Key innerKey = Key('inner');
    const Key outerKey = Key('outer');
50

51
    const InnerWidget inner1 = InnerWidget(key: innerKey);
52
    InnerWidget inner2;
53
    const OuterContainer outer1 = OuterContainer(key: outerKey, child: inner1);
54 55
    OuterContainer outer2;

56
    await tester.pumpWidget(outer1);
57

58
    final StatefulElement innerElement = tester.element(find.byKey(innerKey));
59
    final InnerWidgetState innerElementState = innerElement.state as InnerWidgetState;
60
    expect(innerElementState.widget, equals(inner1));
61
    expect(innerElementState._didInitState, isTrue);
62
    expect(innerElement.renderObject!.attached, isTrue);
63

64
    inner2 = const InnerWidget(key: innerKey);
65
    outer2 = OuterContainer(key: outerKey, child: inner2);
66

67
    await tester.pumpWidget(outer2);
68 69 70 71

    expect(tester.element(find.byKey(innerKey)), equals(innerElement));
    expect(innerElement.state, equals(innerElementState));

72
    expect(innerElementState.widget, equals(inner2));
73
    expect(innerElementState._didInitState, isTrue);
74
    expect(innerElement.renderObject!.attached, isTrue);
75

76
    final StatefulElement outerElement = tester.element(find.byKey(outerKey));
77
    expect(outerElement.state.widget, equals(outer2));
78
    outerElement.markNeedsBuild();
79
    await tester.pump();
80 81 82

    expect(tester.element(find.byKey(innerKey)), equals(innerElement));
    expect(innerElement.state, equals(innerElementState));
83
    expect(innerElementState.widget, equals(inner2));
84
    expect(innerElement.renderObject!.attached, isTrue);
85 86
  });
}