Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
sxychenjing
engine
提交
9ab6550b
E
engine
项目概览
sxychenjing
/
engine
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
engine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
9ab6550b
编写于
6月 19, 2019
作者:
C
chunhtai
提交者:
GitHub
6月 19, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Introduce read only text field semantics (#9281)
上级
a263abfb
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
43 addition
and
6 deletion
+43
-6
lib/stub_ui/lib/src/engine/semantics/semantics.dart
lib/stub_ui/lib/src/engine/semantics/semantics.dart
+5
-0
lib/stub_ui/lib/src/ui/semantics.dart
lib/stub_ui/lib/src/ui/semantics.dart
+10
-0
lib/ui/semantics.dart
lib/ui/semantics.dart
+9
-0
lib/ui/semantics/semantics_node.h
lib/ui/semantics/semantics_node.h
+1
-0
shell/platform/android/io/flutter/view/AccessibilityBridge.java
...platform/android/io/flutter/view/AccessibilityBridge.java
+6
-3
shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm
...tform/darwin/ios/framework/Source/accessibility_bridge.mm
+8
-3
shell/platform/embedder/embedder.h
shell/platform/embedder/embedder.h
+4
-0
未找到文件。
lib/stub_ui/lib/src/engine/semantics/semantics.dart
浏览文件 @
9ab6550b
...
...
@@ -576,6 +576,11 @@ class SemanticsObject {
/// Whether this object represents an editable text field.
bool
get
isTextField
=>
hasFlag
(
ui
.
SemanticsFlag
.
isTextField
);
/// Whether this object is read only.
///
/// Only applicable when [isTextField] is true.
bool
get
isReadOnly
=>
hasFlag
(
ui
.
SemanticsFlag
.
isReadOnly
);
/// Whether this object represents an image with no tappable functionality.
bool
get
isVisualOnly
=>
hasFlag
(
ui
.
SemanticsFlag
.
isImage
)
&&
...
...
lib/stub_ui/lib/src/ui/semantics.dart
浏览文件 @
9ab6550b
...
...
@@ -298,6 +298,7 @@ class SemanticsFlag {
static
const
int
_kIsToggledIndex
=
1
<<
17
;
static
const
int
_kHasImplicitScrollingIndex
=
1
<<
18
;
static
const
int
_kIsMultilineIndex
=
1
<<
19
;
static
const
int
_kIsReadOnlyIndex
=
1
<<
20
;
const
SemanticsFlag
.
_
(
this
.
index
);
...
...
@@ -354,6 +355,12 @@ class SemanticsFlag {
static
const
SemanticsFlag
isTextField
=
const
SemanticsFlag
.
_
(
_kIsTextFieldIndex
);
/// Whether the semantic node is read only.
///
/// Only applicable when [isTextField] is true.
static
const
SemanticsFlag
isReadOnly
=
const
SemanticsFlag
.
_
(
_kIsReadOnlyIndex
);
/// Whether the semantic node currently holds the user's focus.
///
/// The focused element is usually the current receiver of keyboard inputs.
...
...
@@ -539,6 +546,7 @@ class SemanticsFlag {
_kIsToggledIndex:
isToggled
,
_kHasImplicitScrollingIndex:
hasImplicitScrolling
,
_kIsMultilineIndex:
isMultiline
,
_kIsReadOnlyIndex:
isReadOnly
,
};
@override
...
...
@@ -584,6 +592,8 @@ class SemanticsFlag {
return
'SemanticsFlag.hasImplicitScrolling'
;
case
_kIsMultilineIndex:
return
'SemanticsFlag.isMultiline'
;
case
_kIsReadOnlyIndex:
return
'SemanticsFlag.isReadOnly'
;
}
return
null
;
}
...
...
lib/ui/semantics.dart
浏览文件 @
9ab6550b
...
...
@@ -288,6 +288,7 @@ class SemanticsFlag {
static
const
int
_kHasToggledStateIndex
=
1
<<
16
;
static
const
int
_kIsToggledIndex
=
1
<<
17
;
static
const
int
_kHasImplicitScrollingIndex
=
1
<<
18
;
static
const
int
_kIsReadOnlyIndex
=
1
<<
20
;
const
SemanticsFlag
.
_
(
this
.
index
);
...
...
@@ -341,6 +342,11 @@ class SemanticsFlag {
/// affordances.
static
const
SemanticsFlag
isTextField
=
SemanticsFlag
.
_
(
_kIsTextFieldIndex
);
/// Whether the semantic node is read only.
///
/// Only applicable when [isTextField] is true.
static
const
SemanticsFlag
isReadOnly
=
SemanticsFlag
.
_
(
_kIsReadOnlyIndex
);
/// Whether the semantic node currently holds the user's focus.
///
/// The focused element is usually the current receiver of keyboard inputs.
...
...
@@ -506,6 +512,7 @@ class SemanticsFlag {
_kHasToggledStateIndex:
hasToggledState
,
_kIsToggledIndex:
isToggled
,
_kHasImplicitScrollingIndex:
hasImplicitScrolling
,
_kIsReadOnlyIndex:
isReadOnly
,
};
@override
...
...
@@ -549,6 +556,8 @@ class SemanticsFlag {
return
'SemanticsFlag.isToggled'
;
case
_kHasImplicitScrollingIndex:
return
'SemanticsFlag.hasImplicitScrolling'
;
case
_kIsReadOnlyIndex:
return
'SemanticsFlag.isReadOnly'
;
}
return
null
;
}
...
...
lib/ui/semantics/semantics_node.h
浏览文件 @
9ab6550b
...
...
@@ -69,6 +69,7 @@ enum class SemanticsFlags : int32_t {
kHasToggledState
=
1
<<
16
,
kIsToggled
=
1
<<
17
,
kHasImplicitScrolling
=
1
<<
18
,
kIsReadOnly
=
1
<<
20
,
};
const
int
kScrollableSemanticsFlags
=
...
...
shell/platform/android/io/flutter/view/AccessibilityBridge.java
浏览文件 @
9ab6550b
...
...
@@ -529,9 +529,11 @@ public class AccessibilityBridge extends AccessibilityNodeProvider {
if
(
semanticsNode
.
hasFlag
(
Flag
.
IS_TEXT_FIELD
))
{
result
.
setPassword
(
semanticsNode
.
hasFlag
(
Flag
.
IS_OBSCURED
));
result
.
setClassName
(
"android.widget.EditText"
);
if
(!
semanticsNode
.
hasFlag
(
Flag
.
IS_READ_ONLY
))
{
result
.
setClassName
(
"android.widget.EditText"
);
}
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
JELLY_BEAN_MR2
)
{
result
.
setEditable
(
true
);
result
.
setEditable
(
!
semanticsNode
.
hasFlag
(
Flag
.
IS_READ_ONLY
)
);
if
(
semanticsNode
.
textSelectionBase
!=
-
1
&&
semanticsNode
.
textSelectionExtent
!=
-
1
)
{
result
.
setTextSelection
(
semanticsNode
.
textSelectionBase
,
semanticsNode
.
textSelectionExtent
);
}
...
...
@@ -1611,7 +1613,8 @@ public class AccessibilityBridge extends AccessibilityNodeProvider {
IS_LIVE_REGION
(
1
<<
15
),
HAS_TOGGLED_STATE
(
1
<<
16
),
IS_TOGGLED
(
1
<<
17
),
HAS_IMPLICIT_SCROLLING
(
1
<<
18
);
HAS_IMPLICIT_SCROLLING
(
1
<<
18
),
IS_READ_ONLY
(
1
<<
20
);
final
int
value
;
...
...
shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm
浏览文件 @
9ab6550b
...
...
@@ -713,7 +713,8 @@ SemanticsObject* AccessibilityBridge::GetOrCreateObject(int32_t uid,
if
(
!
object
)
{
// New node case: simply create a new SemanticsObject.
flutter
::
SemanticsNode
node
=
updates
[
uid
];
if
(
node
.
HasFlag
(
flutter
::
SemanticsFlags
::
kIsTextField
))
{
if
(
node
.
HasFlag
(
flutter
::
SemanticsFlags
::
kIsTextField
)
&&
!
node
.
HasFlag
(
flutter
::
SemanticsFlags
::
kIsReadOnly
))
{
// Text fields are backed by objects that implement UITextInput.
object
=
[[[
TextInputSemanticsObject
alloc
]
initWithBridge
:
GetWeakPtr
()
uid
:
uid
]
autorelease
];
}
else
{
...
...
@@ -729,13 +730,16 @@ SemanticsObject* AccessibilityBridge::GetOrCreateObject(int32_t uid,
flutter
::
SemanticsNode
node
=
nodeEntry
->
second
;
BOOL
isTextField
=
node
.
HasFlag
(
flutter
::
SemanticsFlags
::
kIsTextField
);
BOOL
wasTextField
=
object
.
node
.
HasFlag
(
flutter
::
SemanticsFlags
::
kIsTextField
);
if
(
wasTextField
!=
isTextField
)
{
BOOL
isReadOnly
=
node
.
HasFlag
(
flutter
::
SemanticsFlags
::
kIsReadOnly
);
BOOL
wasReadOnly
=
object
.
node
.
HasFlag
(
flutter
::
SemanticsFlags
::
kIsReadOnly
);
if
(
wasTextField
!=
isTextField
||
isReadOnly
!=
wasReadOnly
)
{
// The node changed its type from text field to something else, or vice versa. In this
// case, we cannot reuse the existing SemanticsObject implementation. Instead, we replace
// it with a new instance.
NSUInteger
positionInChildlist
=
[
object
.
parent
.
children
indexOfObject
:
object
];
SemanticsObject
*
parent
=
object
.
parent
;
[
objects_
removeObjectForKey
:
@
(
node
.
id
)];
if
(
isTextField
)
{
if
(
isTextField
&&
!
isReadOnly
)
{
// Text fields are backed by objects that implement UITextInput.
object
=
[[[
TextInputSemanticsObject
alloc
]
initWithBridge
:
GetWeakPtr
()
uid:
uid
]
autorelease
];
...
...
@@ -743,6 +747,7 @@ SemanticsObject* AccessibilityBridge::GetOrCreateObject(int32_t uid,
object
=
[[[
FlutterSemanticsObject
alloc
]
initWithBridge
:
GetWeakPtr
()
uid:
uid
]
autorelease
];
}
object
.
parent
=
parent
;
[
object
.
parent
.
children
replaceObjectAtIndex
:
positionInChildlist
withObject
:
object
];
objects_
.
get
()[
@
(
node
.
id
)]
=
object
;
}
...
...
shell/platform/embedder/embedder.h
浏览文件 @
9ab6550b
...
...
@@ -153,6 +153,10 @@ typedef enum {
// |PageView| widget does not have implicit scrolling, so that users don't
// navigate to the next page when reaching the end of the current one.
kFlutterSemanticsFlagHasImplicitScrolling
=
1
<<
18
,
// Whether the semantic node is read only.
//
// Only applicable when kFlutterSemanticsFlagIsTextField flag is on.
kFlutterSemanticsFlagIsReadOnly
=
1
<<
20
,
}
FlutterSemanticsFlag
;
typedef
enum
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录