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 自定义主题切换的更多相关文章

  1. 基于 Flutter 以两种方式实现App主题切换

    概述 App主题切换已经成为了一种流行的用户体验,丰富了应用整体UI视觉效果.例如,白天夜间模式切换.实现该功能的思想其实不难,就是将涉及主题的资源文件进行全局替换更新.说到这里,我想你肯定能联想到一 ...

  2. ASP.NET Core 中的SEO优化(4):自定义视图路径及主题切换

    系列回顾 <ASP.NET Core 中的SEO优化(1):中间件实现服务端静态化缓存> <ASP.NET Core 中的SEO优化(2):中间件中渲染Razor视图> < ...

  3. vue,elementUI切换主题,自定义主题

    本文介绍两种elementUI切换主题色的方法 项目示例:http://test.ofoyou.com/theme/ git代码:记得star哦,谢谢 1:官方提供的方法,直接修改scss文件达到修改 ...

  4. Android 主题切换 小结

    前言 我们用手机的时候经常看到 设置里面有夜间模式和白天模式来更换APP的主题,以前以为很简单,但是实际做起来还是有各种不完美,那么我们也要去了解各种解决方案来丰富我们的知识,现在我们就来看看各种优劣 ...

  5. 演练Ext JS 4.2自定义主题

    本文将根据API文档中关于主题的介绍做的一次演练,以便熟悉自定义主题的过程. 练习环境: Sencha Cmd v4.0.1.45 Ruby 1.9.3-p392 firefox 26 首先,使用以下 ...

  6. vue-基于elementui自定义主题更换皮肤及自定义内容的皮肤跟换

    参考这篇博客https://blog.csdn.net/young_Emily/article/details/78591261做一遍,加上自己的一些理解 思路:通过自己上一篇博客https://ww ...

  7. 轻量i3wm配置使用笔记 -- 主题切换器(j4-make-config)

    快速切换主题 j4-make-config介绍: j4-make-config脚本可以方便地在几组"主题"之间切换,还可以根据当前工作的环境,轻松地从几个不同的配置部分组合一个完整 ...

  8. ModernUI教程:创建自定义主题

            Modern UI WPF包括两个内置主题(dark与light).在1.0.3版本,您可以构建自定义的主题.Modern UI应用程序通常有在全局资源字典App.xaml中有如下定义 ...

  9. 如何优雅使用Sublime Text3(Sublime设置豆沙绿背景色和自定义主题)

    ♣Sublime Text3软件的下载 ♣设置字体的大小 ♣设置背景色和关键字颜色(Color Scheme 生成器) ♣快速生成html头文件 1.Sublime Text3软件的下载地址和包含的文 ...

随机推荐

  1. LindAgile.SchedulingTask~设计一个不错的任务调度组件

    回到目录 SchedulingTask产生的原因 任务调试主要指定期执行某些任务代码,之前用过quartz,感觉有些重,使用时需要添加包包,配置管理项时,对于简单的项目用它就显得有些臃肿了,不如直接上 ...

  2. 使用 ASP.NET Core MVC 创建 Web API(四)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...

  3. 目标检测 IOU(交并比) 理解笔记

    交并比(Intersection-over-Union,IoU): 目标检测中使用的一个概念 是产生的候选框(candidate bound)与原标记框(ground truth bound)的交叠率 ...

  4. python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍

    目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...

  5. C#工具:反射帮助类 泛型反射帮助类

    反射帮助类 using System; using System.Reflection; using System.Data; using System.Drawing; using System.R ...

  6. (摘)timeout Timeout时间已到.在操作完成之前超时时间已过或服务器未响应的几种情况

    Timeout时间已到.在操作完成之前超时时间已过或服务器未响应 问题 在使用asp.net开发的应用程序查询数据的时候,遇到页面请求时间过长且返回"Timeout时间已到.在操作完成之间超 ...

  7. GTX 750TI 使用 ffmpeg 时无法用 GPU HEVC(h.265) 进行加速

    官网版本好像不是能加速的,所以在github上找到一个已经带gpu加速的. https://github.com/illuspas/ffmpeg-hw-win32 GPU加速命令格式: ffmpeg. ...

  8. Java笔记(day9~day10)

    继承: 好处:1.提高代码复用性:   2.让类之间产生关系,给多态提供了前提: 父类.子类 Java中支持单继承,不直接支持多继承,但对C++的多继承进行了改良 单继承:一个子类只能有一个直接复类 ...

  9. Spring Boot Security 整合 OAuth2 设计安全API接口服务

    简介 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版.本文重点讲解Spring Boot项目对OAuth2进行的实现,如果你对OAut ...

  10. 第五章:shiro密码加密

    在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码.比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储. 5.1 编码/解码 Shir ...