Do not use ideographic baseline for RenderPargraph baseline (#35493)
This commit is contained in:
parent
5b6ebf1230
commit
a0c47e2216
@ -318,7 +318,12 @@ class RenderParagraph extends RenderBox
|
||||
assert(constraints != null);
|
||||
assert(constraints.debugAssertIsValid());
|
||||
_layoutTextWithConstraints(constraints);
|
||||
return _textPainter.computeDistanceToActualBaseline(baseline);
|
||||
// TODO(garyq): Since our metric for ideographic baseline is currently inacurrate
|
||||
// and the non-alphabetic baselines are based off of the alphabetic baseline, we
|
||||
// use the alphabetic for now to produce correct layouts. We should eventually change
|
||||
// this back to pass the `baseline` property when the ideographic baseline is properly
|
||||
// implemented (https://github.com/flutter/flutter/issues/22625).
|
||||
return _textPainter.computeDistanceToActualBaseline(TextBaseline.alphabetic);
|
||||
}
|
||||
|
||||
// Intrinsics cannot be calculated without a full layout for
|
||||
|
183
packages/flutter_localizations/test/text_test.dart
Normal file
183
packages/flutter_localizations/test/text_test.dart
Normal file
@ -0,0 +1,183 @@
|
||||
// Copyright 2016 The Chromium 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/widgets.dart';
|
||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
void main() {
|
||||
testWidgets('Text baseline with CJK locale', (WidgetTester tester) async {
|
||||
// This test in combination with 'Text baseline with EN locale' verify the baselines
|
||||
// used to align text with ideographic baselines are reasonable. We are currently
|
||||
// using the alphabetic baseline to lay out as the ideographic baseline is not yet
|
||||
// properly implemented. When the ideographic baseline is better defined and implemented,
|
||||
// the values of this test should change very slightly. See the issue this is based off
|
||||
// of: https://github.com/flutter/flutter/issues/25782.
|
||||
final Key targetKey = UniqueKey();
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
routes: <String, WidgetBuilder>{
|
||||
'/next': (BuildContext context) {
|
||||
return const Text('Next');
|
||||
},
|
||||
},
|
||||
localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
|
||||
GlobalMaterialLocalizations.delegate,
|
||||
],
|
||||
supportedLocales: const <Locale>[
|
||||
Locale('en', 'US'),
|
||||
Locale('es', 'ES'),
|
||||
Locale('zh', 'CN'),
|
||||
],
|
||||
locale: const Locale('zh', 'CN'),
|
||||
home: Material(
|
||||
child: Center(
|
||||
child: Builder(
|
||||
key: targetKey,
|
||||
builder: (BuildContext context) {
|
||||
return PopupMenuButton<int>(
|
||||
onSelected: (int value) {
|
||||
Navigator.pushNamed(context, '/next');
|
||||
},
|
||||
itemBuilder: (BuildContext context) {
|
||||
return <PopupMenuItem<int>>[
|
||||
PopupMenuItem<int>(
|
||||
value: 1,
|
||||
child: Text(
|
||||
'hello, world',
|
||||
style: TextStyle(color: Colors.blue),
|
||||
),
|
||||
),
|
||||
PopupMenuItem<int>(
|
||||
value: 2,
|
||||
child: Text(
|
||||
'你好,世界',
|
||||
style: TextStyle(color: Colors.blue),
|
||||
),
|
||||
),
|
||||
];
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
await tester.tap(find.byKey(targetKey));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('hello, world'), findsOneWidget);
|
||||
expect(find.text('你好,世界'), findsOneWidget);
|
||||
|
||||
Offset topLeft = tester.getTopLeft(find.text('hello, world'));
|
||||
Offset topRight = tester.getTopRight(find.text('hello, world'));
|
||||
Offset bottomLeft = tester.getBottomLeft(find.text('hello, world'));
|
||||
Offset bottomRight = tester.getBottomRight(find.text('hello, world'));
|
||||
|
||||
expect(topLeft, const Offset(392.0, 298.3999996185303));
|
||||
expect(topRight, const Offset(596.0, 298.3999996185303));
|
||||
expect(bottomLeft, const Offset(392.0, 315.3999996185303));
|
||||
expect(bottomRight, const Offset(596.0, 315.3999996185303));
|
||||
|
||||
topLeft = tester.getTopLeft(find.text('你好,世界'));
|
||||
topRight = tester.getTopRight(find.text('你好,世界'));
|
||||
bottomLeft = tester.getBottomLeft(find.text('你好,世界'));
|
||||
bottomRight = tester.getBottomRight(find.text('你好,世界'));
|
||||
|
||||
expect(topLeft, const Offset(392.0, 346.3999996185303));
|
||||
expect(topRight, const Offset(477.0, 346.3999996185303));
|
||||
expect(bottomLeft, const Offset(392.0, 363.3999996185303));
|
||||
expect(bottomRight, const Offset(477.0, 363.3999996185303));
|
||||
}, skip: !isLinux);
|
||||
|
||||
testWidgets('Text baseline with EN locale', (WidgetTester tester) async {
|
||||
// This test in combination with 'Text baseline with CJK locale' verify the baselines
|
||||
// used to align text with ideographic baselines are reasonable. We are currently
|
||||
// using the alphabetic baseline to lay out as the ideographic baseline is not yet
|
||||
// properly implemented. When the ideographic baseline is better defined and implemented,
|
||||
// the values of this test should change very slightly. See the issue this is based off
|
||||
// of: https://github.com/flutter/flutter/issues/25782.
|
||||
final Key targetKey = UniqueKey();
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
routes: <String, WidgetBuilder>{
|
||||
'/next': (BuildContext context) {
|
||||
return const Text('Next');
|
||||
},
|
||||
},
|
||||
localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
|
||||
GlobalMaterialLocalizations.delegate,
|
||||
],
|
||||
supportedLocales: const <Locale>[
|
||||
Locale('en', 'US'),
|
||||
Locale('es', 'ES'),
|
||||
Locale('zh', 'CN'),
|
||||
],
|
||||
locale: const Locale('en', 'US'),
|
||||
home: Material(
|
||||
child: Center(
|
||||
child: Builder(
|
||||
key: targetKey,
|
||||
builder: (BuildContext context) {
|
||||
return PopupMenuButton<int>(
|
||||
onSelected: (int value) {
|
||||
Navigator.pushNamed(context, '/next');
|
||||
},
|
||||
itemBuilder: (BuildContext context) {
|
||||
return <PopupMenuItem<int>>[
|
||||
PopupMenuItem<int>(
|
||||
value: 1,
|
||||
child: Text(
|
||||
'hello, world',
|
||||
style: TextStyle(color: Colors.blue),
|
||||
),
|
||||
),
|
||||
PopupMenuItem<int>(
|
||||
value: 2,
|
||||
child: Text(
|
||||
'你好,世界',
|
||||
style: TextStyle(color: Colors.blue),
|
||||
),
|
||||
),
|
||||
];
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
await tester.tap(find.byKey(targetKey));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('hello, world'), findsOneWidget);
|
||||
expect(find.text('你好,世界'), findsOneWidget);
|
||||
|
||||
Offset topLeft = tester.getTopLeft(find.text('hello, world'));
|
||||
Offset topRight = tester.getTopRight(find.text('hello, world'));
|
||||
Offset bottomLeft = tester.getBottomLeft(find.text('hello, world'));
|
||||
Offset bottomRight = tester.getBottomRight(find.text('hello, world'));
|
||||
|
||||
|
||||
expect(topLeft, const Offset(392.0, 299.19999980926514));
|
||||
expect(topRight, const Offset(584.0, 299.19999980926514));
|
||||
expect(bottomLeft, const Offset(392.0, 315.19999980926514));
|
||||
expect(bottomRight, const Offset(584.0, 315.19999980926514));
|
||||
|
||||
topLeft = tester.getTopLeft(find.text('你好,世界'));
|
||||
topRight = tester.getTopRight(find.text('你好,世界'));
|
||||
bottomLeft = tester.getBottomLeft(find.text('你好,世界'));
|
||||
bottomRight = tester.getBottomRight(find.text('你好,世界'));
|
||||
|
||||
expect(topLeft, const Offset(392.0, 347.19999980926514));
|
||||
expect(topRight, const Offset(472.0, 347.19999980926514));
|
||||
expect(bottomLeft, const Offset(392.0, 363.19999980926514));
|
||||
expect(bottomRight, const Offset(472.0, 363.19999980926514));
|
||||
}, skip: !isLinux);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user