Flutter屏幕快照插件playbook_snapshot的使用
Flutter屏幕快照插件playbook_snapshot的使用
一个用于隔离开发UI组件并自动捕获其快照的库。
Playbook #
Playbook 是一个提供沙箱环境的库,用于构建UI组件时无需担心应用程序特定的依赖项。它深受JavaScript前端开发工具Storybook的启发。
通过使用Playbook构建的组件可以生成独立的应用程序作为动态样式指南。这不仅可以让您快速审查UI,还可以通过将业务逻辑从组件中分离出来交付更健壮的设计。
此外,每个组件的快照可以通过单元测试自动生成,并且可以使用任意第三方工具进行视觉回归测试。
对于复杂的现代应用程序开发来说,在敏感地捕捉UI更改并更快地改进它们方面至关重要。有了Playbook,您无需费力准备数据,也不必花费人力资源进行手动测试。
Playbook #
Playbook 组件以场景的形式唯一存储。一个Scenario定义了组件的布局方式。
Playbook(
stories: [
Story(
'Home',
scenarios: [
Scenario(
'CategoryHome',
layout: ScenarioLayout.fill(),
child: CategoryHome(userData: UserData.stub),
),
Scenario(
'LandmarkList',
layout: ScenarioLayout.fill(),
child: Scaffold(
appBar: AppBar(),
body: LandmarkList(userData: UserData.stub),
),
),
Scenario(
'Container red',
layout: ScenarioLayout.fixed(100, 100),
child: Container(color: Colors.red),
),
],
),
],
);
PlaybookUI #
PlaybookUI 提供用户界面来浏览场景列表。
PlaybookGallery
组件的可视化效果列出来并展示。在顶部屏幕上显示的内容实际上并没有进行布局,而是运行时高效生成的快照。
| 浏览器 | 详细信息 |
|---|---|
PlaybookSnapshot #
场景可以通过符合TestTool类的实例进行测试。Snapshot就是其中之一,它可以生成所有场景的快照,并模拟给定设备的屏幕尺寸和安全区域。
Future<void> main() async {
testWidgets('Take snapshots', (tester) async {
await Playbook(
stories: [
barStory(),
fooWidgetStory(),
assetImageStory(),
homePageStory(),
scrollableStory(),
],
).run(
Snapshot(
devices: [SnapshotDevice.iPhoneSE2nd],
),
(widget, device) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
fontFamily: 'Roboto',
platform: device.platform,
),
home: widget,
);
},
);
});
}
配置
可以在pubspec.yaml中配置字体文件的位置和快照输出目录路径。
playbook_snapshot:
fonts:
- family: Roboto
fonts:
- asset: assets/fonts/Roboto-Regular.ttf
# 默认为/snapshots
snapshot_dir: iOS
# 默认为空
sub_dir: service
上述设置后,快照将保存在以下目录中:
/test/iOS/${DeviceName}/service/${StoryTitle}/${ScenarioTitle}.png
如果要动态更改路径,可以在Snapshot中使用snapshotDir和subDir参数。
注意事项
Snapshot(内部实现为flutter test --update-goldens)需要您自行准备和加载字体。通过在flutter或playbook_snapshot中定义字体文件位置,并在目录中准备好字体文件,字体文件将自动加载。
flutter:
fonts:
- family: Roboto
fonts:
- asset: assets/fonts/Roboto-Regular.ttf
或者
playbook_snapshot:
fonts:
- family: Roboto
fonts:
- asset: assets/fonts/Roboto-Regular.ttf
然后需要在目录中准备好字体文件。
PlaybookGenerator #
支持从任何.dart文件中生成故事和场景。
// some_story.dart
const storyTitle = 'Home';
@GenerateScenario(
layout: ScenarioLayout.fill(),
)
Widget $CategoryHome() => CategoryHome(userData: UserData.stub);
@GenerateScenario(
layout: ScenarioLayout.fill(),
)
Widget $LandmarkList() => Scaffold(
appBar: AppBar(),
body: LandmarkList(userData: UserData.stub),
);
@GenerateScenario(
title: 'Container red',
layout: ScenarioLayout.fixed(100, 100),
)
Widget containerRed() => Container(color: Colors.red);
@GenerateScenario(
title: 'Device pixel ratio',
layout: ScenarioLayout.fixed(300, 300),
)
Widget devicePixelRatio(BuildContext context) =>
Text('Device pixel ratio is ${MediaQuery.of(context).devicePixelRatio}');
您可以引用playbook实例。
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Playbook Demo',
theme: ThemeData.light(),
home: PlaybookGallery(
title: 'Sample app',
playbook: playbook,
),
);
}
}
可以在build.yaml中设置glob以查找资产和输出文件名。默认输入值为lib/**.dart,输出值为generated_playbook.dart。
targets:
$default:
builders:
playbook_generator:stories:
options:
input: lib/**.dart
output: generated_playbook.dart
更多关于Flutter屏幕快照插件playbook_snapshot的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter屏幕快照插件playbook_snapshot的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
playbook_snapshot 是一个用于在 Flutter 应用中生成屏幕快照的插件。它通常用于在测试过程中捕获应用的 UI 状态,以确保 UI 在不同设备和屏幕尺寸下的一致性。以下是使用 playbook_snapshot 插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml 文件中添加 playbook_snapshot 插件的依赖项:
dev_dependencies:
playbook_snapshot: ^0.0.1
然后运行 flutter pub get 以获取依赖。
2. 创建快照测试
接下来,你可以创建一个快照测试。快照测试通常用于验证应用的 UI 是否按预期渲染。
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:playbook_snapshot/playbook_snapshot.dart';
void main() {
testWidgets('Test HomePage UI', (WidgetTester tester) async {
// 构建你的应用
await tester.pumpWidget(MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Home Page'),
),
body: Center(
child: Text('Hello, World!'),
),
),
));
// 使用 playbook_snapshot 生成快照
await playbookSnapshot(tester, 'home_page_snapshot');
});
}
3. 配置快照路径
在运行测试之前,你可能需要配置快照的保存路径。你可以在 flutter_test_config.dart 文件中进行配置:
import 'package:playbook_snapshot/playbook_snapshot.dart';
void main() {
playbookSnapshotConfig = PlaybookSnapshotConfig(
snapshotDirectory: 'test/snapshots',
);
}
4. 运行测试
你可以使用以下命令运行测试并生成快照:
flutter test --update-goldens
--update-goldens 标志会更新或创建新的快照文件。如果没有这个标志,测试将会验证现有的快照是否与当前 UI 一致。
5. 验证快照
在后续的测试运行中,playbook_snapshot 将会比较新的快照与之前保存的快照。如果两者不一致,测试将会失败,提示你需要检查 UI 的变化。
6. 处理快照差异
如果快照不一致,你可以选择接受新的快照或修复 UI 问题。如果新的快照是正确的,你可以再次运行测试并更新快照:
flutter test --update-goldens
7. 集成到 CI/CD
你可以将快照测试集成到你的 CI/CD 管道中,以确保每次代码更改都不会意外地改变 UI。
8. 自定义快照选项
playbook_snapshot 提供了多种选项来自定义快照的生成和比较过程。你可以通过 PlaybookSnapshotConfig 来配置这些选项,例如设置快照的分辨率、忽略某些区域等。
playbookSnapshotConfig = PlaybookSnapshotConfig(
snapshotDirectory: 'test/snapshots',
resolution: Resolution(devicePixelRatio: 2.0),
ignoreAreas: [
Rect.fromLTWH(0, 0, 100, 100),
],
);

