| // 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. |
| |
| /// Flutter code sample for [BuildOwner]. |
| |
| import 'package:flutter/material.dart'; |
| import 'package:flutter/rendering.dart'; |
| |
| void main() { |
| WidgetsFlutterBinding.ensureInitialized(); |
| final Size size = measureWidget(const SizedBox(width: 640, height: 480)); |
| |
| // Just displays the size calculated above. |
| runApp( |
| WidgetsApp( |
| title: 'BuildOwner Sample', |
| color: const Color(0xff000000), |
| builder: (BuildContext context, Widget? child) { |
| return Scaffold( |
| body: Center( |
| child: Text(size.toString()), |
| ), |
| ); |
| }, |
| ), |
| ); |
| } |
| |
| Size measureWidget(Widget widget) { |
| final PipelineOwner pipelineOwner = PipelineOwner(); |
| final MeasurementView rootView = pipelineOwner.rootNode = MeasurementView(); |
| final BuildOwner buildOwner = BuildOwner(focusManager: FocusManager()); |
| final RenderObjectToWidgetElement<RenderBox> element = RenderObjectToWidgetAdapter<RenderBox>( |
| container: rootView, |
| debugShortDescription: '[root]', |
| child: widget, |
| ).attachToRenderTree(buildOwner); |
| try { |
| rootView.scheduleInitialLayout(); |
| pipelineOwner.flushLayout(); |
| return rootView.size; |
| } finally { |
| // Clean up. |
| element.update(RenderObjectToWidgetAdapter<RenderBox>(container: rootView)); |
| buildOwner.finalizeTree(); |
| } |
| } |
| |
| class MeasurementView extends RenderBox with RenderObjectWithChildMixin<RenderBox> { |
| @override |
| void performLayout() { |
| assert(child != null); |
| child!.layout(const BoxConstraints(), parentUsesSize: true); |
| size = child!.size; |
| } |
| |
| @override |
| void debugAssertDoesMeetConstraints() => true; |
| } |