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.

5 6
// @dart = 2.8

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

10
class InnerWidget extends StatefulWidget {
11
  const InnerWidget({ Key key }) : super(key: key);
12 13

  @override
14
  InnerWidgetState createState() => InnerWidgetState();
15
}
16

17
class InnerWidgetState extends State<InnerWidget> {
18 19
  bool _didInitState = false;

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

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

32
class OuterContainer extends StatefulWidget {
33
  const OuterContainer({ Key key, this.child }) : super(key: key);
34

35
  final InnerWidget child;
36

37
  @override
38
  OuterContainerState createState() => OuterContainerState();
39
}
40

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

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

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

58
    await tester.pumpWidget(outer1);
59

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

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

69
    await tester.pumpWidget(outer2);
70 71 72 73

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

74
    expect(innerElementState.widget, equals(inner2));
75 76 77
    expect(innerElementState._didInitState, isTrue);
    expect(innerElement.renderObject.attached, isTrue);

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

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