// 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/material.dart'; import 'package:flutter/rendering.dart'; import '../flutter_test_alternative.dart'; import 'rendering_tester.dart'; class RenderLayoutTestBox extends RenderProxyBox { RenderLayoutTestBox(this.onLayout); final VoidCallback onLayout; @override void layout(Constraints constraints, { bool parentUsesSize = false }) { // Doing this in tests is ok, but if you're writing your own // render object, you want to override performLayout(), not // layout(). Overriding layout() would remove many critical // performance optimizations of the rendering system, as well as // many bypassing many checked-mode integrity checks. super.layout(constraints, parentUsesSize: parentUsesSize); onLayout(); } @override bool get sizedByParent => true; @override void performLayout() { } } void main() { test('moving children', () { RenderBox child1, child2; bool movedChild1 = false; bool movedChild2 = false; final RenderFlex block = RenderFlex(textDirection: TextDirection.ltr); block.add(child1 = RenderLayoutTestBox(() { movedChild1 = true; })); block.add(child2 = RenderLayoutTestBox(() { movedChild2 = true; })); expect(movedChild1, isFalse); expect(movedChild2, isFalse); layout(block); expect(movedChild1, isTrue); expect(movedChild2, isTrue); movedChild1 = false; movedChild2 = false; expect(movedChild1, isFalse); expect(movedChild2, isFalse); pumpFrame(); expect(movedChild1, isFalse); expect(movedChild2, isFalse); block.move(child1, after: child2); expect(movedChild1, isFalse); expect(movedChild2, isFalse); pumpFrame(); expect(movedChild1, isTrue); expect(movedChild2, isTrue); movedChild1 = false; movedChild2 = false; expect(movedChild1, isFalse); expect(movedChild2, isFalse); pumpFrame(); expect(movedChild1, isFalse); expect(movedChild2, isFalse); }); }