/// /// flutter test command: /// `flutter test --update-goldens flutter_widget_rebuild_repaint_test.dart` /// import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; /// /// widget rebuild, repaint test /// void main() { testWidgets('StatefulWidget context', (WidgetTester tester) async { // set device size TestWidgetsFlutterBinding binding = tester.binding; binding.window.physicalSizeTestValue = Size(400, 700); binding.window.devicePixelRatioTestValue = 1.0; // prepare widget & finder var widget = StatefulBlock(); var widgetFinder = find.byType(StatefulBlock); // 1st render ui await tester.pumpWidget(widget); await expectLater( widgetFinder, matchesGoldenFile('widget_rebuild_before.png')); // enable repaint rainbow debugRepaintRainbowEnabled = true; // trigger rebuild StatefulBlock.state.setState(() => 0); // 2nd render ui await tester.pumpWidget(widget); await expectLater( widgetFinder, matchesGoldenFile('widget_rebuild_after.png')); }); } /// 有狀態 Block class StatefulBlock extends StatefulWidget { static BlockState state; @override State createState() => state = BlockState(); } class BlockState extends State { @override Widget build(BuildContext context) { print('BlockState.build();'); Color color = Random().nextInt(2) == 0 ? Colors.blue : Colors.red; return Container(color: color, padding: EdgeInsets.all(10)); } }