Flutter界面展示插件playbook_ui的使用
Flutter界面展示插件playbook_ui的使用
一个用于隔离开发UI组件并自动拍摄快照的库。
Playbook #
Playbook
是一个库,它提供了一个沙箱来构建UI组件,而无需担心应用程序特定的依赖项。这个概念受到了JavaScript在Web前端开发中使用的Storybook的启发。
使用Playbook
构建的组件可以生成一个独立的应用程序作为活生生的样式指南。这不仅允许你快速审查UI,还可以通过将业务逻辑与组件分离来交付更健壮的设计。
此外,每个组件的快照可以通过单元测试自动生成,并且可以使用任意第三方工具进行视觉回归测试。
对于复杂的现代应用程序开发,敏感地捕捉UI更改并更快地改进它们是非常重要的。Playbook
使你不必费力准备数据和花费人力进行手动测试。
Playbook #
Playbook
组件以场景的形式唯一存储。一个场景描述了组件的布局方式。
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_ui的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter界面展示插件playbook_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
playbook_ui
是一个用于 Flutter 的界面展示插件,它可以帮助开发者快速构建和展示 UI 组件库、设计系统或样式指南。通过 playbook_ui
,你可以将你的 UI 组件组织成一个个“故事”(Story),并在一个统一的界面中进行展示和测试。
安装 playbook_ui
首先,你需要在 pubspec.yaml
文件中添加 playbook_ui
依赖:
dependencies:
flutter:
sdk: flutter
playbook_ui: ^0.1.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
基本使用
1. 创建 Story
Story
是 playbook_ui
中的一个基本单元,它代表一个 UI 组件的展示场景。你可以为每个组件创建一个或多个 Story
。
import 'package:flutter/material.dart';
import 'package:playbook_ui/playbook_ui.dart';
class ButtonStory extends Story {
[@override](/user/override)
String get name => 'Button';
[@override](/user/override)
Widget build(BuildContext context) {
return Center(
child: ElevatedButton(
onPressed: () {},
child: Text('Click Me'),
),
);
}
}
2. 创建 Playbook
Playbook
是所有 Story
的集合。你可以将多个 Story
添加到 Playbook
中。
import 'package:playbook_ui/playbook_ui.dart';
final playbook = Playbook(
title: 'My UI Library',
stories: [
ButtonStory(),
// 添加更多的 Story
],
);
3. 在应用中展示 Playbook
你可以使用 PlaybookApp
来展示你的 Playbook
。通常,你会在 main.dart
中设置它。
import 'package:flutter/material.dart';
import 'package:playbook_ui/playbook_ui.dart';
import 'stories/button_story.dart'; // 导入你的 Story
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Playbook',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: PlaybookApp(
playbook: playbook,
),
);
}
}
4. 运行应用
现在你可以运行你的 Flutter 应用,PlaybookApp
将会展示你所有的 Story
,并允许你在应用中浏览和测试这些 UI 组件。
高级功能
1. 分组 Story
你可以将 Story
分组,以便更好地组织和管理你的 UI 组件。
final playbook = Playbook(
title: 'My UI Library',
categories: [
PlaybookCategory(
title: 'Buttons',
stories: [
ButtonStory(),
// 更多的 Button Story
],
),
PlaybookCategory(
title: 'Cards',
stories: [
// Card Story
],
),
],
);
2. 自定义 PlaybookApp
你可以通过 PlaybookApp
的 theme
和 darkTheme
参数来定制应用的主题。
PlaybookApp(
playbook: playbook,
theme: ThemeData.light(),
darkTheme: ThemeData.dark(),
);
3. 添加导航
你可以在 Story
中添加导航逻辑,以便在应用中测试页面的跳转。
class NavigationStory extends Story {
[@override](/user/override)
String get name => 'Navigation';
[@override](/user/override)
Widget build(BuildContext context) {
return Center(
child: ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);
},
child: Text('Go to Second Page'),
),
);
}
}