Flutter UI定制插件flexi_ui的使用
Flutter UI定制插件flexi_ui的使用
概述
flexi_ui
是一个用于在Flutter中创建响应式UI的插件,解决了 screen_util
包在处理多个Figma设计(如小屏幕和大屏幕)时的不足。通过提供两个值来分别适应小屏和大屏,flexi_ui
可以自动计算并调整其他屏幕尺寸。
主要特性
- 响应式组件:根据屏幕大小自动调整组件尺寸。
- 自适应文本:动态调整文本大小。
- 设备特定布局:针对不同设备(如手机、平板、桌面)进行定制。
- 方向处理:无缝适应屏幕方向变化。
- 响应式卡片配置:轻松实现整个卡片组件的响应式设计。
快速入门
添加依赖
首先,在你的 pubspec.yaml
文件中添加 flexi_ui
依赖:
dependencies:
flexi_ui: ^0.0.8
然后,在你的主 Dart 文件中导入该包:
import 'package:flexi_ui/flexi_ui.dart';
使用示例
初始化 ScreenAdaptiveConfig
在开始编写代码之前,请注意这个包完全依赖于屏幕大小的变化进行计算,因此不要在任何地方使用 const
关键字,除非是元组(Tuple)。以下是一个简单的初始化示例:
import 'package:flutter/material.dart';
import 'package:flexi_ui/flexi_ui.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Builder(
builder: (context) {
return OrientationBuilder(
builder: (context, orientation) {
ScreenAdaptiveConfig.init(
context: context,
orientation: orientation,
targetDevice: TargetDeviceType.phonePortrait, // 默认目标设备
);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: HomeScreen(),
);
},
);
},
),
);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: adaptiveText(),
),
);
}
Widget adaptiveText() {
return Text(
"Adaptive Text",
style: TextStyle(fontSize: const Tuple2(12, 40).aw),
);
}
}
响应式文本和组件
使用 Tuple2
提供两个值,第一个值表示小屏幕字体大小,第二个值表示大屏幕字体大小。使用 .aw
方法使字体大小响应不同的屏幕尺寸:
Widget adaptiveText() {
return Text(
"Adaptive Text",
style: TextStyle(fontSize: const Tuple2(12, 40).aw),
);
}
设备特定组件
根据设备类型显示不同的文本:
Widget deviceSpecificWidget() {
return Center(
child: ScreenAdaptiveConfig.instance!.isPhonePortrait
? const Text("Small Screen")
: const Text("Large Screen"),
);
}
自适应宽度和高度
使用 .w
和 .h
来设置基于屏幕宽度和高度的组件尺寸:
Widget halfScreenWidth() {
return Container(
width: 0.5.w,
height: 40,
color: Colors.red,
);
}
Widget halfScreenHeight() {
return Container(
width: 400,
height: 0.5.h,
color: Colors.red,
);
}
响应式卡片配置
如果你有一个包含多个子组件的卡片,可以使用 ResponsiveCardConfig
。需要使用 LayoutBuilder
获取当前父容器的宽高,并传递目标宽高:
Widget responsiveCard() {
return LayoutBuilder(
builder: (context, constraints) {
ResponsiveCardConfig().init(
currentParentWidth: constraints.maxWidth,
currentParentHeight: constraints.maxHeight,
targetParentWidth: 300,
targetParentHeight: 300,
);
return Container(
color: Colors.lightBlue,
width: const Tuple2(300, 800).aw,
height: const Tuple2(300, 800).aw,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
color: Colors.blueAccent,
width: 100.fw,
height: 60.fh,
child: Center(
child: Container(
width: 30.fw,
height: 30.fw,
decoration: BoxDecoration(
color: Colors.red,
borderRadius: BorderRadius.circular(30.fw),
),
),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
color: Colors.orange,
width: 50.fw,
height: 30.fh,
),
Container(
color: Colors.red,
width: 50.fw,
height: 30.fh,
),
],
),
],
),
);
},
);
}
结论
flexi_ui
插件为Flutter开发者提供了强大的工具,使得创建响应式和自适应的UI变得更加简单和高效。你可以通过访问 GitHub 示例 查看更多示例代码,并在遇到问题或有建议时,通过 GitHub Issues 或 Pull Requests 进行反馈和贡献。
更多关于Flutter UI定制插件flexi_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter UI定制插件flexi_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用flexi_ui
插件进行UI定制的一个简单示例。flexi_ui
是一个用于Flutter应用程序UI定制的插件,它允许开发者通过配置文件轻松调整应用的UI主题和布局。
首先,确保你已经在pubspec.yaml
文件中添加了flexi_ui
依赖:
dependencies:
flutter:
sdk: flutter
flexi_ui: ^最新版本号 # 请替换为最新的版本号
然后,运行flutter pub get
来获取依赖。
接下来,我们将展示如何设置和使用flexi_ui
。以下是一个简单的示例,包括如何配置主题和应用它。
1. 配置主题
在项目的根目录下创建一个名为config
的文件夹,并在其中创建一个名为theme_config.dart
的文件。这个文件将包含我们的主题配置。
// config/theme_config.dart
import 'package:flexi_ui/flexi_theme_data.dart';
class ThemeConfig {
static FlexiThemeData lightTheme() {
return FlexiThemeData(
baseColorScheme: FlexiColorScheme.light(
primary: Colors.blue,
secondary: Colors.green,
background: Colors.white,
surface: Colors.grey[200]!,
onSurface: Colors.black87,
),
textTheme: FlexiTextThemeData(
bodyText1: TextStyle(fontSize: 16, color: Colors.black87),
bodyText2: TextStyle(fontSize: 14, color: Colors.black54),
// 其他文本样式配置...
),
// 其他主题配置...
);
}
static FlexiThemeData darkTheme() {
return FlexiThemeData(
baseColorScheme: FlexiColorScheme.dark(
primary: Colors.blue.shade900,
secondary: Colors.green.shade900,
background: Colors.black,
surface: Colors.grey[900]!,
onSurface: Colors.white70,
),
textTheme: FlexiTextThemeData(
bodyText1: TextStyle(fontSize: 16, color: Colors.white70),
bodyText2: TextStyle(fontSize: 14, color: Colors.white54),
// 其他文本样式配置...
),
// 其他主题配置...
);
}
}
2. 应用主题
在你的main.dart
文件中,你需要配置并应用这些主题。
// main.dart
import 'package:flutter/material.dart';
import 'package:flexi_ui/flexi_ui.dart';
import 'config/theme_config.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FlexiMaterialApp(
title: 'Flexi UI Demo',
themeMode: ThemeMode.system, // 或者 ThemeMode.light / ThemeMode.dark
theme: ThemeConfig.lightTheme(),
darkTheme: ThemeConfig.darkTheme(),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flexi UI Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Hello, Flexi UI!',
style: Theme.of(context).textTheme.bodyText1,
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {},
child: Text('Primary Button'),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(
Theme.of(context).colorScheme.primary,
),
),
),
],
),
),
);
}
}
在这个示例中,我们创建了一个简单的Flutter应用程序,它使用flexi_ui
提供的FlexiMaterialApp
小部件,并根据系统主题模式(或手动设置的主题模式)应用不同的主题。
这个示例展示了如何配置和使用flexi_ui
进行UI定制。根据你的需求,你可以进一步扩展和自定义这些配置。