| // 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'; | |
| /// Flutter code sample for [BuildOwner]. | |
| void main() { | |
| runApp(const BuildOwnerExample()); | |
| } | |
| class BuildOwnerExample extends StatefulWidget { | |
| const BuildOwnerExample({super.key}); | |
| @override | |
| State<BuildOwnerExample> createState() => _BuildOwnerExampleState(); | |
| } | |
| class _BuildOwnerExampleState extends State<BuildOwnerExample> { | |
| late final Size size; | |
| @override | |
| void initState() { | |
| super.initState(); | |
| size = measureWidget(const SizedBox(width: 640, height: 480)); | |
| } | |
| @override | |
| Widget build(BuildContext context) { | |
| // Just displays the size calculated above. | |
| return 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; | |
| } |