ducafe_ui_core 1.0.4 copy "ducafe_ui_core: ^1.0.4" to clipboard
ducafe_ui_core: ^1.0.4 copied to clipboard

flutter ui core package for ducafecat.com

ducafe_ui_core 使用说明 #

ducafe_ui_core 是一个 Flutter UI 核心类库,提供了许多实用的扩展方法和工具类,以简化 Flutter 应用程序的 UI 开发。

参考 #

主要功能 #

  1. 屏幕适配工具 (ScreenUtil)
  2. Widget 扩展方法
  3. 上下文 (Context) 扩展方法
  4. 字符串扩展方法
  5. 列表扩展方法
  6. 主题访问扩展方法
  7. 平台判断扩展方法
  8. UI 工具类

安装 #

pubspec.yaml 文件中添加依赖:

dependencies:
  ducafe_ui_core: ^1.0.1

然后运行 flutter pub get 命令。

使用示例 #

屏幕适配 #

在应用程序的根部初始化 ScreenUtil:

import 'package:ducafe_ui_core/ducafe_ui_core.dart';

void main() {
  runApp(
    ScreenUtilInit(
      designSize: const Size(360, 690),
      builder: (context, child) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: child,
        );
      },
      child: const HomePage(),
    ),
  );
}

Widget 扩展 #

示例:

// 创建一个居中的文本小部件
final centeredText = Text('Hello, World!').center();

// 创建一个带有内边距和阴影的卡片
final styledCard = Text('Card Content')
    .padding(all: 16)
    .card(elevation: 4)
    .boxShadow(blurRadius: 10);

// 创建一个可点击的按钮
final clickableButton = Text('Click me')
    .padding(all: 8)
    .inkWell(onTap: () => print('Button clicked!'));

// 创建一个带有动画效果的缩放小部件
final animatedWidget = Icon(Icons.star)
    .scale(all: 1.5)
    .animate(Duration(milliseconds: 300), Curves.easeInOut);

扩展:

  • animate: 为小部件添加动画效果
  • align: 设置小部件的对齐方式
  • alignCenter: 将小部件居中对齐
  • alignLeft: 将小部件左对齐
  • alignRight: 将小部件右对齐
  • alignTop: 将小部件顶部对齐
  • alignBottom: 将小部件底部对齐
  • parent: 为小部件应用父级小部件
  • padding: 为小部件添加内边距
  • paddingBottom: 为小部件添加底部内边距
  • paddingHorizontal: 为小部件添加水平内边距
  • paddingLeft: 为小部件添加左侧内边距
  • paddingRight: 为小部件添加右侧内边距
  • paddingTop: 为小部件添加顶部内边距
  • paddingVertical: 为小部件添加垂直内边距
  • paddingDirectional: 为小部件添加方向性内边距
  • sliverPadding: 为 Sliver 小部件添加内边距
  • opacity: 设置小部件的不透明度
  • offstage: 控制小部件是否显示
  • neumorphism: 为小部件添加新拟态效果
  • boxShadow: 为小部件添加阴影效果
  • ripple: 为小部件添加涟漪效果
  • rotate: 旋转小部件
  • scale: 缩放小部件
  • translate: 平移小部件
  • transform: 对小部件应用变换
  • overflow: 控制小部件的溢出行为
  • scrollable: 使小部件可滚动
  • expanded: 使小部件在 Flex 容器中扩展
  • flexible: 使小部件在 Flex 容器中灵活调整大小
  • positioned: 在 Stack 中定位小部件
  • positionedDirectional: 在 Stack 中方向性定位小部件
  • inkWell: 为小部件添加墨水效果和点击事件
  • safeArea: 将小部件放置在安全区域内
  • semanticsLabel: 为小部件添加语义标签
  • gestures: 为小部件添加手势识别
  • center: 将小部件居中
  • fittedBox: 调整小部件大小以适应其父级
  • fractionallySizedBox: 根据父级尺寸的比例调整小部件大小
  • card: 将小部件包装在卡片中
  • limitedBox: 限制小部件的最大尺寸
  • material: 将小部件包装在 Material 中
  • mouseRegion: 为小部件添加鼠标交互区域

颜色扩展使用说明 #

示例:

context.colors.scheme

扩展:

  • primary: 主要颜色
  • primaryLight: 主要颜色的亮色版本
  • primaryDark: 主要颜色的暗色版本
  • canvas: 画布颜色
  • scaffoldBackground: 脚手架背景色
  • card: 卡片颜色
  • divider: 分割线颜色
  • focus: 焦点颜色
  • hover: 悬停颜色
  • highlight: 高亮颜色
  • splash: 水波纹颜色
  • unselectedWidget: 未选中部件的颜色
  • disabled: 禁用状态颜色
  • secondaryHeader: 次要标题颜色
  • dialogBackground: 对话框背景色
  • indicator: 指示器颜色
  • hint: 提示文字颜色
  • scheme: 完整的颜色方案
  • shadow: 阴影颜色

屏幕尺寸信息 #

示例:

context.screenWidth

扩展:

  • screenWidth: 获取屏幕宽度
  • screenHeight: 获取屏幕高度
  • bottomBarHeight: 获取底部导航栏高度
  • statusBarHeight: 获取状态栏高度
  • textScaleFactor: 获取文本缩放因子
  • scaleWidth: 获取宽度的缩放因子
  • scaleHeight: 获取高度的缩放因子

时间差 Duration 的扩展 #

示例:

// 创建一个 5 秒的 Duration
Duration fiveSeconds = 5.seconds;

扩展:

  • microseconds: 将数字转换为微秒的 Duration
  • milliseconds: 将数字转换为毫秒的 Duration
  • seconds: 将数字转换为秒的 Duration
  • minutes: 将数字转换为分钟的 Duration
  • hours: 将数字转换为小时的 Duration
  • days: 将数字转换为天的 Duration
  • months: 将数字转换为月的 Duration(假设一个月为 30 天)
  • quarters: 将数字转换为季度的 Duration(假设一个季度为 90 天)
  • quadrimesters: 将数字转换为四个月的 Duration(假设四个月为 120 天)
  • years: 将数字转换为年的 Duration(假设一年为 365 天)
  • future: 启动一个延迟 delayed

Icon 扩展 #

示例:

// 创建一个原始图标
Icon originalIcon = Icon(Icons.star, size: 24, color: Colors.yellow);

// 使用 copyWith() 创建一个新图标,修改大小和颜色
Icon newIcon = originalIcon.copyWith(size: 32, color: Colors.red);

// 仅修改图标大小
Icon largerIcon = originalIcon.iconSize(48);

// 仅修改图标颜色
Icon blueIcon = originalIcon.iconColor(Colors.blue);

List

示例:

List<Widget> widgets = [Widget1(), Widget2(), Widget3()];
Widget column = widgets.toColumn(
  mainAxisAlignment: MainAxisAlignment.center,
  crossAxisAlignment: CrossAxisAlignment.start,
  separator: Divider(),
);

扩展:

  • toColumn(): 将 Widget 列表转换为 Column
  • toColumnSpace(): 将 Widget 列表转换为带有间距的 Column
  • toRow(): 将 Widget 列表转换为 Row
  • toRowSpace(): 将 Widget 列表转换为带有间距的 Row
  • toStack(): 将 Widget 列表转换为 Stack
  • toListView(): 将 Widget 列表转换为 ListView
  • toWrap(): 将 Widget 列表转换为 Wrap

MediaQuery 扩展 #

示例:

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 获取屏幕宽度
    double screenWidth = context.sizes.width;

    // 获取屏幕高度
    double screenHeight = context.sizes.height;

    // 获取屏幕边距
    EdgeInsets padding = context.sizes.padding;

    // 获取设备像素比
    double pixelRatio = context.sizes.devicePixelRatio;

    // 使用可能为空的属性
    double? maybeWidth = context.sizes.maybeWidth;

    return Container(
      width: screenWidth * 0.8,
      height: screenHeight * 0.5,
      padding: padding,
      child: Text(
        'Device Pixel Ratio: $pixelRatio',
        style: TextStyle(fontSize: 16 * context.sizes.textScaler.scale(1.0)),
      ),
    );
  }
}

扩展:

  • width: 屏幕宽度
  • height: 屏幕高度
  • padding: 屏幕边距
  • viewInsets: 视图插入
  • systemGestureInsets: 系统手势插入
  • viewPadding: 视图边距
  • devicePixelRatio: 设备像素比
  • textScaler: 文本缩放器

示例:

context.navigator.pushMaterial(NewPage());

扩展:

  • canPop: 检查是否可以弹出当前路由
  • maybePop: 尝试弹出当前路由
  • pop: 弹出当前路由
  • popUntil: 弹出路由直到满足条件
  • push: 推送新路由
  • pushMaterial: 使用 MaterialPageRoute 推送新页面
  • pushCupertino: 使用 CupertinoPageRoute 推送新页面
  • popAndPushNamed: 弹出当前路由并推送命名路由
  • pushAndRemoveUntil: 推送新路由并删除之前的路由直到满足条件
  • pushNamed: 推送命名路由
  • pushNamedAndRemoveUntil: 推送命名路由并删除之前的路由直到满足条件
  • pushReplacement: 推送新路由并替换当前路由
  • pushReplacementMaterial: 使用 MaterialPageRoute 推送新页面并替换当前路由
  • pushReplacementCupertino: 使用 CupertinoPageRoute 推送新页面并替换当前路由
  • pushReplacementNamed: 推送命名路由并替换当前路由
  • removeRoute: 移除指定路由
  • removeRouteBelow: 移除指定路由下方的路由
  • replace: 替换指定路由
  • replaceRouteBelow: 替换指定路由下方的路由

数字转 EdgeInsets 扩展 #

示例:

// 创建所有方向上偏移量为 16 的内边距
EdgeInsets padding1 = 16.paddingAll();

// 创建水平方向上偏移量为 20 的内边距
EdgeInsets padding2 = 20.paddingHorizontal();

// 创建垂直方向上偏移量为 10 的内边距
EdgeInsets padding3 = 10.paddingVertical();

// 创建只有顶部偏移量为 8 的内边距
EdgeInsets padding4 = 8.paddingTop();

// 创建只有左侧偏移量为 12 的内边距
EdgeInsets padding5 = 12.paddingLeft();

// 创建只有右侧偏移量为 15 的内边距
EdgeInsets padding6 = 15.paddingRight();

// 创建只有底部偏移量为 5 的内边距
EdgeInsets padding7 = 5.paddingBottom();

扩展:

  • paddingAll: 创建所有方向上偏移量相等的内边距
  • paddingHorizontal: 创建水平方向上对称的内边距
  • paddingVertical: 创建垂直方向上对称的内边距
  • paddingTop: 创建只有顶部内边距的 EdgeInsets
  • paddingLeft: 创建只有左侧内边距的 EdgeInsets
  • paddingRight: 创建只有右侧内边距的 EdgeInsets
  • paddingBottom: 创建只有底部内边距的 EdgeInsets

平台查询 #

示例:

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    if (context.isAndroid) {
      return Text('This is an Android device');
    } else if (context.isIOS) {
      return Text('This is an iOS device');
    } else if (context.isMacOS) {
      return Text('This is a MacOS device');
    } else if (context.isWindows) {
      return Text('This is a Windows device');
    } else if (context.isLinux) {
      return Text('This is a Linux device');
    } else if (context.isFuchsia) {
      return Text('This is a Fuchsia device');
    } else {
      return Text('Unknown platform');
    }
  }
}

扩展:

  • platform: 获取当前平台
  • isAndroid: 检查当前系统是否为 Android
  • isIOS: 检查当前系统是否为 iOS
  • isMacOS: 检查当前系统是否为 MacOS
  • isWindows: 检查当前系统是否为 Windows
  • isFuchsia: 检查当前系统是否为 Fuchsia
  • isLinux: 检查当前系统是否为 Linux

Screen Util 工具扩展 #

示例:

// 适配宽度
double adaptiveWidth = 100.w;

// 适配高度
double adaptiveHeight = 50.h;

// 适配字体大小
double fontSize = 16.sp;

// 创建适配后的 EdgeInsets
EdgeInsets padding = EdgeInsets.all(10).r;

// 创建适配后的 BorderRadius
BorderRadius borderRadius = BorderRadius.circular(8).r;

// 创建适配后的 BoxConstraints
BoxConstraints constraints = BoxConstraints(maxWidth: 200, maxHeight: 100).hw;

// 创建垂直间距
SizedBox verticalSpace = 20.verticalSpace;

// 创建水平间距
SizedBox horizontalSpace = 15.horizontalSpace;

扩展:

主要扩展方法列表:

  • ScreenUtilExtensions (on num)
    • w: 根据屏幕宽度适配尺寸
    • h: 根据屏幕高度适配尺寸
    • r: 适配圆角半径
    • dg: 适配对角线尺寸
    • dm: 适配直径尺寸
    • sp: 适配字体大小
    • spMin: 智能字体大小适配(不超过原始值)
    • spMax: 智能字体大小适配(取较大值)
    • sw: 屏幕宽度的倍数
    • sh: 屏幕高度的倍数
    • verticalSpace: 创建垂直方向的间距
    • horizontalSpace: 创建水平方向的间距
  • EdgeInsetsExtension (on EdgeInsets)
    • r: 使用 r 适配所有边距
    • dm: 使用 dm 适配所有边距
    • dg: 使用 dg 适配所有边距
    • w: 使用 w 适配所有边距
    • h: 使用 h 适配所有边距
  • BorderRadiusExtension (on BorderRadius)
    • r: 使用 r 适配所有角半径
    • w: 使用 w 适配所有角半径
    • h: 使用 h 适配所有角半径
  • RadiusExtension (on Radius)
    • r: 使用 r 适配 Radius
    • dm: 使用 dm 适配 Radius
    • dg: 使用 dg 适配 Radius
    • w: 使用 w 适配 Radius
    • h: 使用 h 适配 Radius
  • BoxConstraintsExtension (on BoxConstraints)
    • r: 使用 r 适配所有约束
    • hw: 使用 h 和 w 分别适配高度和宽度约束
    • w: 使用 w 适配所有约束
    • h: 使用 h 适配所有约束

数字转 SizedBox 扩展 #

示例:

// 创建一个宽度为 10 的水平间距
SizedBox horizontalGap = 10.horizontalSpace;

// 创建一个高度为 20 的垂直间距
SizedBox verticalGap = 20.verticalSpace;

// 在 Widget 树中使用
Column(
  children: [
    Text('First item'),
    10.verticalSpace,  // 添加 10 单位的垂直间距
    Text('Second item'),
    20.verticalSpace,  // 添加 20 单位的垂直间距
    Text('Third item'),
  ],
);

Row(
  children: [
    Text('Left'),
    15.horizontalSpace,  // 添加 15 单位的水平间距
    Text('Right'),
  ],
);

扩展:

  • horizontalSpace: 创建具有指定宽度的 SizedBox
  • verticalSpace: 创建具有指定高度的 SizedBox

String 字符串扩展 #

示例:

// 大写转换
print('hello world'.capitalize()); // 输出: Hello World
print('hello world'.capitalizeFirst()); // 输出: Hello world

// 布尔值转换
print('true'.isBool()); // 输出: true
print('false'.toBool()); // 输出: false

// 数字转换
print('123'.isNum()); // 输出: true
print('3.14'.toDouble()); // 输出: 3.14
print('42'.toInt()); // 输出: 42

// 颜色转换
Color color = 'FF5733'.toColor;
MaterialColor materialColor = 'FF5733'.toMaterialColor;

// 字符串处理
print('Hello  World'.removeAllWhitespace()); // 输出: HelloWorld
print('abc123'.hasMatch(r'\d+')); // 输出: true
print('<p>Hello</p>'.clearHtml); // 输出: Hello

扩展:

  • capitalize: 将每个单词的首字母大写
  • capitalizeFirst: 将字符串的第一个字母大写
  • isBool: 检查字符串是否可以转换为布尔值
  • toBool: 将字符串转换为布尔值
  • isNum: 检查字符串是否可以转换为数字
  • toNum: 将字符串转换为数字
  • isDouble: 检查字符串是否可以转换为双精度浮点数
  • toDouble: 将字符串转换为双精度浮点数
  • isInt: 检查字符串是否可以转换为整数
  • toInt: 将字符串转换为整数
  • toColor: 将十六进制颜色字符串转换为 Color 对象
  • toMaterialColor: 将十六进制颜色字符串转换为 MaterialColor 对象
  • removeAllWhitespace: 移除字符串中的所有空格
  • hasMatch: 检查字符串是否匹配指定的正则表达式模式
  • clearHtml: 移除字符串中的所有 HTML 标签

Text 文本扩展 #

示例:

Text myText = Text('Hello, World!');

// 修改文本样式
myText = myText.textStyle(TextStyle(color: Colors.blue));

// 设置文本为粗体
myText = myText.bold();

// 设置文本为斜体
myText = myText.italic();

// 设置字体大小
myText = myText.fontSize(18);

// 设置字体系列
myText = myText.fontFamily('Roboto');

// 添加文本阴影
myText = myText.textShadow(color: Colors.grey, blurRadius: 2);

// 设置文本颜色
myText = myText.textColor(Colors.red);

// 设置文本对齐方式
myText = myText.textAlignment(TextAlign.center);

// 组合多个样式
myText = myText
    .bold()
    .fontSize(20)
    .textColor(Colors.green)
    .textAlignment(TextAlign.right);

扩展:

  • copyWith: 创建一个新的 Text 对象,可选择性地修改其属性
  • textStyle: 应用新的 TextStyle
  • textScale: 设置文本缩放因子
  • bold: 将文本设置为粗体
  • italic: 将文本设置为斜体
  • fontWeight: 设置文本的字体粗细
  • fontSize: 设置文本的字体大小
  • fontFamily: 设置文本的字体系列
  • letterSpacing: 设置文本的字母间距
  • wordSpacing: 设置文本的单词间距
  • textShadow: 为文本添加阴影效果
  • textElevation: 为文本添加立体效果
  • textColor: 设置文本颜色
  • textAlignment: 设置文本对齐方式
  • textDirection: 设置文本方向
  • textBaseline: 设置文本基线
  • textWidthBasis: 设置文本宽度基准

TextSpan 文本扩展 #

示例:

TextSpan myTextSpan = TextSpan(text: 'Hello, World!');

// 修改文本样式
myTextSpan = myTextSpan.textStyle(TextStyle(color: Colors.blue));

// 设置文本为粗体
myTextSpan = myTextSpan.bold();

// 设置文本为斜体
myTextSpan = myTextSpan.italic();

// 设置字体大小
myTextSpan = myTextSpan.fontSize(18);

// 设置字体系列
myTextSpan = myTextSpan.fontFamily('Roboto');

// 添加文本阴影
myTextSpan = myTextSpan.textShadow(color: Colors.grey, blurRadius: 2);

// 设置文本颜色
myTextSpan = myTextSpan.textColor(Colors.red);

// 组合多个样式
myTextSpan = myTextSpan
    .bold()
    .fontSize(20)
    .textColor(Colors.green);

扩展:

  • copyWith: 创建一个新的 TextSpan 对象,可选择性地修改其属性
  • textStyle: 应用新的 TextStyle
  • bold: 将文本设置为粗体
  • italic: 将文本设置为斜体
  • fontWeight: 设置文本的字体粗细
  • fontSize: 设置文本的字体大小
  • fontFamily: 设置文本的字体系列
  • letterSpacing: 设置文本的字母间距
  • wordSpacing: 设置文本的单词间距
  • textShadow: 为文本添加阴影效果
  • textElevation: 为文本添加立体效果
  • textColor: 设置文本颜色
  • textBaseline: 设置文本基线

theme 主题扩展 #

示例:

// 在 Widget 中使用
Widget build(BuildContext context) {
  // 获取按钮主题
  final buttonTheme = context.themes.button;

  // 获取文本主题
  final textTheme = context.themes.text;

  // 获取图标主题
  final iconTheme = context.themes.icon;

  // ... 使用其他主题数据
}
Widget build(BuildContext context) {
  if (context.isDarkMode) {
    // 应用当前处于深色模式
    return DarkThemeWidget();
  } else if (context.isLightMode) {
    // 应用当前处于浅色模式
    return LightThemeWidget();
  }
  // 其他情况
  return DefaultThemeWidget();
}

扩展:

  • themes: 获取包含所有主题数据的 _Themes 对象
  • isDarkMode: 判断应用是否处于深色模式
  • isLightMode: 判断应用是否处于浅色模式

开发工具 #

示例:

Object.log("日志内容")
  • log: 打印日志

注意事项 #

这个使用说明概括了 ducafe_ui_core 类库的主要功能和使用方法。您可以根据需要进一步扩展或修改这个说明。如果您需要更详细的说明或有任何其他问题,请随时告诉我。

9
likes
60
points
52
downloads

Publisher

unverified uploader

Weekly Downloads

flutter ui core package for ducafecat.com

Homepage
Repository (GitHub)
View/report issues

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

flutter

More

Packages that depend on ducafe_ui_core