Flutter插件stockholm的使用方法

Flutter插件stockholm的使用方法

Stockholm 是一组以桌面为主的组件和主题集合,旨在在 Mac 和 Windows 上看起来和感觉很棒。这些组件足够熟悉,可以在任何平台上舒适地使用,但它们避免了模仿本地组件,从而不会陷入“恐怖谷效应”。

示例演示

您可以在此处查看实时演示:Stockholm UI Demo

Stockholm UI Demo

该库主要为 Serverpod 的图形用户界面编写。(Serverpod 是 Flutter 缺少的服务器,去检查一下吧!)因此,重点放在了 Serverpod 所需的组件上。如果发现缺少某些组件,请提交一个拉取请求。

目前还没有文档,但是示例项目展示了如何使用所有组件,并且非常简单。确保使用提供的主题类,否则 UI 将无法正常显示。

示例代码

以下是一个完整的示例代码,展示了如何使用 Stockholm 插件。

import 'package:example/src/buttons.dart';
import 'package:example/src/colors.dart';
import 'package:example/src/dialogs.dart';
import 'package:example/src/inspector.dart';
import 'package:example/src/menus.dart';
import 'package:example/src/tables.dart';
import 'package:example/src/text_fields.dart';
import 'package:example/src/toolbar.dart';
import 'package:flutter/material.dart';
import 'package:ionicons/ionicons.dart';
import 'package:stockholm/stockholm.dart';

// 定义页面枚举
enum _DemoPage {
  buttons,
  menus,
  tables,
  dialogs,
  toolbar,
  colors,
  textFields,
  propertyInspector,
}

// 定义主题颜色枚举
enum _ThemeColor {
  blue,
  purple,
  pink,
  red,
  orange,
  yellow,
  green,
  gray,
}

void main() {
  runApp(const StockholmDemoApp());
}

class StockholmDemoApp extends StatefulWidget {
  const StockholmDemoApp({Key? key}) : super(key: key);

  [@override](/user/override)
  _StockholmDemoAppState createState() => _StockholmDemoAppState();

  // 获取当前状态实例
  static _StockholmDemoAppState of(BuildContext context) {
    return context.findAncestorStateOfType<_StockholmDemoAppState>()!;
  }
}

class _StockholmDemoAppState extends State<StockholmDemoApp> {
  bool _darkMode = false;
  _ThemeColor _themeColor = _ThemeColor.blue;

  // 获取和设置暗模式
  bool get darkMode => _darkMode;
  set darkMode(bool darkMode) {
    setState(() {
      _darkMode = darkMode;
    });
  }

  // 获取和设置主题颜色
  _ThemeColor get themeColor => _themeColor;
  set themeColor(_ThemeColor themeColor) {
    setState(() {
      _themeColor = themeColor;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Stockholm Demo',
      theme: _darkMode
          ? StockholmThemeData.dark(
              accentColor: _themeColorToStockholmColor(_themeColor, Brightness.dark),
            )
          : StockholmThemeData.light(
              accentColor: _themeColorToStockholmColor(_themeColor, Brightness.light),
            ),
      home: const StockholmHomePage(),
    );
  }
}

class StockholmHomePage extends StatefulWidget {
  const StockholmHomePage({
    Key? key,
  }) : super(key: key);

  [@override](/user/override)
  State<StockholmHomePage> createState() => _StockholmHomePageState();
}

class _StockholmHomePageState extends State<StockholmHomePage> {
  _DemoPage _selectedPage = _DemoPage.buttons;

  [@override](/user/override)
  Widget build(BuildContext context) {
    Widget page;

    var appState = StockholmDemoApp.of(context);

    // 根据选择的页面渲染不同的组件
    switch (_selectedPage) {
      case _DemoPage.buttons:
        page = const StockholmButtonDemoPage();
        break;
      case _DemoPage.tables:
        page = const StockholmTableDemoPage();
        break;
      case _DemoPage.menus:
        page = const StockholmMenuDemoPage();
        break;
      case _DemoPage.dialogs:
        page = const StockholmDialogDemoPage();
        break;
      case _DemoPage.toolbar:
        page = const StockholmToolbarDemoPage();
        break;
      case _DemoPage.colors:
        page = const StockholmColorDemoPage();
        break;
      case _DemoPage.textFields:
        page = const StockholmTextFieldDemoPage();
        break;
      case _DemoPage.propertyInspector:
        page = const StockholmPropertyInspectorDemoPage();
        break;
    }

    // 构建颜色选项按钮
    var colorOptionWidgets = <Widget>[];
    for (var themeColor in _ThemeColor.values) {
      colorOptionWidgets.add(
        StockholmToolbarButton(
          icon: Ionicons.square,
          color: _themeColorToStockholmColor(
            themeColor,
            appState.darkMode ? Brightness.dark : Brightness.light,
          ),
          height: 22.0,
          minWidth: 0.0,
          iconSize: 14.0,
          padding: const EdgeInsets.symmetric(horizontal: 4),
          selected: appState.themeColor == themeColor,
          onPressed: () {
            setState(() {
              appState.themeColor = themeColor;
            });
          },
        ),
      );
    }

    return Scaffold(
      body: Row(
        children: [
          StockholmSideBar(
            children: [
              const StockholmListTileHeader(child: Text('Controls')),
              StockholmListTile(
                leading: const Icon(Ionicons.toggle_outline),
                child: const Text('Buttons'),
                selected: _selectedPage == _DemoPage.buttons,
                onPressed: () {
                  setState(() {
                    _selectedPage = _DemoPage.buttons;
                  });
                },
              ),
              StockholmListTile(
                leading: const Icon(Ionicons.reader_outline),
                child: const Text('Menus'),
                selected: _selectedPage == _DemoPage.menus,
                onPressed: () {
                  setState(() {
                    _selectedPage = _DemoPage.menus;
                  });
                },
              ),
              StockholmListTile(
                leading: const Icon(Ionicons.text),
                child: const Text('Text fields'),
                selected: _selectedPage == _DemoPage.textFields,
                onPressed: () {
                  setState(() {
                    _selectedPage = _DemoPage.textFields;
                  });
                },
              ),
              const StockholmListTileHeader(child: Text('Layouts')),
              StockholmListTile(
                leading: const Icon(Ionicons.browsers_outline),
                child: const Text('Tables'),
                selected: _selectedPage == _DemoPage.tables,
                onPressed: () {
                  setState(() {
                    _selectedPage = _DemoPage.tables;
                  });
                },
              ),
              StockholmListTile(
                leading: const Icon(Ionicons.chatbubble_outline),
                child: const Text('Dialogs'),
                selected: _selectedPage == _DemoPage.dialogs,
                onPressed: () {
                  setState(() {
                    _selectedPage = _DemoPage.dialogs;
                  });
                },
              ),
              StockholmListTile(
                leading: const Icon(Ionicons.build_outline),
                child: const Text('Toolbars'),
                selected: _selectedPage == _DemoPage.toolbar,
                onPressed: () {
                  setState(() {
                    _selectedPage = _DemoPage.toolbar;
                  });
                },
              ),
              StockholmListTile(
                leading: const Icon(Ionicons.list_outline),
                child: const Text('Property inspector'),
                selected: _selectedPage == _DemoPage.propertyInspector,
                onPressed: () {
                  setState(() {
                    _selectedPage = _DemoPage.propertyInspector;
                  });
                },
              ),
              const StockholmListTileHeader(child: Text('Misc')),
              StockholmListTile(
                leading: const Icon(Ionicons.color_palette_outline),
                child: const Text('Colors'),
                selected: _selectedPage == _DemoPage.colors,
                onPressed: () {
                  setState(() {
                    _selectedPage = _DemoPage.colors;
                  });
                },
              ),
            ],
            footer: Padding(
              padding: const EdgeInsets.all(8),
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  StockholmToolbarButton(
                    height: 22,
                    icon: appState.darkMode
                        ? Ionicons.moon_outline
                        : Ionicons.sunny_outline,
                    onPressed: () {
                      setState(() {
                        appState.darkMode = !appState.darkMode;
                      });
                    },
                  ),
                  const Spacer(),
                  ...colorOptionWidgets,
                ],
              ),
            ),
          ),
          Expanded(
            child: page,
          )
        ],
      ),
    );
  }
}

// 将主题颜色转换为 Stockholm 颜色
StockholmColor _themeColorToStockholmColor(
  _ThemeColor color,
  Brightness brightness,
) {
  var colors = StockholmColors.fromBrightness(brightness);

  switch (color) {
    case _ThemeColor.blue:
      return colors.blue;
    case _ThemeColor.purple:
      return colors.purple;
    case _ThemeColor.pink:
      return colors.pink;
    case _ThemeColor.red:
      return colors.red;
    case _ThemeColor.orange:
      return colors.orange;
    case _ThemeColor.yellow:
      return colors.yellow;
    case _ThemeColor.green:
      return colors.green;
    case _ThemeColor.gray:
      return colors.gray;
  }
}

更多关于Flutter插件stockholm的使用方法的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件stockholm的使用方法的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,stockholm 并不是一个广为人知或官方支持的插件。因此,要探索和使用 stockholm 插件,你可能需要采取以下步骤:

1. 查找插件的来源

  • GitHub: 在GitHub上搜索 stockholm 插件,看看是否有相关的仓库。
  • Pub.dev: 在 pub.dev 上搜索 stockholm,查看是否有相关的插件发布。
  • 其他资源: 检查是否有相关的博客、论坛或社区讨论该插件。

2. 阅读文档

  • 如果找到了相关的仓库或发布,仔细阅读其 README.md 或其他文档,了解插件的功能、使用方法和依赖项。
  • 查看是否有示例代码或使用指南。

3. 安装插件

  • 如果插件在 pub.dev 上发布,可以通过在 pubspec.yaml 文件中添加依赖来安装:
    dependencies:
      stockholm: ^1.0.0  # 使用实际的版本号
    
  • 如果插件在GitHub上,可以通过指定Git仓库地址来安装:
    dependencies:
      stockholm:
        git:
          url: https://github.com/username/stockholm.git
          ref: main  # 使用实际的分支或标签
    

4. 导入和使用

  • 在Dart文件中导入插件:
    import 'package:stockholm/stockholm.dart';
    
  • 根据文档或示例代码使用插件提供的功能。

5. 调试和测试

  • 编写简单的测试代码,验证插件的功能是否符合预期。
  • 如果遇到问题,查看插件的Issue页面,看看是否有其他人遇到类似的问题,或者自己提交Issue。

6. 贡献和改进

  • 如果插件是开源的,并且你发现了一些问题或有改进的想法,可以考虑贡献代码。
  • 提交Pull Request,或者与维护者沟通你的想法。

7. 备份方案

  • 如果 stockholm 插件无法满足需求,或者无法找到相关资源,考虑寻找替代方案或自己实现所需功能。

示例代码

假设 stockholm 插件提供了一个简单的功能,比如显示一个自定义的对话框,你可以这样使用:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Stockholm Plugin Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              Stockholm.showCustomDialog(
                context: context,
                title: 'Hello',
                message: 'This is a custom dialog from Stockholm plugin.',
              );
            },
            child: Text('Show Dialog'),
          ),
        ),
      ),
    );
  }
}
回到顶部