189 8069 5689

Flutter全局颜色,flutter界面布局

Flutter笔记(三):设置白色状态栏

在App设计中状态栏纯色的这种设计很常见,但是如果状态栏需要为白色的时候就必须为黑色字体。在Android中已经有很多成熟的方案来处理这种情况,那我们现在看看在Flutter中这种情况该怎么处理。

创新互联建站是一家专注于成都网站制作、成都网站建设、外贸营销网站建设四川雅安服务器托管的网络公司,有着丰富的建站经验和案例。

这里的ThemeData即为控制App的主题,primarySwatch设置即可控制主题的各类颜色,但是这里的颜色是需要MaterialColor,但是纯色种的黑色和白色不是MaterialColor。所以不能设置primarySwatch为Colors.white。

注:MaterialColor包含以下这些

那么就只能使用其他方式设置主题为白色。即为设置

此时我们可以看到App的状态栏如下所示(Android)

虽然AppBar变成了白色,但是状态栏是灰色显然不是我们想要的。

尝试设置文字颜色,AppBar的Brightness有两种模式light和dark

这个和SystemUiOverlayStyle的light和dark刚好相反

然后设置状态栏颜色

设置为红色之后,得到以下的样式,可以看到状态栏为红色了,文字为白色

那么接下来我们只需要将状态栏设置为白色或者透明,状态栏文字设置为黑色。

最后得到以下视图

注:使用PreferredSize包裹,可以更得心应手哦!

SystemUiOverlayStyle在设置时其实有很多系统或者版本的限制

[Flutter]使用主题

flutter设置沉浸式状态栏

flutter修改状态栏字体颜色

主要用到的是appbar中的brightness属性,brightness有两个值可取,分别是Brightness.dark和Brightness.light.

另一种方案是:就是用AnnotatedRegionSystemUiOverlayStyle包裹,

发现一种更灵活的办法,如下:

只需要在最外层包裹一下,然后设置状态栏字体颜色就可以了,可以不用appbar,更加灵活

flutter修改键盘颜色

iOS默认的TextField弹出的键盘是暗黑色的。

要修改为亮色,修改TextField的keyboardAppearance属性即可

全局修改的话可在main里面设置ThemeData的属性

Flutter 深色(暗黑)模式下 状态栏字体颜色为白色

brightness: Brightness.light,(黑色)

brightness: Brightness.dark,(白色)

这种设置状态栏字体颜色的方法仅在手机浅色模式下有效,当用户选择深色(暗黑)模式后,该方法失效,状态栏字体颜色统一变为白色,不可更改。

flutter 完全使用GetX 主题切换 以及 自创建Widget的颜色随主题变化方案

这篇将会解决手动切换主题以及跟随手机切换主题来更新UI(包括自己创建的Widget)

主题切换有个问题,就是如果是我们自定义或者在 build() 自己创建的部件是不会随着系统的主题切换而发生主题色变化的(实际测试中,如果页面在顶层(没有被push)切换主题并不会触发 build() 方法,(push之后的页面切换系统主题是可以触发 build() 的,而且会频繁触发好多次...),既然无法通过重新 build 更新组件的主题色,那么我们在切换主题后,强制触发整个app的 build() 就可以了)

Flutter中InheritedWidget的使用

在Tree中从上往下高效传递数据的基类widget , 定义为:abstract class InheritedWidget extends ProxyWidget

Flutter的响应式开发与React类似,数据都是自顶向下的。

假设有祖先组点A,中间经过结点B, C,然后到结点D,D需要从A中获取数据f,那按照自顶向下数据流转,f需要依次传递给B及C,最后才到C。这样开发极为不灵活,成本也比较高。所有Flutter需要有跨结点(只能是祖先后代节点,不能跨兄弟节点)高效传递数据的方案。

大体意思如下:

InheritedWidget 是在树中高效向下传递信息的基类部件;

调用[BuildContext.inheritFromWidgetOfExactType]方法可以从 BuildContext 中获取到最近的 InheritedWidget 类型的实例;

在 InheritedWidget 类型的控件被引用,也就是调用过 inheritFromWidgetOfExactType 方法后,当 InheritedWidget 自身状态改变时,会导致引用了 InheritedWidget 类型的子控件重构(rebuild)。

这里随便定义一个人 Person 类。

创建一个类继承 InheritedWidget,并实现 updateShouldNotify 方法。

之前说到调用[BuildContext.inheritFromWidgetOfExactType]方法可以从 BuildContext 中获取到最近的 InheritedWidget 类型的实例,所以此处定义一个静态的 of 方法,通过传入的 context 获取到最近的 InheriedDataWidget 实例。

1.定义数据模型

这里随便定义一个 Person 类。

2.自定义 InheritedWidget 控件类

创建一个类继承 InheritedWidget,并实现 updateShouldNotify 方法。

之前说到调用[BuildContext.inheritFromWidgetOfExactType]方法可以从 BuildContext 中获取到最近的 InheritedWidget 类型的实例,所以此处定义一个静态的 of 方法,通过传入的 context 获取到最近的 InheriedDataWidget 实例。

3.InheriedDataWidget 的使用

InheriedDataWidget 使用起来也很简单,它本身也是一个控件,只要在任意一个页面的子控件调用其构造方法就行,这里我们定义一个形如的 Widget 树。

WidgetA 是一个 StatefulWidget 类型的控件,可以调用 setState 刷新,如果是继承人 Stateless 类型的控件,那我们也可以通过 Stream 或者其他方式刷新数据,感兴趣的请看[什么是 Stream? Dart

WidgetA1_1 类

WidgetA1_2 类

WidgetA1_3 类

当我们点击 floatingActionButton 的时候,WidgetA1, WidgetA1_1, WidgetA1_2 的控件都会更新 Person 的信息,而且每点 floatingActionButton 一次, 当我们点击 floatingActionButton 的时候,WidgetA1, WidgetA1_1, WidgetA1_2 的控件都会更新 Person 的信息,而且每点 floatingActionButton 一次,都会输出:

如果我们试图在和 WidgetA 的同一层级的兄弟节点去访问 InheriedDataWidget 的 Person 数据,是不行的,因为父节点中并没有插入 InheriedDataWidget。

把 WidgetB 和 WidgetA 保持同一节点

这也体现了 Inheried(遗传) 这一单词的特性,遗传只存在于父子。兄弟不存在遗传的关系。

这种数据共享的方式在某些场景还是很有用的,就比如说全局主题,字体大小,字体颜色的变更,只要在 App 根层级共享出这些配置数据,然后在触发数据改变之后,所有引用到这些共享数据的地方都会刷新,这换主题,字体是不是就很轻松,事实上 Theme.of(context).primaryColor 之流就是这么干的。

以上就是有关InheritedWidget的使用。

自己也是从事Android开发5年有余了;整理了一些Android开发技术核心笔记和面经题纲,有关更多Android开发进阶技术资料、面经题纲、核心技术笔记; 想要进阶自己、拿高薪的同学请私信我回复“核心笔记”或“面试”领取!


分享文章:Flutter全局颜色,flutter界面布局
网站地址:http://jkwzsj.com/article/phcsgd.html

其他资讯