flutter开发实战-Theme主题切换

这篇具有很好参考价值的文章主要介绍了flutter开发实战-Theme主题切换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

flutter开发实战-Theme主题切换

之前做的应用中有用到Theme主题切换,一直没有整理,这里整理一下。
使用的是Android studio

一、效果图

flutter开发实战-Theme主题切换,flutter开发实战,flutter,移动开发,flutter,主题切换,theme

flutter开发实战-Theme主题切换,flutter开发实战,flutter,移动开发,flutter,主题切换,theme

二、创建ThemeModel

// 提供五套可选主题色

const _themes = <MaterialColor>[
  Colors.blue,
  Colors.cyan,
  Colors.teal,
  Colors.green,
  Colors.red,
];

class Global {
  static late SharedPreferences _prefs;
  static Session session = Session();

  // 可选的主题列表
  static List<MaterialColor> get themes => _themes;

  // 是否为release版
  static bool get isRelease => bool.fromEnvironment("dart.vm.product");

  //初始化全局信息,会在APP启动时执行
  static Future init() async {
    WidgetsFlutterBinding.ensureInitialized();
    _prefs = await SharedPreferences.getInstance();
    var _profile = _prefs.getString("session");
    if (_profile != null) {
      try {
        session = Session.fromJson(jsonDecode(_profile));
      } catch (e) {
        LoggerManager().debug("e:${e.toString()}");
      }
    } else {
      // 默认主题索引为0,代表蓝色
      session = Session()..theme = 0;
    }
  }

  // 持久化Profile信息
  static saveProfile() {
    _prefs.setString("session", jsonEncode(session.toJson()));
  }
}
class Session {
  int? _theme;
}
// 共享状态
class SessionChangeNotifier with ChangeNotifier {
  Session get session => Global.session;

  String? get getToken => Global.session.token;

  
  void notifyListeners() {
    // 保存Profile变更
    Global.saveProfile();

    //通知依赖的Widget更新
    super.notifyListeners();
  }
}
class ThemeModel extends SessionChangeNotifier {
  // 获取当前主题,如果为设置主题,则默认使用蓝色主题
  MaterialColor get theme => Global.themes
      .firstWhere((e) => e.value == session.theme, orElse: () => Colors.blue);

  // 主题改变后,通知其依赖项,新主题会立即生效
  set theme(MaterialColor color) {
    if (color != theme) {
      session.theme = color[500]?.value;
      notifyListeners();
    }
  }
}

在Main.dart入口的MaterialApp

MaterialApp(
      theme: ThemeData(
        fontFamily: "PingFang SC",
        primarySwatch: themeModel.theme,
      ),
 ...

三、主题切换页面

当主题切换后,Provider会通知到对应的页面Build,就会显示对应的主题。

主题切换页面

class ThemePage extends StatefulWidget {
  const ThemePage({Key? key, this.arguments}) : super(key: key);

  final Object? arguments;

  
  State<ThemePage> createState() => _ThemePageState();
}

class _ThemePageState extends State<ThemePage> {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: MyAppBar(
        onPressed: () {
          navigatorBack();
        },
        label: S.of(context).theme,
        isBackButton: true,
      ),
      body: ListView(
        //显示主题色块
        children: Global.themes.map<Widget>((e) {
          return GestureDetector(
            child: Padding(
              padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 16),
              child: Container(
                color: e,
                height: 40,
              ),
            ),
            onTap: () {
              //主题更新后,MaterialApp会重新build
              Provider.of<ThemeModel>(context, listen: false).theme = e;
            },
          );
        }).toList(),
      ),
    );
  }

  void navigatorBack() {
    NavigatorPageRouter.pop();
  }
}

四、小结

flutter开发实战-Theme主题切换,使用的是Android studio,使用Provider通知切换主题。

学习记录,每天不停进步。文章来源地址https://www.toymoban.com/news/detail-559008.html

到了这里,关于flutter开发实战-Theme主题切换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 博客搭建教程Github+Hexo+hexo-theme-matery主题

    前情提要 写这篇文的目的 记录自己搭建过程,便于以后快速复用 总结经验和自己踩的坑,给其他小伙伴一些参考(由于是搭建后写的,所以没有参考图片) 介绍 初步效果参考我的博客:hermia的个人博客 本博客基于Hexo框架,使用github托管 使用自定义域名: hermiablog.com hexo主题

    2024年02月19日
    浏览(73)
  • 【Android-JetpackCompose】11、主题设置:Theme、Colors、Typography、Shapes

    首先,从下面的仓库克隆代码: Material Design 定义了一些从语义上命名的颜色: primary 是主要品牌颜色,secondary 用于提供强调色。您可以为形成对比的区域提供颜色更深/更浅的变体。background 和 surface 这两种颜色用于那些容纳在概念上驻留在应用“Surface”的组件的容器。此外

    2024年02月05日
    浏览(53)
  • flutter 五点一点一:MaterialApp Theme

    platform 目标平台 貌似表示的是当前Theme 的目标平台 枚举值 例如 我将 platform 设置为ios 然后运行到 android模拟器上 点击跳转页面动画 为默认动画 若改成 android 则动画效果如下 那么问题来了 不同平台 如何显示不同效果? Platform 可获取现在是那个平台 可根据不通的平台设置不

    2024年01月19日
    浏览(28)
  • vue2实现自定义主题webpack-theme-color-replacer

    需求:根据element的自定义主题色,之后改变element的全局所有颜色,解决页面刷新后主题色失效问题,这个需要把颜色存入到浏览器的存储中,如果换个浏览器就得重新选择了哈,如果需要在不同的浏览器保持一致的主题,需要跟后端沟通 之前还写过一个简单的,有需要的可

    2024年02月07日
    浏览(51)
  • 【1】Pycharm 主题设置推荐Material Theme UI以及编辑环境配置(字体大小和颜色)

    File - Settings - Plugins插件,搜索Material Theme UI 安装。 安装后重启pycharm设置自己喜欢的首选主题。 个人比较喜欢Oceanic主题。 :File - Settings - Editor - Font, Font: Source Code Pro,Size: 16, line-spacing: 1.0,应用。个人觉得这个设置比较舒服 :File - Settings - Editor - Color Scheme Font - General,

    2024年02月16日
    浏览(45)
  • 前端项目review之修改element-ui全局主题颜色配置element-theme-chalk和gulp

    每个公司的主题风格肯定是不一样的,比如现在的公司主题就是#00ab7a。在PC端TO-B的项目中少不了用 element-ui ,这个时候用 element-theme-chalk 直接本地编译修改了element全局的主题色。 执行 当只有一个主题不需要切换的时候,使用 element-theme-chalk 就足够了,但是当主题很多的时候

    2023年04月09日
    浏览(40)
  • magento2 二次开发如何自定义theme

    2024年02月15日
    浏览(51)
  • MidJourney笔记(9)-daily_theme-docs-describe

    切换 #daily-theme 频道更新的通知 。 但我发现在对话框那里,是没有这个命令的: 但官网是有介绍,不知道是不是版本问题还是这个命令已经无效。 但后来,我发现这个命令是要在Midjourney服务对话框那里才有,在我们后面添加的Mid

    2024年02月04日
    浏览(46)
  • IDEA 插件 Material Theme UI收费后 免费的办法

    使用手动安装的方式 1.在官网找到10之前的版本,下载插件 https://plugins.jetbrains.com/plugin/8006-material-theme-ui/versions 6点10以下的就可以 2.手动在idea进行插件导入 重启idea即可使用主题了

    2024年02月13日
    浏览(79)
  • flutter开发实战-实现首页分类目录入口切换功能

    。 在开发中经常遇到首页的分类入口,如美团的美食团购、打车等入口,左右切换还可以分页更多展示。 在pubspec.yaml引入 由于我这里按照一页8条展示,两行四列展示格式。 当列表list传入的控件时候,一共的页数为 通过列表,一页数量计算每一页应该展示多少个按钮。 一

    2024年02月14日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包