Flutter主题适配插件adaptive_theme的使用
Flutter主题适配插件adaptive_theme的使用
介绍
Adaptive Theme 是为Flutter应用添加对浅色和深色主题支持最简单的方法。它允许手动设置浅色或深色主题,并且可以基于系统设置定义主题。它还能够在应用程序重启时保持主题模式的更改。
使用步骤
添加依赖
在pubspec.yaml
中添加以下依赖:
dependencies:
adaptive_theme: ^latest_version # 替换为最新版本号
初始化
要在你的应用中使用AdaptiveTheme
,你需要将MaterialApp
包装在AdaptiveTheme
中。
import 'package:adaptive_theme/adaptive_theme.dart';
import 'package:flutter/material.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final savedThemeMode = await AdaptiveTheme.getThemeMode();
runApp(MyApp(savedThemeMode: savedThemeMode));
}
class MyApp extends StatelessWidget {
final AdaptiveThemeMode? savedThemeMode;
const MyApp({super.key, this.savedThemeMode});
@override
Widget build(BuildContext context) {
return AdaptiveTheme(
light: ThemeData.light(useMaterial3: true),
dark: ThemeData.dark(useMaterial3: true),
initial: savedThemeMode ?? AdaptiveThemeMode.light,
builder: (theme, darkTheme) => MaterialApp(
title: 'Adaptive Theme Demo',
theme: theme,
darkTheme: darkTheme,
home: MyHomePage(),
),
debugShowFloatingThemeButton: true, // 启用浮动按钮来切换主题模式
);
}
}
切换主题模式
你可以通过调用setLight()
、setDark()
或setSystem()
方法轻松地切换主题模式:
AdaptiveTheme.of(context).setLight(); // 设置为浅色模式
AdaptiveTheme.of(context).setDark(); // 设置为深色模式
AdaptiveTheme.of(context).setSystem(); // 设置为系统默认模式
或者使用toggleThemeMode()
来切换当前的主题模式:
AdaptiveTheme.of(context).toggleThemeMode();
更改主题
如果你想完全改变主题(例如更改颜色),可以使用setTheme
方法:
AdaptiveTheme.of(context).setTheme(
light: ThemeData(
useMaterial3: true,
brightness: Brightness.light,
colorSchemeSeed: Colors.purple,
),
dark: ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
colorSchemeSeed: Colors.purple,
),
);
重置主题
可以通过调用reset()
方法将主题重置为初始化时提供的默认值:
AdaptiveTheme.of(context).reset();
设置默认主题
如果你想在以后重置时使用不同的默认主题,可以在设置新主题时将isDefault
参数设为true
:
AdaptiveTheme.of(context).setTheme(
light: ThemeData(
useMaterial3: true,
brightness: Brightness.light,
colorSchemeSeed: Colors.blue,
),
dark: ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
colorSchemeSeed: Colors.blue,
),
isDefault: true,
);
获取启动时的主题模式
为了避免首次渲染时的主题闪烁,你可以在main()
方法中异步加载之前保存的主题模式:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final savedThemeMode = await AdaptiveTheme.getThemeMode();
runApp(MyApp(savedThemeMode: savedThemeMode));
}
// 在MyApp中使用savedThemeMode
AdaptiveTheme(
light: lightTheme,
dark: darkTheme,
initial: savedThemeMode ?? AdaptiveThemeMode.light,
builder: (theme, darkTheme) => MaterialApp(
title: 'Adaptive Theme Demo',
theme: theme,
darkTheme: darkTheme,
home: MyHomePage(),
),
)
监听主题模式变化
你可以监听主题模式的变化,并根据需要更新UI:
ValueListenableBuilder(
valueListenable: AdaptiveTheme.of(context).modeChangeNotifier,
builder: (_, mode, child) {
// 更新UI逻辑
return Container();
},
);
浮动主题按钮
从v3.3.0开始,你可以通过设置debugShowFloatingThemeButton
为true
来启用一个浮动按钮,用于快速切换主题模式:
AdaptiveTheme(
light: ThemeData.light(),
dark: ThemeData.dark(),
debugShowFloatingThemeButton: true,
initial: AdaptiveThemeMode.light,
builder: (theme, darkTheme) => MaterialApp(
theme: theme,
darkTheme: darkTheme,
home: MyHomePage(),
),
);
注意事项
- 非持久化主题更改:
AdaptiveTheme
仅持久化主题模式(浅色/深色/系统),不会持久化主题本身。如果你动态加载了新的主题,请确保在每次应用启动时重新设置。 - 使用SharedPreferences:该插件内部使用
shared_preferences
来持久化主题模式。如果你的应用也使用了shared_preferences
,请小心不要清除这些偏好设置,除非你希望主题模式恢复到初始状态。
示例代码
以下是完整的示例代码,展示了如何创建一个包含主题切换功能的应用程序:
import 'package:adaptive_theme/adaptive_theme.dart';
import 'package:flutter/material.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final savedThemeMode = await AdaptiveTheme.getThemeMode();
runApp(MyApp(savedThemeMode: savedThemeMode));
}
class MyApp extends StatelessWidget {
final AdaptiveThemeMode? savedThemeMode;
const MyApp({super.key, this.savedThemeMode});
@override
Widget build(BuildContext context) {
return AdaptiveTheme(
light: ThemeData(
useMaterial3: true,
brightness: Brightness.light,
colorSchemeSeed: Colors.blue,
),
dark: ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
colorSchemeSeed: Colors.blue,
),
initial: savedThemeMode ?? AdaptiveThemeMode.light,
builder: (theme, darkTheme) => MaterialApp(
title: 'Adaptive Theme Demo',
theme: theme,
darkTheme: darkTheme,
home: const MyHomePage(),
),
debugShowFloatingThemeButton: true,
);
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Adaptive Theme Demo'),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'这是一个展示adaptive_theme使用的示例应用。',
),
const Text(
'你可以使用下面的开关在浅色和深色主题之间切换。',
),
const SizedBox(height: 20),
Row(
mainAxisSize: MainAxisSize.min,
children: [
const Text('浅色'),
const SizedBox(width: 10),
Switch(
value: AdaptiveTheme.of(context).mode.isDark,
onChanged: (value) {
if (value) {
AdaptiveTheme.of(context).setDark();
} else {
AdaptiveTheme.of(context).setLight();
}
},
),
const SizedBox(width: 10),
const Text('深色'),
],
),
],
),
),
),
);
}
}
通过以上步骤,你就可以在Flutter应用中轻松实现浅色和深色主题的切换,并且能够持久化用户的主题选择。
更多关于Flutter主题适配插件adaptive_theme的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter主题适配插件adaptive_theme的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用adaptive_theme
插件来实现主题适配的示例代码。adaptive_theme
插件允许你根据系统主题(如亮色或暗色模式)动态更改你的Flutter应用的主题。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加adaptive_theme
依赖:
dependencies:
flutter:
sdk: flutter
adaptive_theme: ^2.0.0 # 请检查最新版本号
然后运行flutter pub get
来安装依赖。
2. 配置主题
在你的main.dart
文件中,配置你的主题数据并使用AdaptiveTheme
来管理这些主题。
import 'package:flutter/material.dart';
import 'package:adaptive_theme/adaptive_theme.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return AdaptiveTheme(
// 初始化主题数据
light: ThemeData(
brightness: Brightness.light,
primarySwatch: Colors.blue,
// 其他主题配置...
),
dark: ThemeData(
brightness: Brightness.dark,
primarySwatch: Colors.blueGrey,
// 其他主题配置...
),
// 设置初始主题模式,可以设置为 AdaptiveThemeMode.light, AdaptiveThemeMode.dark 或 AdaptiveThemeMode.system
initial: AdaptiveThemeMode.system,
builder: (context, theme) {
return MaterialApp(
title: 'Flutter Demo',
theme: theme,
home: MyHomePage(),
);
},
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Adaptive Theme Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Hello, Flutter!',
style: Theme.of(context).textTheme.headline4,
),
ElevatedButton(
onPressed: () {
// 手动切换主题
AdaptiveTheme.of(context).setThemeMode(
AdaptiveThemeMode.of(context) == AdaptiveThemeMode.light
? AdaptiveThemeMode.dark
: AdaptiveThemeMode.light,
);
},
child: Text('Toggle Theme'),
),
],
),
),
);
}
}
3. 监听主题变化(可选)
如果你想在主题变化时执行一些额外的操作,可以在你的Widget中使用AdaptiveThemeListener
。
import 'package:adaptive_theme/adaptive_theme.dart';
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
@override
Widget build(BuildContext context) {
return AdaptiveThemeListener(
builder: (context, themeMode) {
print('Theme mode changed to: $themeMode');
return Container(
// 你的Widget内容
);
},
child: Container(
// 你的Widget内容
),
);
}
}
4. 使用自定义主题(可选)
你也可以通过覆盖AdaptiveTheme
的buildMaterialApp
方法来使用自定义的MaterialApp
配置。
AdaptiveTheme(
light: ThemeData(
// 自定义的Light主题
),
dark: ThemeData(
// 自定义的Dark主题
),
initial: AdaptiveThemeMode.system,
buildMaterialApp: (context, theme) {
return MaterialApp(
// 自定义的MaterialApp配置
theme: theme,
// 其他配置...
home: MyHomePage(),
);
},
);
通过这些步骤,你应该能够在Flutter项目中成功使用adaptive_theme
插件来实现主题适配。根据你的需求,你可以进一步自定义和扩展这些代码。