Flutter故事书展示插件storybook_flutter的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter故事书展示插件storybook_flutter的使用

Storybook Flutter

Pub Version melos

Storybook Flutter是一个跨平台的故事书,用于展示Flutter小部件。它应该适用于所有Flutter支持的平台。

preview

Getting Started

以下是使用storybook_flutter的基本示例:

import 'package:flutter/material.dart';
import 'package:storybook_flutter/storybook_flutter.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) => Storybook(
        initialStory: 'Screens/Scaffold',
        stories: [
          Story(
            name: 'Screens/Scaffold',
            description: 'Story with scaffold and different knobs.',
            builder: (context) => Scaffold(
              appBar: AppBar(
                title: Text(
                  context.knobs.text(
                    label: 'Title',
                    initial: 'Scaffold',
                    description: 'The title of the app bar.',
                  ),
                ),
                elevation: context.knobs.nullable.slider(
                  label: 'AppBar elevation',
                  initial: 4,
                  min: 0,
                  max: 10,
                  description: 'Elevation of the app bar.',
                ),
                backgroundColor: context.knobs.nullable.options(
                  label: 'AppBar color',
                  initial: Colors.blue,
                  description: 'Background color of the app bar.',
                  options: const [
                    Option(
                      label: 'Blue',
                      value: Colors.blue,
                      description: 'Blue color',
                    ),
                    Option(
                      label: 'Green',
                      value: Colors.green,
                      description: 'Green color',
                    ),
                  ],
                ),
              ),
              body: SizedBox(
                width: double.infinity,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: List.generate(
                    context.knobs.sliderInt(
                      label: 'Items count',
                      initial: 2,
                      min: 1,
                      max: 5,
                      description: 'Number of items in the body container.',
                    ),
                    (_) => const Padding(
                      padding: EdgeInsets.all(8),
                      child: Text('Hello World!'),
                    ),
                  ),
                ),
              ),
              floatingActionButton: context.knobs.boolean(
                label: 'FAB',
                initial: true,
                description: 'Show FAB button',
              )
                  ? FloatingActionButton(
                      heroTag: 'FAB',
                      onPressed: () {},
                      child: const Icon(Icons.add),
                    )
                  : null,
            ),
          ),
          // 更多故事...
        ],
      );
}

Customization

默认情况下,每个故事会被包装在MaterialApp中。你可以通过提供wrapperBuilder来覆盖此行为。你可以使用默认的包装器(如materialWrappercupertinoWrapper),也可以提供完全自定义的包装器。在这种情况下,请确保使用包含故事的child小部件。

Plugins

几乎所有功能都是由插件提供的。甚至内容和旋钮也是插件(尽管它们是第一方插件)。目前插件文档还在待定中,但你可以查看现有的第一方插件:ContentsPluginDeviceFramePluginKnobsPluginThemModePlugin

Golden tests

你可以使用storybook_flutter_test包自动测试你的故事:

  1. 将其添加到dev_dependencies中:
    dev_dependencies:
      storybook_flutter_test: any
    
  2. 创建测试文件,例如storybook_test.dart
  3. 添加以下内容:
    void main() => testStorybook(
        storybook,
        layouts: [
          (
            device: Devices.ios.iPhone13,
            orientation: Orientation.portrait,
            isFrameVisible: true,
          ),
          (
            device: Devices.ios.iPadPro11Inches,
            orientation: Orientation.landscape,
            isFrameVisible: true,
          ),
          (
            device: Devices.android.samsungGalaxyA50,
            orientation: Orientation.portrait,
            isFrameVisible: true,
          ),
        ],
      );
    
  4. 通过运行flutter test --update-goldens --tags=storybook生成黄金图像。

Features and bugs

请在issue tracker上提交功能请求和错误报告。


更多关于Flutter故事书展示插件storybook_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter故事书展示插件storybook_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用storybook_flutter插件的示例代码案例。storybook_flutter通常用于展示UI组件的多个状态,类似于在Web开发中使用的Storybook工具。不过,需要注意的是,storybook_flutter并非Flutter官方的插件,且社区中的类似工具可能有不同的名称和用法。在这个例子中,我将展示一个假设的类似工具的使用方法,如果你使用的是特定的第三方库,请参考其官方文档进行调整。

首先,确保你已经在pubspec.yaml文件中添加了所需的依赖(这里假设依赖名为storybook_flutter,实际使用时请替换为真实依赖名):

dependencies:
  flutter:
    sdk: flutter
  storybook_flutter: ^x.y.z  # 替换为实际版本号

然后,运行flutter pub get来获取依赖。

接下来,在你的Flutter项目中创建一个Storybook文件。例如,创建一个名为storybook.dart的文件,并在其中定义你的组件故事:

import 'package:flutter/material.dart';
import 'package:storybook_flutter/storybook_flutter.dart';  // 假设的导入路径

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: StorybookScreen(
        stories: [
          Story(
            name: 'Button States',
            builder: (context) => Column(
              children: [
                ButtonStory('Default Button', Colors.blue),
                ButtonStory('Disabled Button', Colors.grey.shade300, enabled: false),
              ],
            ),
          ),
          // 可以添加更多故事
        ],
      ),
    );
  }
}

class ButtonStory extends StatelessWidget {
  final String title;
  final Color color;
  final bool enabled;

  ButtonStory(this.title, this.color, {this.enabled = true});

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Text(title, style: TextStyle(fontSize: 18)),
          SizedBox(height: 8),
          ElevatedButton(
            onPressed: enabled ? () {} : null,
            style: ButtonStyle(
              backgroundColor: MaterialStateProperty.all(color),
            ),
            child: Text('Click Me'),
          ),
        ],
      ),
    );
  }
}

在这个例子中,我们创建了一个简单的Storybook应用,其中包含一个名为“Button States”的故事,展示了两种状态的按钮:默认按钮和禁用按钮。

注意,由于storybook_flutter并非真实存在的官方插件(至少在我最后的知识更新时),上述代码中的StorybookScreenStory等类可能是假设的。如果你使用的是某个具体的第三方库,你需要参考该库的文档来替换这些类和方法。

如果你是在寻找一个真实的Flutter组件库管理工具,你可能想要查看像flutter_storyboard或类似的社区项目,或者考虑使用如Flutter DevToolsRive等工具来辅助UI组件的开发和展示。

最后,请确保查看你实际使用的插件的文档,因为每个插件的API和使用方法可能会有所不同。

回到顶部