Это из-за разницы шрифтов, используемых flutter test
и flutter run
.
Шрифт Flutter по умолчанию Roboto
для Android, если вы не меняли его другим шрифтом.
- По умолчанию Android:
Roboto
шрифт и для iOS: San Francisco
шрифт - Настроить https://flutter.dev/docs/cookbook/design/fonts
Либо 1) или 2) эти шрифты по умолчанию недоступны для flutter test
. В тесте на флаттер намеренно используется шрифт Ahem
, который состоит из квадратных блоков, которые вы видите на скриншоте.
Это предварительный просмотр:
Ahem
квадрат шрифта намного больше обычного, который вы используете. Следовательно, это вызывает RenderFlex overflow error
Решение
Для достижения почти идеальной эмуляции вашего устройства в flutter test
вам необходимо загрузить данные шрифта, а затем загрузить именно тот шрифт, который вы используете. .
Чтобы загрузить шрифт в тесте виджета, вы должны сделать это внутри функции testWidgets
или setUp
:
final flamante = rootBundle.load('assets/fonts/Flamante-Roma-Medium.ttf');
await FontLoader('FlamanteRoma')
..addFont(flamante)
..load();
Затем добавить этот шрифт в ThemeData
перед накачкой виджет.
theme: ThemeData(
fontFamily: 'FlamanteRoma',
),
Окончательный код test.dart:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:example/test/compare_test_size.dart';
void main() {
testWidgets(
"Emulate real screen size",
(WidgetTester tester) async {
final flamante = rootBundle.load('assets/fonts/Flamante-Roma-Medium.ttf');
await FontLoader('FlamanteRoma')
..addFont(flamante)
..load();
// Adjust these to match your actual device screen specs
final width = 411.4;
final height = 797.7;
tester.binding.window.devicePixelRatioTestValue = (2.625);
tester.binding.window.textScaleFactorTestValue = (1.1);
final dpi = tester.binding.window.devicePixelRatio;
tester.binding.window.physicalSizeTestValue = Size(width * dpi, height * dpi);
await tester.pumpWidget(
MediaQuery(
data: MediaQueryData(),
child: MaterialApp(
home: TextScaleComparaison(),
theme: ThemeData(
fontFamily: 'FlamanteRoma',
),
),
),
);
await expectLater(
find.byType(TextScaleComparaison),
matchesGoldenFile("text.png"),
);
},
);
}
Теперь заново сгенерируйте золотой тест и проверьте png. Вы увидите настоящий текст, а не прямоугольники:
test/test.png
И не забудьте добавить тот же шрифт в вашем main.dart
runApp(
MaterialApp(
home: TextScaleComparaison(),
theme: ThemeData(
fontFamily: 'FlamanteRoma',
),
),
);
А также не забудьте обновить pubspec.yaml
и запустить flutter pub get
- family: FlamanteRoma
fonts:
- asset: assets/fonts/Flamante-Roma-Medium.ttf