Flutter预览功能插件preview的使用
Flutter预览功能插件preview的使用
创建你的小部件样本并在实时预览中查看它们
开始使用
安装
运行预览

- 在 VS Code 中打开一个 Dart 文件时,会显示预览按钮。
- 点击该按钮以启动 Flutter Preview。
添加预览
VS Code 提供了一个代码片段来创建预览,只需输入 preview
即可看到。
示例代码:
class MyPreview extends PreviewProvider {
List<Preview> get previews {
return [
];
}
}
- 添加多个
Preview
小部件以显示你想要展示的不同样本。
List<Preview> get previews {
return [
Preview(
frame: Frames.ipadPro12,
child: MyApp(),
),
Preview(
frame: Frames.iphoneX,
child: MyApp(),
),
];
}
保存文件后,这些示例会立即出现在预览窗口中,并且每次返回该文件时都会显示。
最大化利用 Flutter Preview
预览小部件
Preview
小部件允许你为小部件设置默认值,影响其内部显示效果。当前可用的值包括:
theme
: 添加应用主题,以便在你的样式下查看小部件。height
,width
: 设置未指定大小的小部件的尺寸。frame
: 查看不同设备场景下的小部件(如安卓手机或苹果手表),支持超过 20 种型号,还可自定义。 (此功能得益于由 Aloïs Deniel 开发的出色包 device_frame)- 需要更多功能?我们正在计划未来添加更多选项,如
Locale
,Brightness
,constraints
等。
此外,你可以为每个预览设置更新模式,从热重载到热重启。
PreviewProvider
你可以使用多个扩展了 PreviewProvider
的类,并且它们将在不同的标签页中显示。
默认情况下,标签页的名称将是类名,但你可以通过覆盖 title
参数来自定义它。
自定义提供程序
PreviewProvider
允许你在单个文件中分组不同的 Previews
。虽然这对大多数情况已经足够,但如果你希望创建自己的预览,可以扩展任何继承自 StatelessWidget
的类,并使其实现 Previewer
混入。
示例代码:
class MyCustomPreview extends StatelessWidget with Previewer {
[@override](/user/override)
Widget build(BuildContext context) {
return Container();
}
}
重要的是始终在扩展任何类时添加 with Previewer
,否则 Flutter Preview 将无法识别它。
内置的一个自定义提供程序是 ResizablePreviewProvider
,它为你提供了自由调整小部件大小以查看其在不同场景下的表现。
示例代码:
class Resizable extends ResizablePreviewProvider with Previewer {
[@override](/user/override)
Preview get preview {
return Preview(
mode: UpdateMode.hotReload,
child: MusicCard(
title: 'Blond',
singer: 'Frank Ocean',
image: PreviewImage.asset('preview_assets/cover1.jpg'),
onTap: () => {},
),
);
}
}
你可以构建其他预览或使用任何包,只要遵守以下两个重要规则:
- 所有预览提供程序(除了默认的)都需要包含
with Previewer
。 - 它们需要有一个无参数的空构造函数。
让我们来看一个使用 device_preview
包的酷炫示例:
代码 | 预览 |
---|---|
dart class DevicePreviewProvider extends StatelessWidget with Previewer { [@override](/user/override) String get title => 'Device Preview'; [@override](/user/override) Widget build(BuildContext context) { return DevicePreview( builder: (context) => MyApp(), ); } } |
![]() |
如果某些功能无法正常工作?
请创建一个新的问题并提交至 GitHub Issues,我会尽快解决。
示例代码
以下是完整的示例代码:
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:preview/preview.dart';
import 'package:random_color/random_color.dart';
import 'package:preview_example/widgets/chip.dart' as c;
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Test',
theme: ThemeData(primarySwatch: Colors.blue),
home: MyHomePage(title: 'Flutter Demo Home Page 5'),
builder: previewAppBuilder,
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
List<Color> colors = List.generate(40,
(index) => RandomColor().randomMaterialColor(colorHue: ColorHue.blue));
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Preview ${Frame().runtimeType}'),
),
body: Center(
child: Scrollbar(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: EdgeInsets.all(20),
child: Wrap(
crossAxisAlignment: WrapCrossAlignment.center,
runAlignment: WrapAlignment.spaceBetween,
alignment: WrapAlignment.spaceBetween,
spacing: 10,
runSpacing: 10,
children: colors
.asMap()
.entries
.map((e) =>
c.Chip(title: 'Tag ${e.key}', color: e.value))
.toList()),
),
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'aIncrement',
child: Icon(Icons.add),
),
);
}
}
class IPhoneX extends PreviewProvider {
[@override](/user/override)
String get title => 'iPhone X';
[@override](/user/override)
List<Preview> get previews => [
Preview(
key: Key('preview'),
frame: Frames.iphoneX,
child: MyApp(),
),
];
}
class IPad extends PreviewProvider {
[@override](/user/override)
String get title => 'iPad Pro';
[@override](/user/override)
List<Preview> get previews => [
Preview(
frame: Frames.ipadPro12,
child: MyApp(),
),
];
}
class AllPreview extends PreviewProvider {
[@override](/user/override)
String get title => 'All';
[@override](/user/override)
List<Preview> get previews => Frames.values
.map(
(e) => Preview(
key: Key('preview'),
frame: e,
child: MyApp(),
),
)
.toList();
}
更多关于Flutter预览功能插件preview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter预览功能插件preview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,preview
插件可以帮助开发者在开发过程中快速预览UI的变化,而无需重新运行整个应用程序。这个插件通常用于提高开发效率,特别是在进行UI调整时。
安装 preview
插件
首先,你需要在 pubspec.yaml
文件中添加 preview
插件的依赖:
dependencies:
flutter:
sdk: flutter
preview: ^0.1.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
使用 preview
插件
-
导入包:在你的 Dart 文件中导入
preview
包。import 'package:preview/preview.dart';
-
创建预览:使用
Preview
小部件来包裹你想要预览的UI部分。class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Preview( child: Scaffold( appBar: AppBar( title: Text('Preview Example'), ), body: Center( child: Text('Hello, Preview!'), ), ), ), ); } }
-
运行预览:在终端中运行以下命令来启动预览功能:
flutter pub run preview
这将启动一个本地服务器,并在浏览器中打开一个页面,显示你的UI预览。
-
实时更新:当你修改代码并保存时,预览页面会自动刷新,显示最新的UI变化。
高级用法
-
多预览:你可以在同一个应用程序中创建多个
Preview
小部件,每个小部件可以预览不同的UI部分。Preview( name: 'Home Screen', child: HomeScreen(), ), Preview( name: 'Settings Screen', child: SettingsScreen(), ),
-
自定义预览:你可以通过传递参数来自定义预览的行为,例如设置不同的设备尺寸、主题等。
Preview( device: Devices.iphone11, theme: ThemeData.dark(), child: MyWidget(), ),