flutter 自定义主题切换
1. 定义local_srorage.dart文件
使用Flutter第三方插件shared_preferences实现存储键值对信息
相关shared_preferences插件可参考: flutter 本地存储 (shared_preferences)
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart'; class LocalStorage {
static Future get(String key) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString(key);
} static Future set(String key, String value) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString(key, value);
} static Future setJSON(String key, value) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
value = json.encode(value); //对value进行编码,将对象传递给
json.encode
方法
prefs.setString(key, value);
} static Future remove(String key) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.remove(key);
}
}
2. 定义provide 状态管理
index.dart
该dart文件中涉及的Provide状态管理参考: https://www.cnblogs.com/john-hwd/p/10790460.html
import 'package:flutter/material.dart';
import 'package:provide/provide.dart';
export 'package:provide/provide.dart'; // 暴露Provider方法,不写此句也可在其他页面再次import import 'package:flutter_smart_park/untils/local_storage.dart'; class ConfigProvide with ChangeNotifier {
var parentContext; // 接受Provider所传的context
increment(context) { // provider的model
parentContext = context;
notifyListeners();
} // 主题
String theme = 'purple'; Future $getTheme() async {
String _theme = await LocalStorage.get('theme');
print('++++++++++++++++++++');
print(_theme);
if (_theme != null) {
$setTheme(_theme);
}
} Future $setTheme(payload) async {
theme = payload;
LocalStorage.set('theme', payload);
notifyListeners();
}
} final providers = Providers() //将ConfigProvide对象添加进providers
..provide(Provider<ConfigProvide>.value(ConfigProvide()));
3. 定义theme.dart
import ......
... // 引用所需第三方库 Map materialColor = { // 主副颜色
'purple': {
"primaryColor": 0xFF7B1FA2,
"primaryColorLight": 0xFF9C27B0,
},
'pink': {
"primaryColor": 0xFFc2185b,
"primaryColorLight": 0xFFd81b60,
},
'deeppink': {
"primaryColor": 0xFFf50057,
"primaryColorLight": 0xFFe91e63,
},
'blue': {
"primaryColor": 0xFF1976D2,
"primaryColorLight": 0xFF2196F3,
},
}; class AppTheme {
static Map mainColor = materialColor['purple']; // 默认颜色
static getThemeData(String theme) { // 获取theme方法: getThemeData();
mainColor = materialColor[theme]; // 设置主题颜色
ThemeData themData = ThemeData(
// scaffoldBackgroundColor: Colors.red, // 页面的背景颜色 primaryColor: Color(mainColor["primaryColor"]), // 主颜色
primaryColorLight: Color(mainColor["primaryColorLight"]),
// 按钮颜色
buttonTheme: ButtonThemeData(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5.0),
),
textTheme: ButtonTextTheme.normal,
buttonColor: Color(mainColor["primaryColor"]),
),
// 小部件的前景色(旋钮,文本,过度滚动边缘效果等)。
accentColor: Color(mainColor["primaryColor"]), // appbar样式
appBarTheme: AppBarTheme(
iconTheme: IconThemeData(color: Colors.white),
textTheme: TextTheme(
title: TextStyle(
color: Colors.white,
fontSize: 20.0,
),
),
), // 图标样式
iconTheme: IconThemeData(
color: Color(mainColor["primaryColor"]),
), // 用于自定义对话框形状的主题。
dialogTheme: DialogTheme(
backgroundColor: Colors.white,
titleTextStyle: TextStyle(
fontSize: 18.0,
color: Colors.black87,
),
),
);
return themData;
}
}
ThemeData属性详解: https://www.jianshu.com/p/059c5794b29c
4. main.dart 应用
import 'package:flutter/material.dart';
import 'package:flutter_smart_park/config/theme.dart' show AppTheme; //主题 import 'package:flutter_smart_park/pages/page.dart';
import 'package:flutter_smart_park/common/common.dart'; void main() async {
runApp(ProviderNode(child: MyApp(), providers: providers)); //将状态放入顶层
} class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
Provide.value<ConfigProvide>(context).$getTheme(); //修改当前主题
return Provide<ConfigProvide>( // 使用主题
builder: (context, child, configProvide) {
return MaterialApp(
title: '智慧园区',
debugShowCheckedModeBanner: false, //调试显示检查模式横幅
onGenerateRoute: Routes.router.generator, //生成路由
theme: AppTheme.getThemeData(configProvide.theme),
home: Pages(),
);
},
);
}
}
MaterialApp 详解: https://www.jianshu.com/p/57c7d66c7688
flutter 自定义主题切换的更多相关文章
- 基于 Flutter 以两种方式实现App主题切换
概述 App主题切换已经成为了一种流行的用户体验,丰富了应用整体UI视觉效果.例如,白天夜间模式切换.实现该功能的思想其实不难,就是将涉及主题的资源文件进行全局替换更新.说到这里,我想你肯定能联想到一 ...
- ASP.NET Core 中的SEO优化(4):自定义视图路径及主题切换
系列回顾 <ASP.NET Core 中的SEO优化(1):中间件实现服务端静态化缓存> <ASP.NET Core 中的SEO优化(2):中间件中渲染Razor视图> < ...
- vue,elementUI切换主题,自定义主题
本文介绍两种elementUI切换主题色的方法 项目示例:http://test.ofoyou.com/theme/ git代码:记得star哦,谢谢 1:官方提供的方法,直接修改scss文件达到修改 ...
- Android 主题切换 小结
前言 我们用手机的时候经常看到 设置里面有夜间模式和白天模式来更换APP的主题,以前以为很简单,但是实际做起来还是有各种不完美,那么我们也要去了解各种解决方案来丰富我们的知识,现在我们就来看看各种优劣 ...
- 演练Ext JS 4.2自定义主题
本文将根据API文档中关于主题的介绍做的一次演练,以便熟悉自定义主题的过程. 练习环境: Sencha Cmd v4.0.1.45 Ruby 1.9.3-p392 firefox 26 首先,使用以下 ...
- vue-基于elementui自定义主题更换皮肤及自定义内容的皮肤跟换
参考这篇博客https://blog.csdn.net/young_Emily/article/details/78591261做一遍,加上自己的一些理解 思路:通过自己上一篇博客https://ww ...
- 轻量i3wm配置使用笔记 -- 主题切换器(j4-make-config)
快速切换主题 j4-make-config介绍: j4-make-config脚本可以方便地在几组"主题"之间切换,还可以根据当前工作的环境,轻松地从几个不同的配置部分组合一个完整 ...
- ModernUI教程:创建自定义主题
Modern UI WPF包括两个内置主题(dark与light).在1.0.3版本,您可以构建自定义的主题.Modern UI应用程序通常有在全局资源字典App.xaml中有如下定义 ...
- 如何优雅使用Sublime Text3(Sublime设置豆沙绿背景色和自定义主题)
♣Sublime Text3软件的下载 ♣设置字体的大小 ♣设置背景色和关键字颜色(Color Scheme 生成器) ♣快速生成html头文件 1.Sublime Text3软件的下载地址和包含的文 ...
随机推荐
- ABP框架连接Mysql数据库
开始想用Abp框架来搭建公司的新项目,虽然一切还没有定数,但是兵马未动,粮草先行,我先尝试一下整个过程,才能够更好的去争取机会. 此次技术选型:Abp(Asp.Net core mvc)+mysql( ...
- SLAM+语音机器人DIY系列:(二)ROS入门——9.熟练使用rviz
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- myeclipse配置tomcat服务器
在进行j2EE开发时,需要进行服务器配置, 这里因为要进行servlet开发,也要配置服务器.这里以在myeclipse上配置tomcat服务器为例 这里只是做下记录,方便自己以后查看 1.打开mye ...
- docker 安装 MySQL 8,并减少内存占用 记录
目前vps 1cpu 512m内存 MySQL内存占用77% ,约350m ,经过修改配置文件优化后如下 $ ps aux 进入docker bash $ docker exec -it pwc-my ...
- jquery中的$.fn的用法
JQuery里的原型prototype分析 http://www.nowamagic.net/librarys/veda/detail/653 jquery中的$.fn的用法 ...
- 前端_Bootstrap简单使用
首先说一下简单使用方法: 1.首先上官网下载Bootstrap(就是一些js文件和一些css文件) ,网址: https://v3.bootcss.com/getting-started/#downl ...
- MySQL数据库中的四种隔离级别
事务的隔离性比想象的要复杂,在 SQL 标准中定义了四种级别的隔离级别.通常而言,较低级别的隔离通常可以执行更高的并发,系统的开销也更低 READ UNCOMMITTED 该级别为未提交读.在该级别中 ...
- css文字超出一行用点表示
1,css超出一行用点表示 white-space:nowrap; overflow:hidden; text-overflow:ellipsis; 2,css超出二行用点表示 overflow:hi ...
- js实现浏览器调用电脑的摄像头拍照
<!DOCTYPE html> <html lang="en"> <head> <style> * { margin: ; padd ...
- kotlin 第一个Android项目
一.创建过程 二.TextView点击事件 class MainActivity : AppCompatActivity() { lateinit var tv:TextView; //初始化Text ...