build_scope_test.dart 3.11 KB
Newer Older
Hixie's avatar
Hixie committed
1 2 3 4
// Copyright 2015 The Chromium Authors. All rights reserved.
// 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

Adam Barth's avatar
Adam Barth committed
8
import 'test_widgets.dart';
9

10
class ProbeWidget extends StatefulWidget {
11
  @override
12 13 14 15 16 17
  ProbeWidgetState createState() => new ProbeWidgetState();
}

class ProbeWidgetState extends State<ProbeWidget> {
  static int buildCount = 0;

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

24
  @override
25 26 27 28
  void didUpdateConfig(ProbeWidget oldConfig) {
    setState(() {});
  }

29
  @override
30 31 32 33 34 35 36
  Widget build(BuildContext context) {
    setState(() {});
    buildCount++;
    return new Container();
  }
}

37
class BadWidget extends StatelessWidget {
38 39 40 41
  BadWidget(this.parentState);

  final State parentState;

42
  @override
43 44 45 46 47 48
  Widget build(BuildContext context) {
    parentState.setState(() {});
    return new Container();
  }
}

49
class BadWidgetParent extends StatefulWidget {
50
  @override
51 52 53 54
  BadWidgetParentState createState() => new BadWidgetParentState();
}

class BadWidgetParentState extends State<BadWidgetParent> {
55
  @override
56 57 58 59 60
  Widget build(BuildContext context) {
    return new BadWidget(this);
  }
}

61
class BadDisposeWidget extends StatefulWidget {
62
  @override
63 64 65 66
  BadDisposeWidgetState createState() => new BadDisposeWidgetState();
}

class BadDisposeWidgetState extends State<BadDisposeWidget> {
67
  @override
68 69 70 71
  Widget build(BuildContext context) {
    return new Container();
  }

72
  @override
73
  void dispose() {
74
    setState(() { /* This is invalid behavior. */ });
75 76 77 78 79
    super.dispose();
  }
}

void main() {
80
  testWidgets('Legal times for setState', (WidgetTester tester) async {
81 82
    GlobalKey flipKey = new GlobalKey();
    expect(ProbeWidgetState.buildCount, equals(0));
83
    await tester.pumpWidget(new ProbeWidget());
84
    expect(ProbeWidgetState.buildCount, equals(1));
85
    await tester.pumpWidget(new ProbeWidget());
86
    expect(ProbeWidgetState.buildCount, equals(2));
87
    await tester.pumpWidget(new FlipWidget(
88 89 90 91 92 93 94
      key: flipKey,
      left: new Container(),
      right: new ProbeWidget()
    ));
    expect(ProbeWidgetState.buildCount, equals(2));
    FlipWidgetState flipState1 = flipKey.currentState;
    flipState1.flip();
95
    await tester.pump();
96 97 98
    expect(ProbeWidgetState.buildCount, equals(3));
    FlipWidgetState flipState2 = flipKey.currentState;
    flipState2.flip();
99
    await tester.pump();
100
    expect(ProbeWidgetState.buildCount, equals(3));
101
    await tester.pumpWidget(new Container());
102
    expect(ProbeWidgetState.buildCount, equals(3));
103 104
  });

105 106
  testWidgets('Setting parent state during build is forbidden', (WidgetTester tester) async {
    await tester.pumpWidget(new BadWidgetParent());
107
    expect(tester.takeException(), isNotNull);
108
    await tester.pumpWidget(new Container());
109 110
  });

111 112
  testWidgets('Setting state during dispose is forbidden', (WidgetTester tester) async {
    await tester.pumpWidget(new BadDisposeWidget());
113
    expect(tester.takeException(), isNull);
114
    await tester.pumpWidget(new Container());
115
    expect(tester.takeException(), isNotNull);
116 117
  });
}