Kate Lovett a04fb324be
Bump Dart to 3.8 and reformat (#171703)
Bumps the Dart version to 3.8 across the repo (excluding
engine/src/flutter/third_party) and applies formatting updates from Dart
3.8.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [ ] I listed at least one issue that this PR fixes in the description
above.
- [ ] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
2025-07-07 17:58:32 +00:00

177 lines
5.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.
import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
import 'rendering_tester.dart';
void main() {
TestRenderingFlutterBinding.ensureInitialized();
test('RenderBaseline', () {
RenderBaseline parent;
RenderSizedBox child;
final RenderBox root = RenderPositionedBox(
alignment: Alignment.topLeft,
child: parent = RenderBaseline(
baseline: 0.0,
baselineType: TextBaseline.alphabetic,
child: child = RenderSizedBox(const Size(100.0, 100.0)),
),
);
final BoxParentData childParentData = child.parentData! as BoxParentData;
layout(root);
expect(childParentData.offset.dx, equals(0.0));
expect(childParentData.offset.dy, equals(-100.0));
expect(parent.size, equals(const Size(100.0, 0.0)));
parent.baseline = 25.0;
pumpFrame();
expect(childParentData.offset.dx, equals(0.0));
expect(childParentData.offset.dy, equals(-75.0));
expect(parent.size, equals(const Size(100.0, 25.0)));
parent.baseline = 90.0;
pumpFrame();
expect(childParentData.offset.dx, equals(0.0));
expect(childParentData.offset.dy, equals(-10.0));
expect(parent.size, equals(const Size(100.0, 90.0)));
parent.baseline = 100.0;
pumpFrame();
expect(childParentData.offset.dx, equals(0.0));
expect(childParentData.offset.dy, equals(0.0));
expect(parent.size, equals(const Size(100.0, 100.0)));
parent.baseline = 110.0;
pumpFrame();
expect(childParentData.offset.dx, equals(0.0));
expect(childParentData.offset.dy, equals(10.0));
expect(parent.size, equals(const Size(100.0, 110.0)));
});
test('RenderBaseline different baseline types', () {
final _RenderBaselineTester child = _RenderBaselineTester()
..boxSize = const Size.square(100)
..alphabeticBaselineOffset = 50
..ideographicBaselineOffset = 60;
final RenderBaseline renderBaseline = RenderBaseline(
baseline: 1.0,
baselineType: TextBaseline.alphabetic,
child: child,
);
layout(renderBaseline, phase: EnginePhase.paint);
expect(renderBaseline.getDryBaseline(const BoxConstraints(), TextBaseline.alphabetic), 1.0);
expect(renderBaseline.getDryBaseline(const BoxConstraints(), TextBaseline.ideographic), 11.0);
child
..alphabeticBaselineOffset = null
..ideographicBaselineOffset = null
..markNeedsLayout(); // Clears baseline cache.
renderBaseline.markNeedsLayout();
pumpFrame(phase: EnginePhase.paint);
expect(renderBaseline.getDryBaseline(const BoxConstraints(), TextBaseline.alphabetic), isNull);
expect(renderBaseline.getDryBaseline(const BoxConstraints(), TextBaseline.ideographic), isNull);
});
test('RenderFlex and RenderIgnoreBaseline (control test -- with baseline)', () {
final RenderBox a, b;
final RenderBox root = RenderFlex(
crossAxisAlignment: CrossAxisAlignment.baseline,
textBaseline: TextBaseline.alphabetic,
textDirection: TextDirection.ltr,
children: <RenderBox>[
a = RenderParagraph(
const TextSpan(
text: 'a',
style: TextStyle(fontSize: 128.0, fontFamily: 'FlutterTest'),
), // places baseline at y=96
textDirection: TextDirection.ltr,
),
b = RenderParagraph(
const TextSpan(
text: 'b',
style: TextStyle(fontSize: 32.0, fontFamily: 'FlutterTest'),
), // 24 above baseline, 8 below baseline
textDirection: TextDirection.ltr,
),
],
);
layout(root);
final Offset aPos = a.localToGlobal(Offset.zero);
final Offset bPos = b.localToGlobal(Offset.zero);
expect(aPos.dy, 0.0);
expect(bPos.dy, 96.0 - 24.0);
});
test('RenderFlex and RenderIgnoreBaseline (with ignored baseline)', () {
final RenderBox a, b;
final RenderBox root = RenderFlex(
crossAxisAlignment: CrossAxisAlignment.baseline,
textBaseline: TextBaseline.alphabetic,
textDirection: TextDirection.ltr,
children: <RenderBox>[
RenderIgnoreBaseline(
child: a = RenderParagraph(
const TextSpan(
text: 'a',
style: TextStyle(fontSize: 128.0, fontFamily: 'FlutterTest'),
),
textDirection: TextDirection.ltr,
),
),
b = RenderParagraph(
const TextSpan(
text: 'b',
style: TextStyle(fontSize: 32.0, fontFamily: 'FlutterTest'),
),
textDirection: TextDirection.ltr,
),
],
);
layout(root);
final Offset aPos = a.localToGlobal(Offset.zero);
final Offset bPos = b.localToGlobal(Offset.zero);
expect(aPos.dy, 0.0);
expect(bPos.dy, 0.0);
});
}
class _RenderBaselineTester extends RenderBox {
Size boxSize = Size.zero;
double? alphabeticBaselineOffset;
double? ideographicBaselineOffset;
@override
double? computeDistanceToActualBaseline(TextBaseline baseline) {
return switch (baseline) {
TextBaseline.alphabetic => alphabeticBaselineOffset,
TextBaseline.ideographic => ideographicBaselineOffset,
};
}
@override
double? computeDryBaseline(covariant BoxConstraints constraints, TextBaseline baseline) {
return switch (baseline) {
TextBaseline.alphabetic => alphabeticBaselineOffset,
TextBaseline.ideographic => ideographicBaselineOffset,
};
}
@override
Size computeDryLayout(covariant BoxConstraints constraints) => constraints.constrain(boxSize);
@override
void performLayout() {
size = computeDryLayout(constraints);
}
}