flutter理解,flutter介绍

Flutter 94: 初识 MediaQuery

当我们同时为手机和平板适配编写 app 针对不同屏幕尺寸进行 UI 布局或当用户偏好设置较大字号或是想要最大限度等减少动画等;此时就需要 MediaQuery 来帮我们获取所用设备的信息以及用户设置的偏好信息;

项城网站建设公司创新互联公司,项城网站设计制作,有大型网站制作公司丰富经验。已为项城上千提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的项城做网站的公司定做!

MediaQuery 一直存在于 WidgetsApp 和 MaterialApp 中, MediaQuery 继承自 InheritedWidget 是一个单独的 Widget ,但一般通过 MediaQuery.of(context) 来获取相关信息;

当相关信息发生变化,例如屏幕旋转等时,屏幕中 Widget 会重新构建,以保持最新状态;我们可以通过 MediaQuery 构造函数和提供的静态方法手动设置对应的相关信息;

MediaQueryData 包含关于媒介的相关信息;一般通过 MediaQuery.of(context) 获取;

size 为媒介的尺寸大小,以逻辑像素为单位;

devicePixelRatio 为像素密度;与设备物理像素有关,与横竖屏等无关;

orientation 为横竖屏, Orientation.landscape 为横屏, Orientation.portrait 为竖屏;

textScaleFactor 为

每个逻辑像素的字体像素数,小菜理解为字体的像素比;注意,小菜设置了默认字体像素密度为标准的 1.2 倍之后调整设备系统字号,其 1.2 倍依旧是以标准字号为基础扩大 1.2 倍;

platformBrightness 为当前设备的亮度模式;注意调整屏幕亮度并不会改变该模式,与当前系统支持的黑暗模式和明亮模式相关;

alwaysUse24HourFormat 为当前设备是否为 24 小时制;

accessibleNavigation 为是否使用 TalkBack 或 VoiceOver 之类的辅助功能与应用程序进行交互,用以辅助视力障碍人群;

invertColors 为是否使用颜色反转,主要用于 iOS 设备;

highContrast 为用户是否要求前景与背景之间的对比度高,主要用于 iOS 设备;

disableAnimations 为平台是否要求禁用或减少动画;

boldText 为平台是否要求使用粗体;

padding 为屏幕内边距,一般是刘海儿屏或异形屏中被系统遮挡部分边距;

viewInsets 为键盘弹出时等遮挡屏幕边距,其中 viewInsets.bottom 为键盘高度;

systemGestureInsets 为手势边距,如 Android Q 之后添加的向左滑动关闭页面等;

viewPadding 小菜理解为视图内边距,为屏幕被刘海儿屏或异形屏中被系统遮挡部分,从 MediaQuery 边界的边缘计算;此值是保持不变;例如,屏幕底部的软件键盘可能会覆盖并占用需要底部填充的相同区域,因此不会影响此值;

physicalDepth 为设备物理层级,小菜暂时还未想到对应的应用场景;

小菜在尝试获取其他子 Widget Size 时,有两点需要注意,首先要设置一个全局的 GlobalKey 来获取当前位置, key 需要为唯一的;第二通过 GlobalKey().currentContext 获取 BuildContext 上下文环境,从而获取对应尺寸;

MediaQuery 案例尝试

小菜对于部分 MediaQueryData 的应用和理解还不够深入;如有错误请多多指导!

flutter provider的理解

provider 是flutter 中的状态管理 开源库;

存储的数据对象 必须extends ChangeNotifier;下层widget 通过 Provider.of(context) 函数 获取model对象 ,并且可以建立依赖关系;当数据对象发生变化时,依赖的widget 会重新build,像不像InheritedWidget Provider 没错 下层widget就是 封装了InheritedWidget

主要 通过 Provider.ofT(context) 函数,来获取;

推荐使用 Provider.of而不是 Consumer,因为 listen默认为true,也就是说 默认 依赖于 持有数据model的widget 对应的element;

数据类 可继承的 ChangeNotifier,本身和privider框架 没有关系;

ChangeNotifier 是 flutter框架 提供的工具类, 用来实现一对多的订阅通知功能。

Flutter TextField 文本输入框的基本属性及详解

源码分析:

分析源码可得,TextField 是有状态 StatefulWidget,有丰富的属性,自定义化较高,实践中需要合理利用各种回调;

1、光标的相关属性;cursorColor 为光标颜色,cursorWidth 为光标宽度,cursorRadius 为光标圆角;其中 Radius 提供了 circle 圆角和 elliptical 非圆角两种;

2、textAlign 为文字起始位置,可根据业务光标居左/居右/居中等;注意只是文字开始方向;textDirection 问文字内容方向,从左向右或从右向左;

3、maxLength 为字符长度,设置时默认是展示一行,且右下角有编辑长度与整体长度对比;与 maxLengthEnforced 配合,maxLengthEnforced 为 true 时达到最大字符长度后不可编辑;为 false 时可继续编辑展示有差别;

4、设置 maxLength 之后右下角默认有字符计数器,设置 TextField.noMaxLength 即可只展示输入字符数;

5、maxLines 为允许展现的最大行数,在使用 maxLength 时内容超过一行不会自动换行,因为默认 maxLines=1,此时设置为 null 或固定展示行数即可自动换行;区别在于 null 会展示多行,而 maxLines 最多只展示到设置行数;

6、obscureText 是否隐藏编辑内容,常见的密码格式;

7、enableInteractiveSelection 长按是否出现【剪切/复制/粘贴】菜单;不可为空;

8、keyboardAppearance 为键盘亮度,包括 Brightness.dark/light 两种,但仅限于 iOS 设备;

9、textCapitalization 文字大小写;理论上 sentences 为每句话第一个字母大写;characters为每个字母大写;words 为每个单词首字母大写;但该属性仅限于 text keybord,和尚在本地更换多种方式并未实现,有待研究;

10、keyboardType 为键盘类型,和尚理解整体分为数字键盘和字母键盘等;根据设置的键盘类型,键盘会有差别;

a. 数字键盘

--1-- datetime 键盘上可随时访问 : 和 /;

--2-- phone 键盘上可随时访问 # 和 *;

--3-- number 键盘上可随时访问 + - * /

b. 字母键盘

--1-- emailAddress 键盘上可随时访问 @ 和 .;

--2-- url 键盘上可随时访问 / 和 .;

--3-- multiline 适用于多行文本换行;

--4-- text 默认字母键盘;

11、textInputAction 通常为键盘右下角操作类型,类型众多,建议多多尝试;

12、autofocus 是否自动获取焦点,进入页面优先获取焦点,并弹出键盘,若页面中有多个 TextField 设置 autofocus 为 true 则优先获取第一个焦点;

13、focusNode 手动获取焦点,可配合键盘输入等减少用户操作次数,直接获取下一个 TextField 焦点;

14、enabled 设为 false 之后 TextField 为不可编辑状态;

15、decoration 为边框修饰,可以借此来调整 TextField 展示效果;可以设置前置图标,后置图片,边框属性,内容属性等,会在后续集中尝试;若要完全删除装饰,将 decoration 设置为空即可;

16、inputFormatters 为格式验证,例如原生 Android 中通常会限制输入手机号或其他特殊字符,在 Flutter 中也可以借此来进行格式限制,包括正则表达式;使用时需要引入 package:flutter/services.dart;

a. LengthLimitingTextInputFormatter 限制最长字符;

b. WhitelistingTextInputFormatter 仅允许输入白名单中字符;如 digitsOnly 仅支持数字 [0-9];

c. BlacklistingTextInputFormatter 防止输入黑名单中字符;如 singleLineFormatter 强制输入单行;

分析源码 RegExp("[/]") 可以设置正则表达式;

17、onChanged 文本内容变更时回调,可实时监听 TextField 输入内容;

18、controller 文本控制器,监听输入内容回调;

19、onTap 点击 TextField时回调;

20、onEditingComplete 在提交内容时回调,通常是点击回车按键时回调;

21、onSubmit 在提交时回调,不可与 onEditingComplete 同时使用,区别在于 onSubmit 是带返回值的回调;

问题小结:

当 TextField 设置 enableInteractiveSelection 属性后长按会出现菜单,默认为英文,可通过设置 Flutter 国际化来处理;

(1)在 pubspec.yaml 中集成 flutter_localizations;

2)在 MaterialApp 中设置本地化代理和支持的语言类型;

(1)将 maxLength 设置为 null 仅使用 LengthLimitingTextInputFormatter 限制最长字符;

(2)设置 InputDecoration 中 decoration 属性为空;但是底部有空余,只是隐藏而并非消失;

Flutter开发Windows 和 Linux 桌面应用,设置默认窗口大小

在用Flutter 开发windows和linux跨平台应用的时候,如何设置默认窗口大小呢?

flutter没有提供统一的api,所以默认的窗口大小是1280x720.

如果我们想要改成自己想要的默认窗口大小呢?比如我想要设置为:512像素宽, 926像素高

我该怎么做呢?

请看我的教程。

首先你确保你已经为项目创建了windows和Linux的支持。

目前Flutter 为windows和linux提供的是托管式运行的主程序,可以理解为一个壳子,这个壳子就是用cpp写的,平台原生的window 窗口。

所以我们可以打开相应的cpp源代码,设置默认窗口大小。

这里先讲windows和linux,因为mac 平台跟windows和linux不一样,后面单独给大家讲解。

我们看图。

源代码路径位于:

windows/runner/main.cpp

找到

第一个参数是宽度,单位是px,第二个是高度,单位是px

修改后重新运行生效。

源代码路径位于:

linux/my_application.cc

找到

方法的第一个数字是宽度,第二个是高度,单位也是px像素。

修改后,重新运行生效。

现在,你已经学会了如何设置初始窗口大小了。

flutter-对跨平台的理解

未初始化的变量值都是null

var可以接受任意类型的变量,但一旦被赋值,类型就会被确定。

dynamic可以接受任意类型的变量,被赋值后,类型还可以再被赋值再改变。

final与const都可以修饰一个不可变的变量,但final变量是一个运行时常量,在第一次使用的时候被初始化。

const变量是一个编译时常量,在编译的时候就被初始化了。所以,const的性能比final高。

a?.cancel():a不为空才会执行a的cancel()方法

var i = a??"a是空":a是空时,将a赋值为字符串"a是空"

k??="1":如果k之前没有赋值,则会被赋值为“1”,如果之前有值,这句话就无效。

例如有一个函数:String say(String from, String msg, [String device])

那么device可以传也可以不传值,下面两种调用方式都是对的。

例如有一个函数:void fun1({int i,int j}),

使用时:fun1(i = 1)、fun1(j = 10)、fun1(i = 10,j = 20)都可以。

可选位置参数和可选命名参数都可以设置默认参数值

例如:

void fun1({int i = 1,int j = 2})

String say(String from = "a", String msg = "b", [String device = "c"])


网站名称:flutter理解,flutter介绍
URL分享:http://scyanting.com/article/dsshjip.html