flutter/examples/api/lib/widgets/framework/build_owner.0.dart
Valentin Vignal 086c07cc05
Add test for build_owner.0.dart (#157499)
Contributes to https://github.com/flutter/flutter/issues/130459

It adds a test for
- `examples/api/lib/widgets/framework/build_owner.0.dart`
2024-10-25 07:13:22 +00:00

82 lines
2.1 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.
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;
}