Flutter应用开发,系统样式改不了?SystemChrome 状态栏、导航栏、屏幕方向……想改就改

news2024/11/16 3:40:27

文章目录

  • 开发场景
  • SystemChrome 介绍
  • SystemChrome的使用
    • 导入 SystemChrome 包
    • 隐藏状态栏
      • 说明
    • 改变状态栏的样式
      • 注意事项
      • 其他样式说明
  • 锁定屏幕方向
    • 锁定屏幕方向实例
    • 注意事项

开发场景

开发APP时,我们经常要客制化状态栏、导航栏栏等的样式和风格,Flutter开发APP时如何满足这些客制化要求呢?

自定义状态栏和导航栏的样式:您可以使用 SystemChrome 来定义状态栏和导航栏的颜色、文字样式等,以满足您的设计需求。
隐藏系统级界面元素:如果您希望在应用程序运行时隐藏状态栏、导航栏或全屏显示,SystemChrome 可以帮助您实现这些功能。
控制屏幕方向:SystemChrome 还提供了方法来锁定或解锁屏幕方向,以确保应用程序以特定方向显示。

SystemChrome 介绍

SystemChrome 是 Flutter 中用于控制系统级界面样式和行为的类。它提供了一些方法来修改应用程序窗口的外观和行为,例如状态栏、导航栏、屏幕方向等。

SystemChrome的使用

导入 SystemChrome 包

在使用 SystemChrome 之前,您需要在文件中导入 package:flutter/services.dart 包。

import 'package:learning/routes/savecfg.dart';

隐藏状态栏

可以使用 SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive)方法来隐藏状态栏。

SystemUiMode.immersive:将系统UI完全隐藏,用户可以通过滑动从屏幕边缘恢复UI的可见性。在此模式下,状态栏都会隐藏。

SystemUiMode.immersiveSticky:类似于 SystemUiMode.immersive,但是用户可以通过短暂的触摸来恢复UI的可见性,而不需要完全滑动。UI元素将会暂时出现并在一段时间后自动隐藏。

SystemUiMode.edgeToEdge:在此模式下,应用内容将会延伸到屏幕的边缘,覆盖导航栏和状态栏。导航栏和状态栏仍然存在,但是在应用内部不可见。

效果如图:
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive)调用前

在这里插入图片描述

调用后
在这里插入图片描述

可以看到显示电量、时间等信息的状态栏已经被隐藏了。

说明

这里我们说SystemUiMode.immersive:用户可以通过滑动从屏幕边缘恢复UI的可见性。

改变状态栏的样式

SystemChrome.setSystemUIOverlayStyle 方法用于设置系统级覆盖样式。这个方法可以接收一个 SystemUiOverlayStyle 对象作为参数,用于定义状态栏和导航栏的样式。

SystemUiOverlayStyle 是一个用于描述状态栏和导航栏覆盖样式的类。它提供了许多属性,可以用于定义文字颜色、背景颜色、图标亮度等。通过设置 SystemUiOverlayStyle 的不同属性,可以实现自定义的系统级样式。

通过调用 SystemChrome.setSystemUIOverlayStyle 方法,可以将自定义的 SystemUiOverlayStyle 应用于应用程序的状态栏和导航栏,从而改变它们的外观。

例如,可以使用以下代码将状态栏和导航栏设置为深色文字和浅色背景:

SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark.copyWith(
  statusBarColor: Colors.transparent,
  statusBarBrightness: Brightness.dark,
  statusBarIconBrightness: Brightness.dark,
  systemNavigationBarColor: Colors.white,
  systemNavigationBarIconBrightness: Brightness.dark,
));

这将使状态栏和导航栏的文字变为深色(黑色或灰色),并将背景设置为浅色(白色)。通过调整 SystemUiOverlayStyle 的不同属性值,可以根据应用程序的需求进行自定义。

SystemChrome.setSystemUIOverlayStyle 方法的调用通常放在应用程序的入口处(例如 main 函数)或主题的设置中,以确保样式在整个应用程序中生效。
使用SystemChrome.setSystemUIOverlayStyle来改变状态栏的样式,例如下面的例子让状态栏的背景色变为红色。

  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark.copyWith(
    statusBarColor: Colors.red,
  ));

效果如下:
在这里插入图片描述

注意事项

请注意,为了使状态栏的样式生效,需要在应用程序的根 Widget 的 build 方法中调用 SystemChrome.setSystemUIOverlayStyle() 方法。通常,这会在 runApp() 方法之前设置。

另外该代码只在 Android 平台上生效,iOS 平台上的状态栏样式无法直接通过 Flutter 控制。在 iOS 上,状态栏的样式由应用程序的 Info.plist 文件中的配置决定。

其他样式说明

在 SystemUiOverlayStyle 对象中,除了设置 statusBarColor 外,还可以设置其他属性,如:
systemNavigationBarColor 属性来定义状态栏和导航栏的颜色。
statusBarBrightness、statusBarIconBrightness、systemNavigationBarIconBrightness 属性来定义状态栏和导航栏文字的颜色。
控制屏幕方向:

锁定屏幕方向

锁定屏幕方向:使用 SystemChrome.setPreferredOrientations 方法,并传递一个 List 参数,例如 [DeviceOrientation.portraitUp]。
解锁屏幕方向:使用 SystemChrome.setPreferredOrientations([]) 方法,将一个空的 List 作为参数传递给它,以解锁屏

锁定屏幕方向实例

我本身写的例子是竖屏的,上面的截图也能看到,现在我将它转换成横屏显示。添加如下代码:

    SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeLeft,
      DeviceOrientation.landscapeRight,
    ]);

显示效果如图
在这里插入图片描述
实物图:
在这里插入图片描述

注意事项

通过这样设置,即使用户旋转设备,应用程序仍然会保持在横屏模式下,不会自动切换到竖屏模式。
SystemChrome.setPreferredOrientations 方法通常会在应用程序的根 Widget 的 build 方法之前调用,以确保首选方向设置生效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/673071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络之网络基础入门

文章目录 前言一、局域网和广域网1.局域网LAN2.广域网WAN3.城域网和校园网4.如何区分广域网和局域网 二、协议1.概念2.理解3.协议分层4.数据传输的条件 三、OSI七层模型(了解即可)1.概念2.OSI七层模型 四、TCP/IP五层(四层)模型1.…

TC8:TCP_BASICS_11-17

TCP_BASICS_11: [finwait-2 -> time_wait] delay(2*MSL) -> [closed] 目的 TCP从FINWAIT-2状态到TIME-WAIT状态后,等待2MSL时间后,移动到CLOSED状态 关于为什么要等待2MSL时间,我的文章中讲过太多次了,这里就不提了 测试步骤 Tester:让DUT移动到FINWAIT-2状态Test…

使用Python批量进行数据分析

案例01 批量升序排序一个工作簿中的所有工作表——产品销售统计表.xlsx import xlwings as xw import pandas as pd app xw.App(visible False, add_book False) workbook app.books.open(产品销售统计表.xlsx) worksheet workbook.sheets # 列出工作簿中的所有工作表 fo…

SpringBoot 如何使用 ApplicationEventPublisher 发布事件

SpringBoot 如何使用 ApplicationEventPublisher 发布事件 在 SpringBoot 应用程序中,我们可以使用 ApplicationEventPublisher 接口来发布事件。事件可以是任何对象,当该对象被发布时,所有监听该事件的监听器都会收到通知。 下面是一个简单…

[Leetcode] 0733. 图像渲染

733. 图像渲染 点击上方,跳转至leetcode 题目描述 有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。 你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。 为…

第八章 MobileNetv3网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

1.RocketMQ的安装与集群架构

RocketMQ快速入门 RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,在阿里内部,RocketMQ承接了例如“双11”等高并发场景的消息流转,能够处理万亿级别的消息。 2.1 准备工作 2.1.1 下载RocketMQ RocketMQ最新版本:…

Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案

导航: 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式常见面试题源码 目录 一、四种基础同步策略 1.1 同步策略 1.2 更新缓存还是删除缓存? 1.2.1 更新缓存的优缺点 1.2.2 …

【PCB专题】Allegro输出光绘文件的基本参数设置和光绘层建立

什么是Gerber PCB设计是一套流程体系,而PCB制造又是另一套流程体系。 PCB设计数据并不等同于PCB制造数据,也就是说PCB制造并不会直接使用我们的PCB设计数据。设计数据需要经过CAM(Computer-Aided Manufacturing 计算机辅助制造)转换成给机器使用的生产数据。 Gerber就是板厂…

【强化学习】动手学强化学习:多臂老虎机问题

动手学强化学习:多臂老虎机问题 强化学习思维导图简介问题介绍问题定义形式化描述累积懊悔估计期望奖励 贪心策略与 ϵ \epsilon ϵ-greedy策略上置信界算法汤普森采样算法参考资料 强化学习思维导图 简介 强化学习关注智能体和环境交互过程中的学习,这…

chatgpt赋能python:Python中的查找方法

Python中的查找方法 Python是一种常用的编程语言,它有很多强大的查找方法。这些方法可以让开发人员轻松地搜索数据、列表和文本。 以下是Python中最常用的查找方法: 列表查找方法 在Python中,可以使用多种方法来查找列表中的元素。以下是…

Python零基础入门(四)——变量,数据类型与运算符

系列文章目录 个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页 Python入门专栏:《Python入门》欢迎阅读,一起进步!🌟🌟🌟 码字不易,如果觉得文章不…

采集数据发布到WordPress网站指定分类栏目

将采集的文章数据发布到WordPressCMS网站指定分类栏目,设置方法如下: 目录 1. 获取分类名称或ID 2. 对接网站发布 1. 获取分类名称或ID 在wordpress后台获取对应的分类栏目名称或者ID都可以。 点击左侧菜单【文章】 --> 然后点击展开菜单中的【…

自然语言处理的最新研究与发展

第一章:引言 自然语言处理(Natural Language Processing,简称NLP)是人工智能领域中一项重要而受关注的技术,它致力于实现计算机与人类自然语言之间的有效交互。随着深度学习技术的快速发展,NLP领域也取得了…

LNMP架构——Discuz! Board 管理中心

文章目录 一.LNMP架构基本概念1.什么是LNMP2.LNMP实现过程3.LNMP的特点 二.安装Nginx 服务1.安装依赖包2.创建运行用户3.编译安装4.优化路径5.添加 Nginx 系统服务 三.安装 MySQL 服务1.安装Mysql环境依赖包…

java运动会管理系统

目录 一、项目介绍 1、主要功能介绍 二、分析与设计 三、问题与分析 四、小结 五、代码 一、项目介绍 1、主要功能介绍 对于管理者: 1、登录系统来发布运动会的项目以及对应项目的比赛规则 2、管理者也可以修改运动会比赛时间和地点,如果管理者…

漏刻有时数据可视化Echarts组件开发(27):端午地图粽情之你的家乡吃甜还是吃咸?

端午地图粽情之你的家乡吃甜还是吃咸? 前言Echarts创意来源Echarts核心代码1.引入外部文件2.构建HTML容器3.Echarts组件开发预置各省数据初始化DOM配置选项geo组件series组件自适应浏览器完整option选项配置代码 前言 中国各地对粽子的口味偏好存在一定的差异&…

vue中的数据响应化

1、Vue的设计思想 MVVM框架的三要素:数据响应式、模板引擎及其渲染 数据响应式:监听数据变化并在视图中更新 Object.defineProperty()Proxy 模版引擎:提供描述视图的模版语法 插值:{{}}指令:v-bind,v-on…

chatgpt赋能python:Python构造器:理解类和对象的初始化方法

Python构造器:理解类和对象的初始化方法 Python是一门面向对象的编程语言,它的核心思想是数据和操作是紧密耦合的,而这些操作被封装到对象中。对象是一个具有属性和方法的实体,而类则是一种可以创建相同类型对象的蓝图。在Python…

chatgpt赋能python:Python有宏吗?

Python 有宏吗? 什么是宏? 在编程中,宏指的是一种代码编写方式,可以将一部分代码封装成可以被调用的函数或者语句,以便于在程序中重复使用。相对于普通的函数,宏更为灵活,可以达到更高的效率&…