mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
61 lines
1.7 KiB
Dart
61 lines
1.7 KiB
Dart
// 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;
|
|
}
|