| // 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/foundation.dart'; |
| import 'package:flutter/widgets.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| |
| void main() { |
| testWidgets('reassemble with a className only marks subtrees from the first matching element as dirty', (WidgetTester tester) async { |
| await tester.pumpWidget( |
| const Foo(Bar(Fizz(SizedBox()))) |
| ); |
| |
| expect(Foo.count, 0); |
| expect(Bar.count, 0); |
| expect(Fizz.count, 0); |
| |
| DebugReassembleConfig config = DebugReassembleConfig(widgetName: 'Bar'); |
| WidgetsBinding.instance!.buildOwner!.reassemble(WidgetsBinding.instance!.renderViewElement!, config); |
| |
| expect(Foo.count, 0); |
| expect(Bar.count, 1); |
| expect(Fizz.count, 1); |
| |
| config = DebugReassembleConfig(widgetName: 'Fizz'); |
| WidgetsBinding.instance!.buildOwner!.reassemble(WidgetsBinding.instance!.renderViewElement!, config); |
| |
| expect(Foo.count, 0); |
| expect(Bar.count, 1); |
| expect(Fizz.count, 2); |
| |
| config = DebugReassembleConfig(widgetName: 'NoMatch'); |
| WidgetsBinding.instance!.buildOwner!.reassemble(WidgetsBinding.instance!.renderViewElement!, config); |
| |
| expect(Foo.count, 0); |
| expect(Bar.count, 1); |
| expect(Fizz.count, 2); |
| |
| config = DebugReassembleConfig(); |
| WidgetsBinding.instance!.buildOwner!.reassemble(WidgetsBinding.instance!.renderViewElement!, config); |
| |
| expect(Foo.count, 1); |
| expect(Bar.count, 2); |
| expect(Fizz.count, 3); |
| |
| WidgetsBinding.instance!.buildOwner!.reassemble(WidgetsBinding.instance!.renderViewElement!, null); |
| |
| expect(Foo.count, 2); |
| expect(Bar.count, 3); |
| expect(Fizz.count, 4); |
| }); |
| } |
| |
| class Foo extends StatefulWidget { |
| const Foo(this.child, {Key? key}) : super(key: key); |
| |
| final Widget child; |
| static int count = 0; |
| |
| @override |
| State<Foo> createState() => _FooState(); |
| } |
| |
| class _FooState extends State<Foo> { |
| @override |
| void reassemble() { |
| Foo.count += 1; |
| super.reassemble(); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| return widget.child; |
| } |
| } |
| |
| |
| class Bar extends StatefulWidget { |
| const Bar(this.child, {Key? key}) : super(key: key); |
| |
| final Widget child; |
| static int count = 0; |
| |
| @override |
| State<Bar> createState() => _BarState(); |
| } |
| |
| class _BarState extends State<Bar> { |
| @override |
| void reassemble() { |
| Bar.count += 1; |
| super.reassemble(); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| return widget.child; |
| } |
| } |
| |
| class Fizz extends StatefulWidget { |
| const Fizz(this.child, {Key? key}) : super(key: key); |
| |
| final Widget child; |
| static int count = 0; |
| |
| @override |
| State<Fizz> createState() => _FizzState(); |
| } |
| |
| class _FizzState extends State<Fizz> { |
| @override |
| void reassemble() { |
| Fizz.count += 1; |
| super.reassemble(); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| return widget.child; |
| } |
| } |