Flutter流体界面设计插件fluid_ui_design的使用
Flutter流体界面设计插件fluid_ui_design的使用
Fluid UI Design 是一个基于 Utopia 原则实现流体设计的包(Utopia 官网)。与传统的响应式设计不同,Fluid UI Design 根据事先定义的缩放比例和屏幕大小来计算尺寸值。在使用此包之前,建议先阅读 Utopia 的文章以更好地理解这种设计理念。
请注意,这只是一个 0.0.1 版本的框架,因此可能存在一些错误,并且不是所有的功能都已经实现。如果你发现任何错误或有功能请求,请在 GitHub 上创建一个 issue。
开始使用
要使所有 Fluid 类在布局中可用,你需要提供一个配置对象作为主题扩展到你的主题中。这将使所有 Fluid 类在主题中可用。
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
FluidConfig config = FluidConfig.fromContext(context);
return MaterialApp(
theme: ThemeData(
extensions: <ThemeExtension<dynamic>>[
config,
],
),
home: const MyHomePage(),
);
}
}
这将加载带有预定义比例尺和断点的应用。要自定义比例尺和断点,可以在 FluidWrapper 中传递它们。
FluidConfig config = FluidConfig.fromContext(context,
spaceConfig: SpaceConfig(
baseMin: 4,
baseMax: 8,
xxxsModifier: 0.25,
xxsModifier: 0.5,
xsModifier: 0.75,
sModifier: 1,
mModifier: 1.5,
lModifier: 2,
xlModifier: 3,
xxlModifier: 4,
xxxlModifier: 6,
),
typeConfig: TypeConfig(
minBaseFontSize: 16,
maxBaseFontSize: 20,
minTypeScaleModifier: 1.2,
maxTypeScaleModifier: 1.5,
),
viewportConfig: ViewportConfig(
minViewportSize: 320,
maxViewportSize: 1200,
)
);
return MaterialApp(
theme: ThemeData(
extensions: <ThemeExtension<dynamic>>[
config,
],
),
home: const MyHomePage(),
);
Fluid 类
Fluid Config
如果你需要在代码中访问配置,可以使用 FluidConfig
类。这个类是一个配置对象的包装器,并提供了一些辅助方法来获取当前视口大小和当前缩放比例。
我们在主题中保存了这个配置文件,所以你可以从主题中访问它。使用以下代码可以从我们之前创建的主题中检索配置:
FluidConfig config = FluidConfig.of(context);
或者使用 BuildContext
上的扩展方法:
FluidConfig config = context.fluid;
FluidSize
FluidSize
是一个确定大小的基本类。它可以用来根据当前屏幕大小与 FluidWrapper
设置的最小和最大值来获取线性值。
FluidSize(fluidConfig: context.fluid, min: 100, max: 200);
当在最小屏幕尺寸/断点时,它会返回 100。当在最大屏幕尺寸/断点时,它会返回 200。当在中间某个屏幕尺寸/断点时,它会返回介于两者之间的值。
FluidSpace
FluidSpace
是基于设置中的修改比例尺的一个层。设计师可以在设计中创建一个 FluidSpace 缩放比例,通过这些修改比例尺,你可以得到一个逻辑上可使用的布局尺寸。FluidSpaces
类用于预设比例尺。
要获取特定的 FluidSpace,可以使用以下代码:
SizedBox(height: FluidSpaces(context.fluid).m.value);
更简洁的方法是使用 BuildContext
上的扩展方法。这个扩展方法在包中可用。
SizedBox(height: context.fluid.spaces.m);
FluidSpacePair
有时你希望根据屏幕大小让 FluidSpace 更多或更少地增长。在大屏幕上,你可能希望顶部有更多的空间。这可以通过 FluidSpacePair
来实现。这个类接受两个 FluidSpaces
并在小屏幕上返回第一个,在大屏幕上返回第二个。当屏幕大小介于两者之间时,它会返回一个介于两者之间的值。
FluidSpacePair(
fluidConfig: context.fluid,
small: FluidSpaces(context.fluid).m,
large: FluidSpaces(context.fluid).xl,
);
FluidType // FluidFontSize
FluidType
用于创建一个逻辑类型比例尺。对于排版,你希望根据屏幕大小有不同的字体大小。使用 FluidType
还可以根据屏幕大小在视口中缩放比例尺。这意味着在大屏幕上字体大小的变化比在小屏幕上更大。这基于 Utopia 原则。通常,我们使用一个从 -10 到 10 的比例尺,其中 0 是基准字体大小。这个比例尺可以在设置中更改。要获取特定比例尺的值,可以使用以下代码:
FluidType(fluidConfig: context.fluid, scaleStep: 2).value;
更简洁的方法是使用 BuildContext
上的扩展方法。这个扩展方法在包中可用。
context.fluid.typeSize(2);
或者
context.fluid.fontSize(2);
文本缩放助手
为了简化使用文本比例尺,我们提供了 TextScaleHelper
。这个助手是为与 Google Fonts 结合使用而构建的,但也可以用于任何字体。以下是如何使用 Google Fonts 的示例:
config.fromGoogleFont(GoogleFonts.firaSans).bold.displayLarge;
这将返回一个具有粗体字体、正确缩放大小并且基于 Google 字体 Fira Sans 的 TextStyle
。
如果你想用另一个字体实现这个缩放助手,你需要自己创建一个 TextScaleHelper
对象,并提供一个回调函数,该函数使用正确的参数构建字体。
TextScaleHelper(
this,
({
required FontWeight fontWeight,
required double fontSize,
required Color color
}) {
return TextStyle(
fontWeight: fontWeight,
fontSize: fontSize,
color: color,
// 添加定义所需字体设置的参数
);
},
);
示例代码
以下是完整的示例代码,展示了如何使用 fluid_ui_design
包。
import 'package:fluid_ui_design/fluid_ui_design.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'playground_page.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
FluidConfig config = FluidConfig.fromContext(context,
spaceConfig: const SpaceConfig(),
typeConfig: const TypeConfig(minBaseFontSize: 10, maxBaseFontSize: 12),
viewportConfig: const ViewportConfig()
);
return MaterialApp(
theme: ThemeData(
useMaterial3: true,
primaryColor: const Color(0xffe65728),
textTheme: TextTheme(
displayLarge: config.fromGoogleFont(GoogleFonts.firaSans).bold.displayLarge,
displayMedium: config.fromGoogleFont(GoogleFonts.firaSans).bold.displayMedium,
displaySmall: config.fromGoogleFont(GoogleFonts.firaSans).displaySmall,
headlineLarge: config.fromGoogleFont(GoogleFonts.firaSans).bold.headlineLarge,
headlineMedium: config.fromGoogleFont(GoogleFonts.firaSans).headlineMedium,
headlineSmall: config.fromGoogleFont(GoogleFonts.firaSans).headlineSmall,
bodyLarge: config.fromGoogleFont(GoogleFonts.firaSans).bodyLarge,
bodyMedium: config.fromGoogleFont(GoogleFonts.firaSans).bodyMedium,
bodySmall: config.fromGoogleFont(GoogleFonts.firaSans).bodySmall,
),
extensions: <ThemeExtension<dynamic>>[
config,
],
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
[@override](/user/override)
Widget build(BuildContext context) {
return const PlaygroundPage();
}
}
更多关于Flutter流体界面设计插件fluid_ui_design的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter流体界面设计插件fluid_ui_design的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
fluid_ui_design
是一个用于 Flutter 的插件,旨在帮助开发者轻松实现流体界面设计。流体设计是一种灵活的、响应式的设计方法,能够根据屏幕尺寸和设备类型动态调整布局和样式。以下是如何使用 fluid_ui_design
插件的基本步骤和示例。
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 fluid_ui_design
插件的依赖:
dependencies:
flutter:
sdk: flutter
fluid_ui_design: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 基本用法
2.1 初始化 FluidUI
在你的 Flutter 应用中,首先需要初始化 FluidUI
。通常,你可以在 main.dart
文件中进行初始化:
import 'package:flutter/material.dart';
import 'package:fluid_ui_design/fluid_ui_design.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return FluidUI(
child: MaterialApp(
title: 'Fluid UI Design Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomeScreen(),
),
);
}
}
2.2 使用 FluidContainer
FluidContainer
是一个响应式容器,能够根据屏幕尺寸自动调整大小和布局。你可以在任何地方使用它:
class HomeScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Fluid UI Design'),
),
body: Center(
child: FluidContainer(
width: 0.8, // 宽度的百分比
height: 0.5, // 高度的百分比
color: Colors.blue,
child: Center(
child: Text(
'Hello, Fluid UI!',
style: TextStyle(color: Colors.white, fontSize: 24),
),
),
),
),
);
}
}
2.3 使用 FluidText
FluidText
是一个响应式文本组件,能够根据屏幕尺寸自动调整字体大小:
FluidText(
'Responsive Text',
style: TextStyle(color: Colors.black),
scaleFactor: 0.05, // 字体大小的比例因子
)
2.4 使用 FluidPadding
FluidPadding
是一个响应式内边距组件,能够根据屏幕尺寸自动调整内边距:
FluidPadding(
padding: EdgeInsets.all(0.05), // 内边距的百分比
child: Container(
color: Colors.green,
child: Center(
child: Text('Fluid Padding'),
),
),
)
3. 自定义响应式布局
你可以使用 FluidUI
提供的工具来创建自定义的响应式布局。例如,你可以使用 FluidUI.of(context)
来获取当前的屏幕尺寸,并根据尺寸动态调整布局。
class CustomLayout extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
final screenSize = FluidUI.of(context).screenSize;
final isLargeScreen = screenSize.width > 600;
return Column(
children: [
if (isLargeScreen)
Text('This is a large screen')
else
Text('This is a small screen'),
FluidContainer(
width: isLargeScreen ? 0.5 : 0.8,
height: isLargeScreen ? 0.3 : 0.5,
color: Colors.red,
child: Center(
child: Text('Custom Layout'),
),
),
],
);
}
}
4. 响应式断点
FluidUI
提供了响应式断点功能,允许你根据屏幕宽度定义不同的布局和行为。你可以使用 FluidUI.of(context).breakpoint
来获取当前的断点。
class BreakpointExample extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
final breakpoint = FluidUI.of(context).breakpoint;
return Scaffold(
appBar: AppBar(
title: Text('Breakpoint Example'),
),
body: Center(
child: Text('Current Breakpoint: $breakpoint'),
),
);
}
}