Flutter主题管理插件im_themed的使用
Flutter主题管理插件im_themed的使用
功能
im_themed
插件允许在运行时更改 ThemeData
。
特性
- 支持基本的
ThemeData
解析和编码为 JSON
开始使用
安装
在终端中运行以下命令来添加插件:
flutter pub add im_themed
或者在 pubspec.yaml
文件中添加依赖项:
dependencies:
im_themed: <last_version>
使用示例
完整的示例代码可以在 这里 查看。
示例代码
void main() async {
runApp(
const ImThemedApp(
app: MainPage(),
),
);
}
主页面代码
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:im_themed/im_themed.dart';
ThemeData initialTheme = ThemeData(
primarySwatch: Colors.blue,
brightness: Brightness.light,
);
void main() async {
runApp(
const ImThemedApp(
app: MainPage(),
),
);
}
class MainPage extends StatefulWidget {
const MainPage({super.key});
[@override](/user/override)
State<MainPage> createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
final JsonEncoder encoder = const JsonEncoder.withIndent(' ');
late final textController = TextEditingController(
text: encoder.convert(context.theme.toJson()),
);
[@override](/user/override)
Widget build(BuildContext context) {
return ImThemedApp(
initialTheme: initialTheme,
app: Builder(
builder: (context) {
return MaterialApp(
theme: context.theme,
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.primary,
title: Text(
'实时主题编辑器',
style: Theme.of(context).textTheme.headlineMedium?.copyWith(
color: Theme.of(context).colorScheme.onPrimary,
) ??
TextStyle(color: Theme.of(context).colorScheme.onPrimary),
),
),
body: SafeArea(
top: false,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Expanded(
child: TextField(
controller: textController,
decoration: const InputDecoration(
contentPadding: EdgeInsets.all(20.0),
),
expands: true,
minLines: null,
maxLines: null,
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: ElevatedButton(
onPressed: updateAppTheme,
child: const Padding(
padding: EdgeInsets.all(10.0),
child: Text('应用主题'),
),
),
),
],
),
),
),
);
}
),
);
}
void updateAppTheme() {
try {
final themeData = ThemeDataJsonConverterExtension.fromJson(
jsonDecode(textController.text),
);
setState(() {
initialTheme = themeData;
});
} catch (error) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(error.toString()),
),
);
}
}
}
在这个示例中,我们创建了一个简单的应用程序,其中包含一个文本框和一个按钮。用户可以输入主题数据的 JSON 表示形式,并通过点击“应用主题”按钮将其应用到当前主题。
关键代码解释
-
初始化主题
ThemeData initialTheme = ThemeData( primarySwatch: Colors.blue, brightness: Brightness.light, );
这里定义了初始主题。
-
构建方法
[@override](/user/override) Widget build(BuildContext context) { return ImThemedApp( initialTheme: initialTheme, app: Builder( builder: (context) { return MaterialApp( theme: context.theme, debugShowCheckedModeBanner: false, home: Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.primary, title: Text( '实时主题编辑器', style: Theme.of(context).textTheme.headlineMedium?.copyWith( color: Theme.of(context).colorScheme.onPrimary, ) ?? TextStyle(color: Theme.of(context).colorScheme.onPrimary), ), ), body: SafeArea( top: false, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Expanded( child: TextField( controller: textController, decoration: const InputDecoration( contentPadding: EdgeInsets.all(20.0), ), expands: true, minLines: null, maxLines: null, ), ), Padding( padding: const EdgeInsets.all(8.0), child: ElevatedButton( onPressed: updateAppTheme, child: const Padding( padding: EdgeInsets.all(10.0), child: Text('应用主题'), ), ), ), ], ), ), ), ); } ), ); }
构建方法中,我们使用
ImThemedApp
来包裹我们的MaterialApp
,并将初始主题传递给它。文本框用于输入 JSON 格式的主题数据,按钮用于更新主题。 -
更新主题
void updateAppTheme() { try { final themeData = ThemeDataJsonConverterExtension.fromJson( jsonDecode(textController.text), ); setState(() { initialTheme = themeData; }); } catch (error) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(error.toString()), ), ); } }
更多关于Flutter主题管理插件im_themed的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter主题管理插件im_themed的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter应用中使用im_themed
插件进行主题管理的代码示例。im_themed
是一个用于主题管理的Flutter插件,它允许你轻松地切换和管理应用的主题。假设你已经将im_themed
插件添加到了你的pubspec.yaml
文件中。
1. 添加依赖
首先,确保你已经在pubspec.yaml
文件中添加了im_themed
依赖:
dependencies:
flutter:
sdk: flutter
im_themed: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来获取依赖。
2. 创建主题数据
在你的应用中定义两种或多种主题,例如明亮主题和黑暗主题。
import 'package:flutter/material.dart';
import 'package:im_themed/im_themed.dart';
final ThemeData lightTheme = ThemeData(
brightness: Brightness.light,
primarySwatch: Colors.blue,
scaffoldBackgroundColor: Colors.white,
textTheme: TextTheme(
bodyText1: TextStyle(color: Colors.black),
),
);
final ThemeData darkTheme = ThemeData(
brightness: Brightness.dark,
primarySwatch: Colors.blueGrey,
scaffoldBackgroundColor: Colors.black,
textTheme: TextTheme(
bodyText1: TextStyle(color: Colors.white),
),
);
3. 使用ImThemed
包装应用
使用ImThemed
包装你的MaterialApp,并设置初始主题和主题提供者。
import 'package:flutter/material.dart';
import 'package:im_themed/im_themed.dart';
void main() {
runApp(ImThemed(
initialTheme: lightTheme, // 设置初始主题
themes: {
'light': lightTheme,
'dark': darkTheme,
},
builder: (context, theme) {
return MaterialApp(
title: 'Flutter Demo',
theme: theme,
home: MyHomePage(),
);
},
));
}
4. 在应用中切换主题
你可以通过按钮或其他UI元素来切换主题。以下是一个简单的例子,展示如何在主页中添加一个按钮来切换主题。
import 'package:flutter/material.dart';
import 'package:im_themed/im_themed.dart';
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String currentThemeKey = 'light';
void switchTheme() {
setState(() {
currentThemeKey = currentThemeKey == 'light' ? 'dark' : 'light';
ImThemed.of(context).setTheme(currentThemeKey);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Theme Switcher'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Current Theme: ${currentThemeKey == 'light' ? 'Light' : 'Dark'}',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: switchTheme,
child: Text('Switch Theme'),
),
],
),
),
);
}
}
5. 运行应用
现在你可以运行你的Flutter应用,你应该能够看到初始设置的主题,并且可以通过点击按钮来切换主题。
这个示例展示了如何使用im_themed
插件来管理Flutter应用中的主题。你可以根据需要进一步自定义和扩展这些代码。