Flutter陌生而又熟悉组件-Semantics

2023-11-02 10:10

本文主要是介绍Flutter陌生而又熟悉组件-Semantics,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概括

Semantics可能是Flutter中比较陌生的组件,如果不是遇见过,开发中大多不会想到使用Semantics。
构造如下:

  Semantics({Key? key,Widget? child,bool container = false,bool explicitChildNodes = false,bool excludeSemantics = false,bool? enabled,bool? checked,bool? selected,bool? toggled,bool? button,bool? slider,bool? link,bool? header,bool? textField,bool? readOnly,bool? focusable,bool? focused,bool? inMutuallyExclusiveGroup,bool? obscured,bool? multiline,bool? scopesRoute,bool? namesRoute,bool? hidden,bool? image,bool? liveRegion,int? maxValueLength,int? currentValueLength,String? label,String? value,String? increasedValue,String? decreasedValue,String? hint,String? onTapHint,String? onLongPressHint,TextDirection? textDirection,SemanticsSortKey? sortKey,SemanticsTag? tagForChildren,VoidCallback? onTap,VoidCallback? onLongPress,VoidCallback? onScrollLeft,VoidCallback? onScrollRight,VoidCallback? onScrollUp,VoidCallback? onScrollDown,VoidCallback? onIncrease,VoidCallback? onDecrease,VoidCallback? onCopy,VoidCallback? onCut,VoidCallback? onPaste,VoidCallback? onDismiss,MoveCursorHandler? onMoveCursorForwardByCharacter,MoveCursorHandler? onMoveCursorBackwardByCharacter,SetSelectionHandler? onSetSelection,VoidCallback? onDidGainAccessibilityFocus,VoidCallback? onDidLoseAccessibilityFocus,Map<CustomSemanticsAction, VoidCallback>? customSemanticsActions,}) : this.fromProperties(...)

细数一下大致有54个参数?????
在这里插入图片描述
翻译过来就是:一个widget,用以描述widget树的具体语义。使用辅助工具、搜索引擎和其他语义分析软件来确定应用程序的含义。
看完之后更迷惑?
Semantics中文翻译为语义学、语义论,主要起辅助作用,多用于分析屏幕上的内容,就是将程序翻译成大白话,可以帮助有视觉障碍的人士更好的使用软件。

Semantics从另一方面讲是开发者最熟悉的组件?
在这里插入图片描述
上述各种属性在常用的各种组件中多多少少都有涉及,基本上开发者经常使用的组件都在Semantics上找到定位。

使用

属性解释
属性含义
child子组件
container是否在引入一个新的语义节点
explicitChildNodes是否强制显示子Widget的语义信息
excludeSemantics是否排除子Widget中的语义
enabled是否可用
checkedCheckBox是否被勾选
selected是否选中
toggledtoggle是否切换
button是否是Button
slider是否是slider
link是否是link
header是否是header
textField是否是textField
readOnly是否制度
focusable是否可聚焦
focused是否聚焦
inMutuallyExclusiveGroup是否兼容
obscured是否模糊
multiline是否多行
scopesRoute是否是声明路由名
namesRoute是否包含路由的语义标签
hidden是否隐藏
image是否是image
liveRegion是否活跃
maxValueLength最大长度
currentValueLength当前长度
labelWidget的文本描述
value
increasedValue增值
decreasedValue减值
hint提示
onTapHint点击提示
onLongPressHint长按提示
textDirection文本方向
sortKey排序
tagForChildren子节点标签
onTap点击事件
onLongPress长按事件
onScrollLeft左滑事件
onScrollRight右滑事件
onScrollUp上滑事件
onScrollDown下滑事件
onIncrease增值事件
onDecrease减值事件
onCopycopy
onCutcut
onPastepaste
onDismissdismiss
onMoveCursorForwardByCharacter字符光标前移
onMoveCursorBackwardByCharacter字符光标后移
onSetSelection选择事件
onDidGainAccessibilityFocus获取焦点
onDidLoseAccessibilityFocus失去焦点
customSemanticsActions自定义事件

翻译的不准确,见谅!

分类
  • Semantics
    一个widget,用以描述widget树的具体语义。使用辅助工具、搜索引擎和其他语义分析软件来确定应用程序的含义。
  • MergeSemantics
    合并其后代语义的widget。
  • ExcludeSemantics
    删除其后代所有语义的widget
使用
          Flexible(child: Semantics(label: MaterialLocalizations.of(context).selectYearSemanticsLabel,excludeSemantics: true,button: true,child: Container(height: _subHeaderHeight,child: InkWell(onTap: widget.onTitlePressed,...

解释InkWell语言,即读出屏幕中此按钮是什么样按钮

        // dayWidgetchild: Semantics(label: '${localizations.formatDecimal(day)}, ${localizations.formatFullDate(dayToBuild)}',selected: isSelectedDay,excludeSemantics: true,child: dayWidget,),...dayItems.add(dayWidget);

这是Flutter自带的日历中一段代码,dayWidget是日历中每一天的组件,最后将一个月中所有日期添加进dayItems列表中集中显示,则呈现出某月的日历。 label: ‘${localizations.formatDecimal(day)}, ${localizations.formatFullDate(dayToBuild)}’,是解释了这一天是哪一天,excludeSemantics:true,则表示删除其后代所有语义的widget,若还有子控件还有语义,则不承认,无效。

...return MergeSemantics(child: Semantics(enabled: widget.enabled,button: true,child: InkWell(onTap: widget.enabled ? handleTap : null,canRequestFocus: widget.enabled,mouseCursor: effectiveMouseCursor,child: item,),));...

这是PopupMenuItem部分代码,MergeSemantics即将子widget语义合并,若PopupMenuItem中还有item,则合为同一个。

  @overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',showSemanticsDebugger:true,...

若showSemanticsDebugger设为false和true,则会出现不同的视图:

在这里插入图片描述在这里插入图片描述
明显可以看出当showSemanticsDebugger为true的时候,视图明显不一样,虽不够美观,但更加容易识别和操作,这也就解释了为什么Semantics通常用于帮助视觉有障碍的人士。

文中很多属性解释不清楚,使用方法描述不清晰,归根结底还是不熟悉,以后还需多多探索。截图中数据均为假数据,不可较真。

这篇关于Flutter陌生而又熟悉组件-Semantics的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/329888

相关文章

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element