@beppla/tapas-ui 1.4.10 → 1.4.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commonjs/Input/FOCUS_FIX_SUMMARY.md +201 -0
- package/commonjs/Input/FOCUS_ISSUE_ANALYSIS.md +188 -0
- package/commonjs/Input/Input.js +62 -3
- package/commonjs/Input/Input.js.map +1 -1
- package/module/Input/FOCUS_FIX_SUMMARY.md +201 -0
- package/module/Input/FOCUS_ISSUE_ANALYSIS.md +188 -0
- package/module/Input/Input.js +63 -3
- package/module/Input/Input.js.map +1 -1
- package/package.json +1 -1
- package/typescript/Input/Input.d.ts.map +1 -1
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# Android Input 焦点跳动问题修复总结
|
|
2
|
+
|
|
3
|
+
## 修复时间
|
|
4
|
+
2025-12-04
|
|
5
|
+
|
|
6
|
+
## 修复方案
|
|
7
|
+
采用**方案 1 + 方案 3 组合**:添加焦点状态检查 + 改进延迟 blur 逻辑
|
|
8
|
+
|
|
9
|
+
## 修复内容
|
|
10
|
+
|
|
11
|
+
### 方案 1:添加焦点状态检查
|
|
12
|
+
|
|
13
|
+
#### 1. 添加焦点状态跟踪
|
|
14
|
+
- 新增 `isFocusedRef`:使用 ref 存储 `isFocused` 的最新值,避免在 useEffect 中需要依赖
|
|
15
|
+
- 新增 `lastFocusTimeRef`:记录最后一次 focus 的时间戳
|
|
16
|
+
- 新增 `FOCUS_SWITCH_PROTECTION_PERIOD`:焦点切换保护期(200ms)
|
|
17
|
+
|
|
18
|
+
### 2. 改进 `handleFocus` 逻辑(方案 3)
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
const handleFocus = useCallback((e: any) => {
|
|
22
|
+
// 清除可能存在的 blur 延迟
|
|
23
|
+
if (blurTimeoutRef.current) {
|
|
24
|
+
clearTimeout(blurTimeoutRef.current);
|
|
25
|
+
blurTimeoutRef.current = null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 方案 3:清除所有其他 Input 的重新聚焦标记
|
|
29
|
+
// 当当前 Input 获得焦点时,清除其他 Input 的 shouldRefocusRef,防止焦点跳动
|
|
30
|
+
inputInstancesRef.forEach((ref) => {
|
|
31
|
+
if (ref !== shouldRefocusRef) {
|
|
32
|
+
ref.current = false;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// 清除当前组件的重新聚焦标记,因为当前组件已经获得焦点
|
|
37
|
+
shouldRefocusRef.current = false;
|
|
38
|
+
// 记录 focus 时间戳,用于焦点切换保护期判断
|
|
39
|
+
lastFocusTimeRef.current = Date.now();
|
|
40
|
+
// 更新 ref 和 state
|
|
41
|
+
isFocusedRef.current = true;
|
|
42
|
+
setIsFocused(true);
|
|
43
|
+
onFocus?.(e);
|
|
44
|
+
}, [onFocus]);
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**改进点**(方案 3):
|
|
48
|
+
- **全局实例管理**:使用全局 `inputInstancesRef` Set 存储所有 Input 实例的 `shouldRefocusRef`
|
|
49
|
+
- **主动清除其他 Input 标记**:当当前 Input 获得焦点时,立即清除所有其他 Input 的 `shouldRefocusRef`,防止它们错误地重新聚焦
|
|
50
|
+
- 记录 focus 时间戳,用于后续保护期判断
|
|
51
|
+
- 同步更新 `isFocusedRef` 和 `isFocused` state
|
|
52
|
+
|
|
53
|
+
#### 4. 改进 `handleBlur` 逻辑
|
|
54
|
+
```typescript
|
|
55
|
+
// 在 blur 时同步更新 ref
|
|
56
|
+
isFocusedRef.current = false;
|
|
57
|
+
setIsFocused(false);
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**改进点**:
|
|
61
|
+
- 确保 ref 和 state 同步更新
|
|
62
|
+
|
|
63
|
+
### 方案 3:改进延迟 blur 逻辑
|
|
64
|
+
|
|
65
|
+
#### 1. 全局 Input 实例管理
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
// 方案 3:全局 Input 实例管理器,用于清除其他 Input 的重新聚焦标记
|
|
69
|
+
const inputInstancesRef = new Set<React.MutableRefObject<boolean>>();
|
|
70
|
+
|
|
71
|
+
// 注册当前 Input 实例到全局管理器
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
if (Platform.OS === 'android' && enableBridgelessFix) {
|
|
74
|
+
inputInstancesRef.add(shouldRefocusRef);
|
|
75
|
+
return () => {
|
|
76
|
+
inputInstancesRef.delete(shouldRefocusRef);
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}, [enableBridgelessFix]);
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**作用**:
|
|
83
|
+
- 维护所有 Input 实例的引用,用于在 focus 时清除其他 Input 的重新聚焦标记
|
|
84
|
+
- 组件卸载时自动清理,避免内存泄漏
|
|
85
|
+
|
|
86
|
+
#### 2. 在 `handleFocus` 中清除其他 Input 的标记
|
|
87
|
+
|
|
88
|
+
见上面的 `handleFocus` 逻辑部分。
|
|
89
|
+
|
|
90
|
+
### 方案 1:核心修复 - `keyboardDidShow` 监听器
|
|
91
|
+
|
|
92
|
+
添加了三层检查机制:
|
|
93
|
+
|
|
94
|
+
#### 检查 1:当前组件是否已聚焦
|
|
95
|
+
```typescript
|
|
96
|
+
if (isFocusedRef.current) {
|
|
97
|
+
// 当前组件已经聚焦,清除重新聚焦标记,避免后续误操作
|
|
98
|
+
shouldRefocusRef.current = false;
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
**作用**:如果当前组件已经聚焦,说明键盘是由当前组件触发的,不需要重新聚焦。
|
|
103
|
+
|
|
104
|
+
#### 检查 2:焦点切换保护期
|
|
105
|
+
```typescript
|
|
106
|
+
const timeSinceLastFocus = Date.now() - lastFocusTimeRef.current;
|
|
107
|
+
if (timeSinceLastFocus < FOCUS_SWITCH_PROTECTION_PERIOD) {
|
|
108
|
+
// 在保护期内,说明可能有其他 Input 正在获得焦点,不执行重新聚焦
|
|
109
|
+
shouldRefocusRef.current = false;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
**作用**:如果在 200ms 内有 focus 事件(可能是其他 Input 获得焦点),不执行重新聚焦,避免焦点跳动。
|
|
114
|
+
|
|
115
|
+
#### 检查 3:异步执行时的状态再次检查
|
|
116
|
+
```typescript
|
|
117
|
+
if (shouldRefocusRef.current && !isFocusedRef.current && inputRef.current) {
|
|
118
|
+
// 执行重新聚焦逻辑
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
**作用**:在异步执行时再次检查状态,避免在异步执行期间状态已改变。
|
|
122
|
+
|
|
123
|
+
## 方案组合优势
|
|
124
|
+
|
|
125
|
+
**方案 1 + 方案 3 组合**提供了双重保障机制:
|
|
126
|
+
|
|
127
|
+
1. **方案 3(主动清除)**:在 Input B focus 时立即清除 Input A 的标记,从源头阻止焦点跳动
|
|
128
|
+
2. **方案 1(状态检查)**:即使标记未被清除,也会通过状态检查阻止重新聚焦,作为备用保障
|
|
129
|
+
|
|
130
|
+
这种组合方式确保了:
|
|
131
|
+
- ✅ **更快的响应**:方案 3 在 focus 时立即清除,不需要等待键盘事件
|
|
132
|
+
- ✅ **更强的保障**:方案 1 提供额外的状态检查,即使方案 3 失效也能阻止焦点跳动
|
|
133
|
+
- ✅ **更好的兼容性**:两种机制互补,适应不同的时序场景
|
|
134
|
+
|
|
135
|
+
## 修复原理
|
|
136
|
+
|
|
137
|
+
### 问题根源
|
|
138
|
+
当两个 Input 切换焦点时:
|
|
139
|
+
1. Input A blur → 设置 `shouldRefocusRef.current = true`
|
|
140
|
+
2. Input B focus → 触发键盘显示
|
|
141
|
+
3. 键盘显示 → 所有 Input 的 `keyboardDidShow` 监听器都被触发
|
|
142
|
+
4. Input A 的监听器检测到标记 → 错误地重新聚焦 Input A
|
|
143
|
+
|
|
144
|
+
### 修复机制
|
|
145
|
+
|
|
146
|
+
**方案 1:三层检查机制**
|
|
147
|
+
通过三层检查,确保只有在以下条件**全部满足**时才执行重新聚焦:
|
|
148
|
+
1. ✅ 当前组件**未聚焦**(`!isFocusedRef.current`)
|
|
149
|
+
2. ✅ 不在焦点切换保护期内(最近 200ms 内没有 focus 事件)
|
|
150
|
+
3. ✅ 确实需要重新聚焦(`shouldRefocusRef.current === true`)
|
|
151
|
+
|
|
152
|
+
**方案 3:主动清除机制**
|
|
153
|
+
当 Input B 获得焦点时,立即清除 Input A 的 `shouldRefocusRef`,双重保障:
|
|
154
|
+
1. ✅ Input B focus → 立即清除 Input A 的 `shouldRefocusRef.current = false`
|
|
155
|
+
2. ✅ 即使 Input A 的 `keyboardDidShow` 被触发,也会因为标记已被清除而不执行重新聚焦
|
|
156
|
+
|
|
157
|
+
## 修复效果
|
|
158
|
+
|
|
159
|
+
### 修复前
|
|
160
|
+
```
|
|
161
|
+
Input A blur → Input B focus → 键盘显示 → Input A 错误重新聚焦 → 焦点跳动
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 修复后(方案 1 + 方案 3 组合)
|
|
165
|
+
```
|
|
166
|
+
Input A blur → Input B focus → 立即清除 Input A 的标记 → 键盘显示 → Input A 检测到标记已清除 → 不执行重新聚焦 → 焦点正常切换
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**双重保障**:
|
|
170
|
+
1. **方案 3 主动清除**:Input B focus 时立即清除 Input A 的标记
|
|
171
|
+
2. **方案 1 状态检查**:即使标记未被清除,也会通过状态检查阻止重新聚焦
|
|
172
|
+
|
|
173
|
+
## 测试场景
|
|
174
|
+
|
|
175
|
+
修复后需要测试以下场景:
|
|
176
|
+
|
|
177
|
+
1. ✅ **单个 Input 聚焦**:点击单个 Input,键盘正常显示,无焦点跳动
|
|
178
|
+
2. ✅ **两个 Input 切换**:在 Input A 和 Input B 之间切换,焦点正常切换,无跳动
|
|
179
|
+
3. ✅ **快速连续切换**:快速连续点击多个 Input,焦点正常切换
|
|
180
|
+
4. ✅ **点击外部区域**:点击 Input 外部区域,键盘正常隐藏
|
|
181
|
+
5. ✅ **ScrollView 中的 Input**:在 ScrollView 中的 Input 正常聚焦
|
|
182
|
+
|
|
183
|
+
## 兼容性
|
|
184
|
+
|
|
185
|
+
- ✅ 保持对 RN 0.77 Bridgeless 模式的兼容
|
|
186
|
+
- ✅ 不影响 iOS 平台(仅在 Android 上生效)
|
|
187
|
+
- ✅ 可以通过 `enableBridgelessFix` 禁用修复
|
|
188
|
+
- ✅ 向后兼容,不影响现有功能
|
|
189
|
+
|
|
190
|
+
## 代码变更文件
|
|
191
|
+
|
|
192
|
+
- `components/Input/Input.tsx`
|
|
193
|
+
|
|
194
|
+
## 相关文档
|
|
195
|
+
|
|
196
|
+
- `components/Input/FOCUS_ISSUE_ANALYSIS.md` - 问题分析文档
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
**修复完成** ✅
|
|
201
|
+
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Android Input 组件焦点跳动问题分析
|
|
2
|
+
|
|
3
|
+
## 问题描述
|
|
4
|
+
|
|
5
|
+
在 Android 平台上,当两个 Input 组件切换焦点时,出现焦点来回跳动的问题:
|
|
6
|
+
|
|
7
|
+
1. **第一个 Input** 失去焦点(blur)
|
|
8
|
+
2. **第二个 Input** 获取焦点(focus)
|
|
9
|
+
3. 焦点又**跳回第一个 Input**
|
|
10
|
+
4. 形成来回跳动的循环
|
|
11
|
+
|
|
12
|
+
## 问题场景重现
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
用户操作流程:
|
|
16
|
+
1. 点击 Input A → Input A 获得焦点
|
|
17
|
+
2. 点击 Input B → Input A 触发 blur,Input B 触发 focus
|
|
18
|
+
3. 键盘显示 → 触发 keyboardDidShow 事件
|
|
19
|
+
4. ❌ Input A 的 keyboardDidShow 监听器被触发
|
|
20
|
+
5. ❌ Input A 检测到 shouldRefocusRef.current === true
|
|
21
|
+
6. ❌ Input A 自动重新聚焦
|
|
22
|
+
7. ❌ 焦点从 Input B 跳回 Input A
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 根本原因分析
|
|
26
|
+
|
|
27
|
+
### 1. 全局键盘事件监听器冲突
|
|
28
|
+
|
|
29
|
+
**问题代码位置**:`components/Input/Input.tsx:140-188`
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
const keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', () => {
|
|
33
|
+
if (shouldRefocusRef.current) {
|
|
34
|
+
// 尝试重新聚焦
|
|
35
|
+
inputRef.current.focus();
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**问题分析**:
|
|
41
|
+
- `keyboardDidShow` 是**全局事件**,所有 Input 组件实例都会收到
|
|
42
|
+
- 当第二个 Input 获得焦点并触发键盘显示时,**第一个 Input 的监听器也会被触发**
|
|
43
|
+
- 第一个 Input 检测到 `shouldRefocusRef.current === true`(在 blur 时设置的),就会尝试重新聚焦
|
|
44
|
+
- 这导致焦点被错误地抢回第一个 Input
|
|
45
|
+
|
|
46
|
+
### 2. 缺少焦点状态检查
|
|
47
|
+
|
|
48
|
+
**问题代码位置**:`components/Input/Input.tsx:143-187`
|
|
49
|
+
|
|
50
|
+
当前逻辑只检查 `shouldRefocusRef.current`,但没有检查:
|
|
51
|
+
- 当前是否有其他 Input 已经获得焦点
|
|
52
|
+
- 当前组件是否真的需要重新聚焦
|
|
53
|
+
- 是否正在切换焦点到其他 Input
|
|
54
|
+
|
|
55
|
+
### 3. 延迟 blur 与键盘事件的时序问题
|
|
56
|
+
|
|
57
|
+
**问题代码位置**:`components/Input/Input.tsx:90-123`
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
const handleBlur = useCallback((e: any) => {
|
|
61
|
+
if (Platform.OS === 'android' && enableBridgelessFix) {
|
|
62
|
+
shouldRefocusRef.current = true; // ⚠️ 问题:立即设置标记
|
|
63
|
+
blurTimeoutRef.current = setTimeout(() => {
|
|
64
|
+
// 延迟 500-800ms 后才真正执行 blur
|
|
65
|
+
}, delay);
|
|
66
|
+
}
|
|
67
|
+
}, [onBlur, enableBridgelessFix]);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**时序问题**:
|
|
71
|
+
1. Input A blur → 设置 `shouldRefocusRef.current = true`
|
|
72
|
+
2. Input B focus → 触发键盘显示
|
|
73
|
+
3. 键盘显示 → 触发 `keyboardDidShow`(所有 Input 都收到)
|
|
74
|
+
4. Input A 的监听器检测到标记 → 重新聚焦 Input A
|
|
75
|
+
5. 此时 Input B 刚获得焦点,就被 Input A 抢走了
|
|
76
|
+
|
|
77
|
+
### 4. 缺少组件实例标识
|
|
78
|
+
|
|
79
|
+
当前实现中,每个 Input 组件实例都是独立的,但它们共享同一个全局键盘事件。当多个 Input 同时存在时,无法区分:
|
|
80
|
+
- 哪个 Input 应该响应键盘事件
|
|
81
|
+
- 哪个 Input 正在失去焦点
|
|
82
|
+
- 哪个 Input 正在获得焦点
|
|
83
|
+
|
|
84
|
+
## 问题流程图
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
88
|
+
│ 用户点击 Input B(Input A 当前有焦点) │
|
|
89
|
+
└─────────────────────────────────────────────────────────────┘
|
|
90
|
+
│
|
|
91
|
+
▼
|
|
92
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
93
|
+
│ 1. Input A 触发 handleBlur │
|
|
94
|
+
│ - shouldRefocusRef.current = true │
|
|
95
|
+
│ - 设置延迟 blur(500-800ms) │
|
|
96
|
+
└─────────────────────────────────────────────────────────────┘
|
|
97
|
+
│
|
|
98
|
+
▼
|
|
99
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
100
|
+
│ 2. Input B 触发 handleFocus │
|
|
101
|
+
│ - 清除 Input B 的 blurTimeout │
|
|
102
|
+
│ - setIsFocused(true) │
|
|
103
|
+
└─────────────────────────────────────────────────────────────┘
|
|
104
|
+
│
|
|
105
|
+
▼
|
|
106
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
107
|
+
│ 3. 键盘显示 → 触发全局 keyboardDidShow 事件 │
|
|
108
|
+
│ - 所有 Input 组件的监听器都被触发 │
|
|
109
|
+
└─────────────────────────────────────────────────────────────┘
|
|
110
|
+
│
|
|
111
|
+
▼
|
|
112
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
113
|
+
│ 4. Input A 的 keyboardDidShow 监听器执行 │
|
|
114
|
+
│ - 检测到 shouldRefocusRef.current === true │
|
|
115
|
+
│ - ❌ 错误地重新聚焦 Input A │
|
|
116
|
+
└─────────────────────────────────────────────────────────────┘
|
|
117
|
+
│
|
|
118
|
+
▼
|
|
119
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
120
|
+
│ 5. 焦点从 Input B 跳回 Input A │
|
|
121
|
+
│ - 形成焦点跳动问题 │
|
|
122
|
+
└─────────────────────────────────────────────────────────────┘
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## 解决方案设计
|
|
126
|
+
|
|
127
|
+
### 方案 1:添加焦点状态检查(推荐)
|
|
128
|
+
|
|
129
|
+
**核心思路**:在 `keyboardDidShow` 监听器中,检查当前组件是否真的需要重新聚焦。
|
|
130
|
+
|
|
131
|
+
**实现要点**:
|
|
132
|
+
1. 检查 `isFocused` 状态,如果已经是聚焦状态,不执行重新聚焦
|
|
133
|
+
2. 检查是否有其他 Input 正在获得焦点(通过事件时间戳判断)
|
|
134
|
+
3. 添加短暂的"焦点切换保护期",在保护期内不执行重新聚焦
|
|
135
|
+
|
|
136
|
+
### 方案 2:使用全局焦点管理器
|
|
137
|
+
|
|
138
|
+
**核心思路**:创建一个全局的焦点管理器,统一管理所有 Input 的焦点状态。
|
|
139
|
+
|
|
140
|
+
**实现要点**:
|
|
141
|
+
1. 创建一个全局的焦点管理器 Context
|
|
142
|
+
2. 记录当前聚焦的 Input 实例 ID
|
|
143
|
+
3. 只有当前聚焦的 Input 才能响应键盘事件
|
|
144
|
+
|
|
145
|
+
### 方案 3:改进延迟 blur 逻辑
|
|
146
|
+
|
|
147
|
+
**核心思路**:在 blur 时,如果检测到有新的 focus 事件,立即取消重新聚焦标记。
|
|
148
|
+
|
|
149
|
+
**实现要点**:
|
|
150
|
+
1. 在 `handleFocus` 中,清除所有其他 Input 的 `shouldRefocusRef` 标记
|
|
151
|
+
2. 使用全局事件或 Context 来通知其他 Input 组件
|
|
152
|
+
|
|
153
|
+
## 推荐方案:方案 1 + 方案 3 组合
|
|
154
|
+
|
|
155
|
+
结合两种方案的优点:
|
|
156
|
+
1. **在 `handleFocus` 中清除其他 Input 的重新聚焦标记**
|
|
157
|
+
2. **在 `keyboardDidShow` 中检查 `isFocused` 状态**
|
|
158
|
+
3. **添加焦点切换保护期**
|
|
159
|
+
|
|
160
|
+
## 修复要点
|
|
161
|
+
|
|
162
|
+
1. ✅ 在 `handleFocus` 中,通过全局机制清除其他 Input 的 `shouldRefocusRef`
|
|
163
|
+
2. ✅ 在 `keyboardDidShow` 中,检查 `isFocused` 状态,如果已聚焦则不执行
|
|
164
|
+
3. ✅ 添加焦点切换保护期(例如 200ms),在保护期内不执行重新聚焦
|
|
165
|
+
4. ✅ 改进事件时序处理,确保 blur 和 focus 事件正确处理
|
|
166
|
+
|
|
167
|
+
## 测试场景
|
|
168
|
+
|
|
169
|
+
修复后需要测试以下场景:
|
|
170
|
+
|
|
171
|
+
1. ✅ 单个 Input 点击后键盘正常显示
|
|
172
|
+
2. ✅ 两个 Input 之间正常切换焦点
|
|
173
|
+
3. ✅ 快速连续切换多个 Input
|
|
174
|
+
4. ✅ 点击 Input 外部区域,键盘正常隐藏
|
|
175
|
+
5. ✅ 在 ScrollView 中的 Input 正常聚焦
|
|
176
|
+
|
|
177
|
+
## 风险评估
|
|
178
|
+
|
|
179
|
+
- **低风险**:方案 1 和方案 3 都是对现有逻辑的改进,不会破坏现有功能
|
|
180
|
+
- **兼容性**:修复后仍然保持对 RN 0.77 Bridgeless 模式的兼容
|
|
181
|
+
- **性能影响**:几乎无影响,只是添加了状态检查
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
**分析完成时间**:2025-12-04
|
|
186
|
+
**问题优先级**:高
|
|
187
|
+
**建议修复方案**:方案 1 + 方案 3 组合
|
|
188
|
+
|
package/commonjs/Input/Input.js
CHANGED
|
@@ -10,6 +10,9 @@ var _themed = require("@rneui/themed");
|
|
|
10
10
|
var _bridgelessUtils = require("../common/bridgelessUtils");
|
|
11
11
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
12
12
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
13
|
+
// 方案 3:全局 Input 实例管理器,用于清除其他 Input 的重新聚焦标记
|
|
14
|
+
// 存储所有 Input 实例的 shouldRefocusRef,用于在 focus 时清除其他 Input 的标记
|
|
15
|
+
const inputInstancesRef = new Set();
|
|
13
16
|
const useStyles = (0, _themed.makeStyles)((theme, ...props) => {
|
|
14
17
|
const {
|
|
15
18
|
labelBg,
|
|
@@ -70,13 +73,33 @@ const TapasInput = ({
|
|
|
70
73
|
const keyboardHideListenerRef = (0, _react.useRef)(null);
|
|
71
74
|
const shouldRefocusRef = (0, _react.useRef)(false);
|
|
72
75
|
const isBridgeless = (0, _react.useRef)((0, _bridgelessUtils.isBridgelessMode)());
|
|
76
|
+
// 使用 ref 存储 isFocused 的最新值,避免在 useEffect 中需要依赖
|
|
77
|
+
const isFocusedRef = (0, _react.useRef)(false);
|
|
78
|
+
// 记录最后一次 focus 的时间戳,用于焦点切换保护期
|
|
79
|
+
const lastFocusTimeRef = (0, _react.useRef)(0);
|
|
80
|
+
// 焦点切换保护期(ms),在此时间内不执行重新聚焦,避免焦点跳动
|
|
81
|
+
const FOCUS_SWITCH_PROTECTION_PERIOD = 200;
|
|
73
82
|
const handleFocus = (0, _react.useCallback)(e => {
|
|
74
83
|
// 清除可能存在的 blur 延迟
|
|
75
84
|
if (blurTimeoutRef.current) {
|
|
76
85
|
clearTimeout(blurTimeoutRef.current);
|
|
77
86
|
blurTimeoutRef.current = null;
|
|
78
87
|
}
|
|
88
|
+
|
|
89
|
+
// 方案 3:清除所有其他 Input 的重新聚焦标记
|
|
90
|
+
// 当当前 Input 获得焦点时,清除其他 Input 的 shouldRefocusRef,防止焦点跳动
|
|
91
|
+
inputInstancesRef.forEach(ref => {
|
|
92
|
+
if (ref !== shouldRefocusRef) {
|
|
93
|
+
ref.current = false;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// 清除当前组件的重新聚焦标记,因为当前组件已经获得焦点
|
|
79
98
|
shouldRefocusRef.current = false;
|
|
99
|
+
// 记录 focus 时间戳,用于焦点切换保护期判断
|
|
100
|
+
lastFocusTimeRef.current = Date.now();
|
|
101
|
+
// 更新 ref 和 state
|
|
102
|
+
isFocusedRef.current = true;
|
|
80
103
|
setIsFocused(true);
|
|
81
104
|
onFocus?.(e);
|
|
82
105
|
}, [onFocus]);
|
|
@@ -103,12 +126,16 @@ const TapasInput = ({
|
|
|
103
126
|
blurTimeoutRef.current = null;
|
|
104
127
|
return;
|
|
105
128
|
}
|
|
129
|
+
|
|
130
|
+
// 更新 ref 和 state
|
|
131
|
+
isFocusedRef.current = false;
|
|
106
132
|
setIsFocused(false);
|
|
107
133
|
onBlur?.(e);
|
|
108
134
|
shouldRefocusRef.current = false;
|
|
109
135
|
blurTimeoutRef.current = null;
|
|
110
136
|
}, delay);
|
|
111
137
|
} else {
|
|
138
|
+
isFocusedRef.current = false;
|
|
112
139
|
setIsFocused(false);
|
|
113
140
|
onBlur?.(e);
|
|
114
141
|
}
|
|
@@ -120,6 +147,17 @@ const TapasInput = ({
|
|
|
120
147
|
borderBottomWidth: 0
|
|
121
148
|
}, props.inputContainerStyle], [props.inputContainerStyle]);
|
|
122
149
|
|
|
150
|
+
// 方案 3:注册当前 Input 实例到全局管理器
|
|
151
|
+
(0, _react.useEffect)(() => {
|
|
152
|
+
if (_reactNative.Platform.OS === 'android' && enableBridgelessFix) {
|
|
153
|
+
inputInstancesRef.add(shouldRefocusRef);
|
|
154
|
+
return () => {
|
|
155
|
+
inputInstancesRef.delete(shouldRefocusRef);
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
return undefined;
|
|
159
|
+
}, [enableBridgelessFix]);
|
|
160
|
+
|
|
123
161
|
// Android 键盘监听:当键盘显示时,如果输入框失焦,尝试重新聚焦
|
|
124
162
|
// 这是针对 RN 0.77 Bridgeless 模式的兼容性修复
|
|
125
163
|
(0, _react.useEffect)(() => {
|
|
@@ -129,11 +167,31 @@ const TapasInput = ({
|
|
|
129
167
|
const keyboardDidShowListener = _reactNative.Keyboard.addListener('keyboardDidShow', () => {
|
|
130
168
|
// 键盘显示时,如果应该重新聚焦且输入框失焦,则尝试重新聚焦
|
|
131
169
|
// React Native 0.77 可能需要多次尝试才能成功聚焦
|
|
170
|
+
|
|
171
|
+
// 方案 1 修复:添加焦点状态检查,防止焦点跳动
|
|
172
|
+
// 1. 如果当前组件已经聚焦,不需要重新聚焦(可能是其他 Input 触发的键盘显示)
|
|
173
|
+
if (isFocusedRef.current) {
|
|
174
|
+
// 当前组件已经聚焦,清除重新聚焦标记,避免后续误操作
|
|
175
|
+
shouldRefocusRef.current = false;
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// 2. 检查是否在焦点切换保护期内
|
|
180
|
+
// 如果最近有 focus 事件(可能是其他 Input 获得焦点),不执行重新聚焦
|
|
181
|
+
const timeSinceLastFocus = Date.now() - lastFocusTimeRef.current;
|
|
182
|
+
if (timeSinceLastFocus < FOCUS_SWITCH_PROTECTION_PERIOD) {
|
|
183
|
+
// 在保护期内,说明可能有其他 Input 正在获得焦点,不执行重新聚焦
|
|
184
|
+
shouldRefocusRef.current = false;
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// 3. 只有在确实需要重新聚焦且不在保护期内时才执行
|
|
132
189
|
if (shouldRefocusRef.current) {
|
|
133
190
|
// 使用双重 requestAnimationFrame 确保在渲染完成后执行(RN 0.77 新架构可能需要)
|
|
134
191
|
requestAnimationFrame(() => {
|
|
135
192
|
requestAnimationFrame(() => {
|
|
136
|
-
|
|
193
|
+
// 再次检查状态,避免在异步执行期间状态已改变
|
|
194
|
+
if (shouldRefocusRef.current && !isFocusedRef.current && inputRef.current) {
|
|
137
195
|
// 尝试通过 inputRef 重新聚焦
|
|
138
196
|
// @rneui/themed 的 Input 组件可能支持 inputRef prop
|
|
139
197
|
try {
|
|
@@ -152,7 +210,7 @@ const TapasInput = ({
|
|
|
152
210
|
} else {
|
|
153
211
|
// 如果无法直接聚焦,尝试延迟后再次聚焦(RN 0.77 可能需要)
|
|
154
212
|
setTimeout(() => {
|
|
155
|
-
if (shouldRefocusRef.current && inputRef.current) {
|
|
213
|
+
if (shouldRefocusRef.current && !isFocusedRef.current && inputRef.current) {
|
|
156
214
|
try {
|
|
157
215
|
if (inputRef.current.focus) {
|
|
158
216
|
inputRef.current.focus();
|
|
@@ -193,7 +251,8 @@ const TapasInput = ({
|
|
|
193
251
|
blurTimeoutRef.current = null;
|
|
194
252
|
}
|
|
195
253
|
};
|
|
196
|
-
}, []);
|
|
254
|
+
}, []); // 使用 ref 访问最新状态,不需要添加依赖
|
|
255
|
+
|
|
197
256
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
198
257
|
style: {
|
|
199
258
|
flex: 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_themed","_bridgelessUtils","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","useStyles","makeStyles","theme","props","labelBg","labelColor","inputBase","minWidth","minHeight","paddingHorizontal","paddingVertical","input","fontFamily","fonts","fontSize","sizeM","fontWeight","weightR","color","colors","colorTextPrimary","borderRadius","radius","rounded","borderWidth","borderColor","colorBorder1","paddingLeft","paddingRight","labelContext","sizeS","backgroundColor","white","overflow","position","display","flexDirection","zIndex","left","top","colorTextError","TapasInput","labelPosition","onBlur","onFocus","value","propValue","enableBridgelessFix","styles","isFocused","setIsFocused","useState","inputRef","useRef","blurTimeoutRef","keyboardShowListenerRef","keyboardHideListenerRef","shouldRefocusRef","isBridgeless","isBridgelessMode","handleFocus","useCallback","current","clearTimeout","handleBlur","Platform","OS","delay","setTimeout","shouldShowLabel","useMemo","defaultShowLabel","containerStyleMemo","containerStyle","inputStyleMemo","inputStyle","inputContainerStyleMemo","borderBottomWidth","inputContainerStyle","useEffect","keyboardDidShowListener","Keyboard","addListener","requestAnimationFrame","focus","_input","err","error","keyboardDidHideListener","remove","jsx","View","style","flex","onStartShouldSetResponder","onResponderTerminationRequest","pointerEvents","children","Input","blurOnSubmit","label","jsxs","Text","required","exports","_default","withTheme"],"sourceRoot":"../../../components","sources":["Input/Input.tsx"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_themed","_bridgelessUtils","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","inputInstancesRef","Set","useStyles","makeStyles","theme","props","labelBg","labelColor","inputBase","minWidth","minHeight","paddingHorizontal","paddingVertical","input","fontFamily","fonts","fontSize","sizeM","fontWeight","weightR","color","colors","colorTextPrimary","borderRadius","radius","rounded","borderWidth","borderColor","colorBorder1","paddingLeft","paddingRight","labelContext","sizeS","backgroundColor","white","overflow","position","display","flexDirection","zIndex","left","top","colorTextError","TapasInput","labelPosition","onBlur","onFocus","value","propValue","enableBridgelessFix","styles","isFocused","setIsFocused","useState","inputRef","useRef","blurTimeoutRef","keyboardShowListenerRef","keyboardHideListenerRef","shouldRefocusRef","isBridgeless","isBridgelessMode","isFocusedRef","lastFocusTimeRef","FOCUS_SWITCH_PROTECTION_PERIOD","handleFocus","useCallback","current","clearTimeout","forEach","ref","Date","now","handleBlur","Platform","OS","delay","setTimeout","shouldShowLabel","useMemo","defaultShowLabel","containerStyleMemo","containerStyle","inputStyleMemo","inputStyle","inputContainerStyleMemo","borderBottomWidth","inputContainerStyle","useEffect","add","delete","undefined","keyboardDidShowListener","Keyboard","addListener","timeSinceLastFocus","requestAnimationFrame","focus","_input","err","error","keyboardDidHideListener","remove","jsx","View","style","flex","onStartShouldSetResponder","onResponderTerminationRequest","pointerEvents","children","Input","blurOnSubmit","label","jsxs","Text","required","exports","_default","withTheme"],"sourceRoot":"../../../components","sources":["Input/Input.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# Android Input 焦点跳动问题修复总结
|
|
2
|
+
|
|
3
|
+
## 修复时间
|
|
4
|
+
2025-12-04
|
|
5
|
+
|
|
6
|
+
## 修复方案
|
|
7
|
+
采用**方案 1 + 方案 3 组合**:添加焦点状态检查 + 改进延迟 blur 逻辑
|
|
8
|
+
|
|
9
|
+
## 修复内容
|
|
10
|
+
|
|
11
|
+
### 方案 1:添加焦点状态检查
|
|
12
|
+
|
|
13
|
+
#### 1. 添加焦点状态跟踪
|
|
14
|
+
- 新增 `isFocusedRef`:使用 ref 存储 `isFocused` 的最新值,避免在 useEffect 中需要依赖
|
|
15
|
+
- 新增 `lastFocusTimeRef`:记录最后一次 focus 的时间戳
|
|
16
|
+
- 新增 `FOCUS_SWITCH_PROTECTION_PERIOD`:焦点切换保护期(200ms)
|
|
17
|
+
|
|
18
|
+
### 2. 改进 `handleFocus` 逻辑(方案 3)
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
const handleFocus = useCallback((e: any) => {
|
|
22
|
+
// 清除可能存在的 blur 延迟
|
|
23
|
+
if (blurTimeoutRef.current) {
|
|
24
|
+
clearTimeout(blurTimeoutRef.current);
|
|
25
|
+
blurTimeoutRef.current = null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 方案 3:清除所有其他 Input 的重新聚焦标记
|
|
29
|
+
// 当当前 Input 获得焦点时,清除其他 Input 的 shouldRefocusRef,防止焦点跳动
|
|
30
|
+
inputInstancesRef.forEach((ref) => {
|
|
31
|
+
if (ref !== shouldRefocusRef) {
|
|
32
|
+
ref.current = false;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// 清除当前组件的重新聚焦标记,因为当前组件已经获得焦点
|
|
37
|
+
shouldRefocusRef.current = false;
|
|
38
|
+
// 记录 focus 时间戳,用于焦点切换保护期判断
|
|
39
|
+
lastFocusTimeRef.current = Date.now();
|
|
40
|
+
// 更新 ref 和 state
|
|
41
|
+
isFocusedRef.current = true;
|
|
42
|
+
setIsFocused(true);
|
|
43
|
+
onFocus?.(e);
|
|
44
|
+
}, [onFocus]);
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**改进点**(方案 3):
|
|
48
|
+
- **全局实例管理**:使用全局 `inputInstancesRef` Set 存储所有 Input 实例的 `shouldRefocusRef`
|
|
49
|
+
- **主动清除其他 Input 标记**:当当前 Input 获得焦点时,立即清除所有其他 Input 的 `shouldRefocusRef`,防止它们错误地重新聚焦
|
|
50
|
+
- 记录 focus 时间戳,用于后续保护期判断
|
|
51
|
+
- 同步更新 `isFocusedRef` 和 `isFocused` state
|
|
52
|
+
|
|
53
|
+
#### 4. 改进 `handleBlur` 逻辑
|
|
54
|
+
```typescript
|
|
55
|
+
// 在 blur 时同步更新 ref
|
|
56
|
+
isFocusedRef.current = false;
|
|
57
|
+
setIsFocused(false);
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**改进点**:
|
|
61
|
+
- 确保 ref 和 state 同步更新
|
|
62
|
+
|
|
63
|
+
### 方案 3:改进延迟 blur 逻辑
|
|
64
|
+
|
|
65
|
+
#### 1. 全局 Input 实例管理
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
// 方案 3:全局 Input 实例管理器,用于清除其他 Input 的重新聚焦标记
|
|
69
|
+
const inputInstancesRef = new Set<React.MutableRefObject<boolean>>();
|
|
70
|
+
|
|
71
|
+
// 注册当前 Input 实例到全局管理器
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
if (Platform.OS === 'android' && enableBridgelessFix) {
|
|
74
|
+
inputInstancesRef.add(shouldRefocusRef);
|
|
75
|
+
return () => {
|
|
76
|
+
inputInstancesRef.delete(shouldRefocusRef);
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}, [enableBridgelessFix]);
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**作用**:
|
|
83
|
+
- 维护所有 Input 实例的引用,用于在 focus 时清除其他 Input 的重新聚焦标记
|
|
84
|
+
- 组件卸载时自动清理,避免内存泄漏
|
|
85
|
+
|
|
86
|
+
#### 2. 在 `handleFocus` 中清除其他 Input 的标记
|
|
87
|
+
|
|
88
|
+
见上面的 `handleFocus` 逻辑部分。
|
|
89
|
+
|
|
90
|
+
### 方案 1:核心修复 - `keyboardDidShow` 监听器
|
|
91
|
+
|
|
92
|
+
添加了三层检查机制:
|
|
93
|
+
|
|
94
|
+
#### 检查 1:当前组件是否已聚焦
|
|
95
|
+
```typescript
|
|
96
|
+
if (isFocusedRef.current) {
|
|
97
|
+
// 当前组件已经聚焦,清除重新聚焦标记,避免后续误操作
|
|
98
|
+
shouldRefocusRef.current = false;
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
**作用**:如果当前组件已经聚焦,说明键盘是由当前组件触发的,不需要重新聚焦。
|
|
103
|
+
|
|
104
|
+
#### 检查 2:焦点切换保护期
|
|
105
|
+
```typescript
|
|
106
|
+
const timeSinceLastFocus = Date.now() - lastFocusTimeRef.current;
|
|
107
|
+
if (timeSinceLastFocus < FOCUS_SWITCH_PROTECTION_PERIOD) {
|
|
108
|
+
// 在保护期内,说明可能有其他 Input 正在获得焦点,不执行重新聚焦
|
|
109
|
+
shouldRefocusRef.current = false;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
**作用**:如果在 200ms 内有 focus 事件(可能是其他 Input 获得焦点),不执行重新聚焦,避免焦点跳动。
|
|
114
|
+
|
|
115
|
+
#### 检查 3:异步执行时的状态再次检查
|
|
116
|
+
```typescript
|
|
117
|
+
if (shouldRefocusRef.current && !isFocusedRef.current && inputRef.current) {
|
|
118
|
+
// 执行重新聚焦逻辑
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
**作用**:在异步执行时再次检查状态,避免在异步执行期间状态已改变。
|
|
122
|
+
|
|
123
|
+
## 方案组合优势
|
|
124
|
+
|
|
125
|
+
**方案 1 + 方案 3 组合**提供了双重保障机制:
|
|
126
|
+
|
|
127
|
+
1. **方案 3(主动清除)**:在 Input B focus 时立即清除 Input A 的标记,从源头阻止焦点跳动
|
|
128
|
+
2. **方案 1(状态检查)**:即使标记未被清除,也会通过状态检查阻止重新聚焦,作为备用保障
|
|
129
|
+
|
|
130
|
+
这种组合方式确保了:
|
|
131
|
+
- ✅ **更快的响应**:方案 3 在 focus 时立即清除,不需要等待键盘事件
|
|
132
|
+
- ✅ **更强的保障**:方案 1 提供额外的状态检查,即使方案 3 失效也能阻止焦点跳动
|
|
133
|
+
- ✅ **更好的兼容性**:两种机制互补,适应不同的时序场景
|
|
134
|
+
|
|
135
|
+
## 修复原理
|
|
136
|
+
|
|
137
|
+
### 问题根源
|
|
138
|
+
当两个 Input 切换焦点时:
|
|
139
|
+
1. Input A blur → 设置 `shouldRefocusRef.current = true`
|
|
140
|
+
2. Input B focus → 触发键盘显示
|
|
141
|
+
3. 键盘显示 → 所有 Input 的 `keyboardDidShow` 监听器都被触发
|
|
142
|
+
4. Input A 的监听器检测到标记 → 错误地重新聚焦 Input A
|
|
143
|
+
|
|
144
|
+
### 修复机制
|
|
145
|
+
|
|
146
|
+
**方案 1:三层检查机制**
|
|
147
|
+
通过三层检查,确保只有在以下条件**全部满足**时才执行重新聚焦:
|
|
148
|
+
1. ✅ 当前组件**未聚焦**(`!isFocusedRef.current`)
|
|
149
|
+
2. ✅ 不在焦点切换保护期内(最近 200ms 内没有 focus 事件)
|
|
150
|
+
3. ✅ 确实需要重新聚焦(`shouldRefocusRef.current === true`)
|
|
151
|
+
|
|
152
|
+
**方案 3:主动清除机制**
|
|
153
|
+
当 Input B 获得焦点时,立即清除 Input A 的 `shouldRefocusRef`,双重保障:
|
|
154
|
+
1. ✅ Input B focus → 立即清除 Input A 的 `shouldRefocusRef.current = false`
|
|
155
|
+
2. ✅ 即使 Input A 的 `keyboardDidShow` 被触发,也会因为标记已被清除而不执行重新聚焦
|
|
156
|
+
|
|
157
|
+
## 修复效果
|
|
158
|
+
|
|
159
|
+
### 修复前
|
|
160
|
+
```
|
|
161
|
+
Input A blur → Input B focus → 键盘显示 → Input A 错误重新聚焦 → 焦点跳动
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 修复后(方案 1 + 方案 3 组合)
|
|
165
|
+
```
|
|
166
|
+
Input A blur → Input B focus → 立即清除 Input A 的标记 → 键盘显示 → Input A 检测到标记已清除 → 不执行重新聚焦 → 焦点正常切换
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**双重保障**:
|
|
170
|
+
1. **方案 3 主动清除**:Input B focus 时立即清除 Input A 的标记
|
|
171
|
+
2. **方案 1 状态检查**:即使标记未被清除,也会通过状态检查阻止重新聚焦
|
|
172
|
+
|
|
173
|
+
## 测试场景
|
|
174
|
+
|
|
175
|
+
修复后需要测试以下场景:
|
|
176
|
+
|
|
177
|
+
1. ✅ **单个 Input 聚焦**:点击单个 Input,键盘正常显示,无焦点跳动
|
|
178
|
+
2. ✅ **两个 Input 切换**:在 Input A 和 Input B 之间切换,焦点正常切换,无跳动
|
|
179
|
+
3. ✅ **快速连续切换**:快速连续点击多个 Input,焦点正常切换
|
|
180
|
+
4. ✅ **点击外部区域**:点击 Input 外部区域,键盘正常隐藏
|
|
181
|
+
5. ✅ **ScrollView 中的 Input**:在 ScrollView 中的 Input 正常聚焦
|
|
182
|
+
|
|
183
|
+
## 兼容性
|
|
184
|
+
|
|
185
|
+
- ✅ 保持对 RN 0.77 Bridgeless 模式的兼容
|
|
186
|
+
- ✅ 不影响 iOS 平台(仅在 Android 上生效)
|
|
187
|
+
- ✅ 可以通过 `enableBridgelessFix` 禁用修复
|
|
188
|
+
- ✅ 向后兼容,不影响现有功能
|
|
189
|
+
|
|
190
|
+
## 代码变更文件
|
|
191
|
+
|
|
192
|
+
- `components/Input/Input.tsx`
|
|
193
|
+
|
|
194
|
+
## 相关文档
|
|
195
|
+
|
|
196
|
+
- `components/Input/FOCUS_ISSUE_ANALYSIS.md` - 问题分析文档
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
**修复完成** ✅
|
|
201
|
+
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Android Input 组件焦点跳动问题分析
|
|
2
|
+
|
|
3
|
+
## 问题描述
|
|
4
|
+
|
|
5
|
+
在 Android 平台上,当两个 Input 组件切换焦点时,出现焦点来回跳动的问题:
|
|
6
|
+
|
|
7
|
+
1. **第一个 Input** 失去焦点(blur)
|
|
8
|
+
2. **第二个 Input** 获取焦点(focus)
|
|
9
|
+
3. 焦点又**跳回第一个 Input**
|
|
10
|
+
4. 形成来回跳动的循环
|
|
11
|
+
|
|
12
|
+
## 问题场景重现
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
用户操作流程:
|
|
16
|
+
1. 点击 Input A → Input A 获得焦点
|
|
17
|
+
2. 点击 Input B → Input A 触发 blur,Input B 触发 focus
|
|
18
|
+
3. 键盘显示 → 触发 keyboardDidShow 事件
|
|
19
|
+
4. ❌ Input A 的 keyboardDidShow 监听器被触发
|
|
20
|
+
5. ❌ Input A 检测到 shouldRefocusRef.current === true
|
|
21
|
+
6. ❌ Input A 自动重新聚焦
|
|
22
|
+
7. ❌ 焦点从 Input B 跳回 Input A
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 根本原因分析
|
|
26
|
+
|
|
27
|
+
### 1. 全局键盘事件监听器冲突
|
|
28
|
+
|
|
29
|
+
**问题代码位置**:`components/Input/Input.tsx:140-188`
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
const keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', () => {
|
|
33
|
+
if (shouldRefocusRef.current) {
|
|
34
|
+
// 尝试重新聚焦
|
|
35
|
+
inputRef.current.focus();
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**问题分析**:
|
|
41
|
+
- `keyboardDidShow` 是**全局事件**,所有 Input 组件实例都会收到
|
|
42
|
+
- 当第二个 Input 获得焦点并触发键盘显示时,**第一个 Input 的监听器也会被触发**
|
|
43
|
+
- 第一个 Input 检测到 `shouldRefocusRef.current === true`(在 blur 时设置的),就会尝试重新聚焦
|
|
44
|
+
- 这导致焦点被错误地抢回第一个 Input
|
|
45
|
+
|
|
46
|
+
### 2. 缺少焦点状态检查
|
|
47
|
+
|
|
48
|
+
**问题代码位置**:`components/Input/Input.tsx:143-187`
|
|
49
|
+
|
|
50
|
+
当前逻辑只检查 `shouldRefocusRef.current`,但没有检查:
|
|
51
|
+
- 当前是否有其他 Input 已经获得焦点
|
|
52
|
+
- 当前组件是否真的需要重新聚焦
|
|
53
|
+
- 是否正在切换焦点到其他 Input
|
|
54
|
+
|
|
55
|
+
### 3. 延迟 blur 与键盘事件的时序问题
|
|
56
|
+
|
|
57
|
+
**问题代码位置**:`components/Input/Input.tsx:90-123`
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
const handleBlur = useCallback((e: any) => {
|
|
61
|
+
if (Platform.OS === 'android' && enableBridgelessFix) {
|
|
62
|
+
shouldRefocusRef.current = true; // ⚠️ 问题:立即设置标记
|
|
63
|
+
blurTimeoutRef.current = setTimeout(() => {
|
|
64
|
+
// 延迟 500-800ms 后才真正执行 blur
|
|
65
|
+
}, delay);
|
|
66
|
+
}
|
|
67
|
+
}, [onBlur, enableBridgelessFix]);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**时序问题**:
|
|
71
|
+
1. Input A blur → 设置 `shouldRefocusRef.current = true`
|
|
72
|
+
2. Input B focus → 触发键盘显示
|
|
73
|
+
3. 键盘显示 → 触发 `keyboardDidShow`(所有 Input 都收到)
|
|
74
|
+
4. Input A 的监听器检测到标记 → 重新聚焦 Input A
|
|
75
|
+
5. 此时 Input B 刚获得焦点,就被 Input A 抢走了
|
|
76
|
+
|
|
77
|
+
### 4. 缺少组件实例标识
|
|
78
|
+
|
|
79
|
+
当前实现中,每个 Input 组件实例都是独立的,但它们共享同一个全局键盘事件。当多个 Input 同时存在时,无法区分:
|
|
80
|
+
- 哪个 Input 应该响应键盘事件
|
|
81
|
+
- 哪个 Input 正在失去焦点
|
|
82
|
+
- 哪个 Input 正在获得焦点
|
|
83
|
+
|
|
84
|
+
## 问题流程图
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
88
|
+
│ 用户点击 Input B(Input A 当前有焦点) │
|
|
89
|
+
└─────────────────────────────────────────────────────────────┘
|
|
90
|
+
│
|
|
91
|
+
▼
|
|
92
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
93
|
+
│ 1. Input A 触发 handleBlur │
|
|
94
|
+
│ - shouldRefocusRef.current = true │
|
|
95
|
+
│ - 设置延迟 blur(500-800ms) │
|
|
96
|
+
└─────────────────────────────────────────────────────────────┘
|
|
97
|
+
│
|
|
98
|
+
▼
|
|
99
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
100
|
+
│ 2. Input B 触发 handleFocus │
|
|
101
|
+
│ - 清除 Input B 的 blurTimeout │
|
|
102
|
+
│ - setIsFocused(true) │
|
|
103
|
+
└─────────────────────────────────────────────────────────────┘
|
|
104
|
+
│
|
|
105
|
+
▼
|
|
106
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
107
|
+
│ 3. 键盘显示 → 触发全局 keyboardDidShow 事件 │
|
|
108
|
+
│ - 所有 Input 组件的监听器都被触发 │
|
|
109
|
+
└─────────────────────────────────────────────────────────────┘
|
|
110
|
+
│
|
|
111
|
+
▼
|
|
112
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
113
|
+
│ 4. Input A 的 keyboardDidShow 监听器执行 │
|
|
114
|
+
│ - 检测到 shouldRefocusRef.current === true │
|
|
115
|
+
│ - ❌ 错误地重新聚焦 Input A │
|
|
116
|
+
└─────────────────────────────────────────────────────────────┘
|
|
117
|
+
│
|
|
118
|
+
▼
|
|
119
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
120
|
+
│ 5. 焦点从 Input B 跳回 Input A │
|
|
121
|
+
│ - 形成焦点跳动问题 │
|
|
122
|
+
└─────────────────────────────────────────────────────────────┘
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## 解决方案设计
|
|
126
|
+
|
|
127
|
+
### 方案 1:添加焦点状态检查(推荐)
|
|
128
|
+
|
|
129
|
+
**核心思路**:在 `keyboardDidShow` 监听器中,检查当前组件是否真的需要重新聚焦。
|
|
130
|
+
|
|
131
|
+
**实现要点**:
|
|
132
|
+
1. 检查 `isFocused` 状态,如果已经是聚焦状态,不执行重新聚焦
|
|
133
|
+
2. 检查是否有其他 Input 正在获得焦点(通过事件时间戳判断)
|
|
134
|
+
3. 添加短暂的"焦点切换保护期",在保护期内不执行重新聚焦
|
|
135
|
+
|
|
136
|
+
### 方案 2:使用全局焦点管理器
|
|
137
|
+
|
|
138
|
+
**核心思路**:创建一个全局的焦点管理器,统一管理所有 Input 的焦点状态。
|
|
139
|
+
|
|
140
|
+
**实现要点**:
|
|
141
|
+
1. 创建一个全局的焦点管理器 Context
|
|
142
|
+
2. 记录当前聚焦的 Input 实例 ID
|
|
143
|
+
3. 只有当前聚焦的 Input 才能响应键盘事件
|
|
144
|
+
|
|
145
|
+
### 方案 3:改进延迟 blur 逻辑
|
|
146
|
+
|
|
147
|
+
**核心思路**:在 blur 时,如果检测到有新的 focus 事件,立即取消重新聚焦标记。
|
|
148
|
+
|
|
149
|
+
**实现要点**:
|
|
150
|
+
1. 在 `handleFocus` 中,清除所有其他 Input 的 `shouldRefocusRef` 标记
|
|
151
|
+
2. 使用全局事件或 Context 来通知其他 Input 组件
|
|
152
|
+
|
|
153
|
+
## 推荐方案:方案 1 + 方案 3 组合
|
|
154
|
+
|
|
155
|
+
结合两种方案的优点:
|
|
156
|
+
1. **在 `handleFocus` 中清除其他 Input 的重新聚焦标记**
|
|
157
|
+
2. **在 `keyboardDidShow` 中检查 `isFocused` 状态**
|
|
158
|
+
3. **添加焦点切换保护期**
|
|
159
|
+
|
|
160
|
+
## 修复要点
|
|
161
|
+
|
|
162
|
+
1. ✅ 在 `handleFocus` 中,通过全局机制清除其他 Input 的 `shouldRefocusRef`
|
|
163
|
+
2. ✅ 在 `keyboardDidShow` 中,检查 `isFocused` 状态,如果已聚焦则不执行
|
|
164
|
+
3. ✅ 添加焦点切换保护期(例如 200ms),在保护期内不执行重新聚焦
|
|
165
|
+
4. ✅ 改进事件时序处理,确保 blur 和 focus 事件正确处理
|
|
166
|
+
|
|
167
|
+
## 测试场景
|
|
168
|
+
|
|
169
|
+
修复后需要测试以下场景:
|
|
170
|
+
|
|
171
|
+
1. ✅ 单个 Input 点击后键盘正常显示
|
|
172
|
+
2. ✅ 两个 Input 之间正常切换焦点
|
|
173
|
+
3. ✅ 快速连续切换多个 Input
|
|
174
|
+
4. ✅ 点击 Input 外部区域,键盘正常隐藏
|
|
175
|
+
5. ✅ 在 ScrollView 中的 Input 正常聚焦
|
|
176
|
+
|
|
177
|
+
## 风险评估
|
|
178
|
+
|
|
179
|
+
- **低风险**:方案 1 和方案 3 都是对现有逻辑的改进,不会破坏现有功能
|
|
180
|
+
- **兼容性**:修复后仍然保持对 RN 0.77 Bridgeless 模式的兼容
|
|
181
|
+
- **性能影响**:几乎无影响,只是添加了状态检查
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
**分析完成时间**:2025-12-04
|
|
186
|
+
**问题优先级**:高
|
|
187
|
+
**建议修复方案**:方案 1 + 方案 3 组合
|
|
188
|
+
|
package/module/Input/Input.js
CHANGED
|
@@ -4,7 +4,11 @@ import React, { useState, useCallback, useMemo, useRef, useEffect } from "react"
|
|
|
4
4
|
import { View, Text, Platform, Keyboard } from "react-native";
|
|
5
5
|
import { withTheme, Input, makeStyles } from "@rneui/themed";
|
|
6
6
|
import { isBridgelessMode } from "../common/bridgelessUtils";
|
|
7
|
+
|
|
8
|
+
// 方案 3:全局 Input 实例管理器,用于清除其他 Input 的重新聚焦标记
|
|
9
|
+
// 存储所有 Input 实例的 shouldRefocusRef,用于在 focus 时清除其他 Input 的标记
|
|
7
10
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
11
|
+
const inputInstancesRef = new Set();
|
|
8
12
|
const useStyles = makeStyles((theme, ...props) => {
|
|
9
13
|
const {
|
|
10
14
|
labelBg,
|
|
@@ -65,13 +69,33 @@ export const TapasInput = ({
|
|
|
65
69
|
const keyboardHideListenerRef = useRef(null);
|
|
66
70
|
const shouldRefocusRef = useRef(false);
|
|
67
71
|
const isBridgeless = useRef(isBridgelessMode());
|
|
72
|
+
// 使用 ref 存储 isFocused 的最新值,避免在 useEffect 中需要依赖
|
|
73
|
+
const isFocusedRef = useRef(false);
|
|
74
|
+
// 记录最后一次 focus 的时间戳,用于焦点切换保护期
|
|
75
|
+
const lastFocusTimeRef = useRef(0);
|
|
76
|
+
// 焦点切换保护期(ms),在此时间内不执行重新聚焦,避免焦点跳动
|
|
77
|
+
const FOCUS_SWITCH_PROTECTION_PERIOD = 200;
|
|
68
78
|
const handleFocus = useCallback(e => {
|
|
69
79
|
// 清除可能存在的 blur 延迟
|
|
70
80
|
if (blurTimeoutRef.current) {
|
|
71
81
|
clearTimeout(blurTimeoutRef.current);
|
|
72
82
|
blurTimeoutRef.current = null;
|
|
73
83
|
}
|
|
84
|
+
|
|
85
|
+
// 方案 3:清除所有其他 Input 的重新聚焦标记
|
|
86
|
+
// 当当前 Input 获得焦点时,清除其他 Input 的 shouldRefocusRef,防止焦点跳动
|
|
87
|
+
inputInstancesRef.forEach(ref => {
|
|
88
|
+
if (ref !== shouldRefocusRef) {
|
|
89
|
+
ref.current = false;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// 清除当前组件的重新聚焦标记,因为当前组件已经获得焦点
|
|
74
94
|
shouldRefocusRef.current = false;
|
|
95
|
+
// 记录 focus 时间戳,用于焦点切换保护期判断
|
|
96
|
+
lastFocusTimeRef.current = Date.now();
|
|
97
|
+
// 更新 ref 和 state
|
|
98
|
+
isFocusedRef.current = true;
|
|
75
99
|
setIsFocused(true);
|
|
76
100
|
onFocus?.(e);
|
|
77
101
|
}, [onFocus]);
|
|
@@ -98,12 +122,16 @@ export const TapasInput = ({
|
|
|
98
122
|
blurTimeoutRef.current = null;
|
|
99
123
|
return;
|
|
100
124
|
}
|
|
125
|
+
|
|
126
|
+
// 更新 ref 和 state
|
|
127
|
+
isFocusedRef.current = false;
|
|
101
128
|
setIsFocused(false);
|
|
102
129
|
onBlur?.(e);
|
|
103
130
|
shouldRefocusRef.current = false;
|
|
104
131
|
blurTimeoutRef.current = null;
|
|
105
132
|
}, delay);
|
|
106
133
|
} else {
|
|
134
|
+
isFocusedRef.current = false;
|
|
107
135
|
setIsFocused(false);
|
|
108
136
|
onBlur?.(e);
|
|
109
137
|
}
|
|
@@ -115,6 +143,17 @@ export const TapasInput = ({
|
|
|
115
143
|
borderBottomWidth: 0
|
|
116
144
|
}, props.inputContainerStyle], [props.inputContainerStyle]);
|
|
117
145
|
|
|
146
|
+
// 方案 3:注册当前 Input 实例到全局管理器
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
if (Platform.OS === 'android' && enableBridgelessFix) {
|
|
149
|
+
inputInstancesRef.add(shouldRefocusRef);
|
|
150
|
+
return () => {
|
|
151
|
+
inputInstancesRef.delete(shouldRefocusRef);
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
return undefined;
|
|
155
|
+
}, [enableBridgelessFix]);
|
|
156
|
+
|
|
118
157
|
// Android 键盘监听:当键盘显示时,如果输入框失焦,尝试重新聚焦
|
|
119
158
|
// 这是针对 RN 0.77 Bridgeless 模式的兼容性修复
|
|
120
159
|
useEffect(() => {
|
|
@@ -124,11 +163,31 @@ export const TapasInput = ({
|
|
|
124
163
|
const keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', () => {
|
|
125
164
|
// 键盘显示时,如果应该重新聚焦且输入框失焦,则尝试重新聚焦
|
|
126
165
|
// React Native 0.77 可能需要多次尝试才能成功聚焦
|
|
166
|
+
|
|
167
|
+
// 方案 1 修复:添加焦点状态检查,防止焦点跳动
|
|
168
|
+
// 1. 如果当前组件已经聚焦,不需要重新聚焦(可能是其他 Input 触发的键盘显示)
|
|
169
|
+
if (isFocusedRef.current) {
|
|
170
|
+
// 当前组件已经聚焦,清除重新聚焦标记,避免后续误操作
|
|
171
|
+
shouldRefocusRef.current = false;
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// 2. 检查是否在焦点切换保护期内
|
|
176
|
+
// 如果最近有 focus 事件(可能是其他 Input 获得焦点),不执行重新聚焦
|
|
177
|
+
const timeSinceLastFocus = Date.now() - lastFocusTimeRef.current;
|
|
178
|
+
if (timeSinceLastFocus < FOCUS_SWITCH_PROTECTION_PERIOD) {
|
|
179
|
+
// 在保护期内,说明可能有其他 Input 正在获得焦点,不执行重新聚焦
|
|
180
|
+
shouldRefocusRef.current = false;
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// 3. 只有在确实需要重新聚焦且不在保护期内时才执行
|
|
127
185
|
if (shouldRefocusRef.current) {
|
|
128
186
|
// 使用双重 requestAnimationFrame 确保在渲染完成后执行(RN 0.77 新架构可能需要)
|
|
129
187
|
requestAnimationFrame(() => {
|
|
130
188
|
requestAnimationFrame(() => {
|
|
131
|
-
|
|
189
|
+
// 再次检查状态,避免在异步执行期间状态已改变
|
|
190
|
+
if (shouldRefocusRef.current && !isFocusedRef.current && inputRef.current) {
|
|
132
191
|
// 尝试通过 inputRef 重新聚焦
|
|
133
192
|
// @rneui/themed 的 Input 组件可能支持 inputRef prop
|
|
134
193
|
try {
|
|
@@ -147,7 +206,7 @@ export const TapasInput = ({
|
|
|
147
206
|
} else {
|
|
148
207
|
// 如果无法直接聚焦,尝试延迟后再次聚焦(RN 0.77 可能需要)
|
|
149
208
|
setTimeout(() => {
|
|
150
|
-
if (shouldRefocusRef.current && inputRef.current) {
|
|
209
|
+
if (shouldRefocusRef.current && !isFocusedRef.current && inputRef.current) {
|
|
151
210
|
try {
|
|
152
211
|
if (inputRef.current.focus) {
|
|
153
212
|
inputRef.current.focus();
|
|
@@ -188,7 +247,8 @@ export const TapasInput = ({
|
|
|
188
247
|
blurTimeoutRef.current = null;
|
|
189
248
|
}
|
|
190
249
|
};
|
|
191
|
-
}, []);
|
|
250
|
+
}, []); // 使用 ref 访问最新状态,不需要添加依赖
|
|
251
|
+
|
|
192
252
|
return /*#__PURE__*/_jsx(View, {
|
|
193
253
|
style: {
|
|
194
254
|
flex: 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useState","useCallback","useMemo","useRef","useEffect","View","Text","Platform","Keyboard","withTheme","Input","makeStyles","isBridgelessMode","jsx","_jsx","jsxs","_jsxs","useStyles","theme","props","labelBg","labelColor","inputBase","minWidth","minHeight","paddingHorizontal","paddingVertical","input","fontFamily","fonts","fontSize","sizeM","fontWeight","weightR","color","colors","colorTextPrimary","borderRadius","radius","rounded","borderWidth","borderColor","colorBorder1","paddingLeft","paddingRight","labelContext","sizeS","backgroundColor","white","overflow","position","display","flexDirection","zIndex","left","top","require","colorTextError","TapasInput","labelPosition","onBlur","onFocus","value","propValue","enableBridgelessFix","styles","isFocused","setIsFocused","inputRef","blurTimeoutRef","keyboardShowListenerRef","keyboardHideListenerRef","shouldRefocusRef","isBridgeless","handleFocus","e","current","clearTimeout","handleBlur","OS","delay","setTimeout","shouldShowLabel","defaultShowLabel","containerStyleMemo","containerStyle","inputStyleMemo","inputStyle","inputContainerStyleMemo","borderBottomWidth","inputContainerStyle","keyboardDidShowListener","addListener","requestAnimationFrame","focus","_input","err","error","keyboardDidHideListener","remove","style","flex","onStartShouldSetResponder","onResponderTerminationRequest","pointerEvents","children","blurOnSubmit","label","required"],"sourceRoot":"../../../components","sources":["Input/Input.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAOC,QAAQ,EAAEC,WAAW,EAAEC,OAAO,EAAEC,MAAM,EAAEC,SAAS,QAAO,OAAO;AAClF,SAAQC,IAAI,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,QAAQ,QAAO,cAAc;AAC3D,SAAQC,SAAS,EAAEC,KAAK,EAAcC,UAAU,QAAO,eAAe;AAEtE,SAASC,gBAAgB,QAAQ,2BAA2B;
|
|
1
|
+
{"version":3,"names":["React","useState","useCallback","useMemo","useRef","useEffect","View","Text","Platform","Keyboard","withTheme","Input","makeStyles","isBridgelessMode","jsx","_jsx","jsxs","_jsxs","inputInstancesRef","Set","useStyles","theme","props","labelBg","labelColor","inputBase","minWidth","minHeight","paddingHorizontal","paddingVertical","input","fontFamily","fonts","fontSize","sizeM","fontWeight","weightR","color","colors","colorTextPrimary","borderRadius","radius","rounded","borderWidth","borderColor","colorBorder1","paddingLeft","paddingRight","labelContext","sizeS","backgroundColor","white","overflow","position","display","flexDirection","zIndex","left","top","require","colorTextError","TapasInput","labelPosition","onBlur","onFocus","value","propValue","enableBridgelessFix","styles","isFocused","setIsFocused","inputRef","blurTimeoutRef","keyboardShowListenerRef","keyboardHideListenerRef","shouldRefocusRef","isBridgeless","isFocusedRef","lastFocusTimeRef","FOCUS_SWITCH_PROTECTION_PERIOD","handleFocus","e","current","clearTimeout","forEach","ref","Date","now","handleBlur","OS","delay","setTimeout","shouldShowLabel","defaultShowLabel","containerStyleMemo","containerStyle","inputStyleMemo","inputStyle","inputContainerStyleMemo","borderBottomWidth","inputContainerStyle","add","delete","undefined","keyboardDidShowListener","addListener","timeSinceLastFocus","requestAnimationFrame","focus","_input","err","error","keyboardDidHideListener","remove","style","flex","onStartShouldSetResponder","onResponderTerminationRequest","pointerEvents","children","blurOnSubmit","label","required"],"sourceRoot":"../../../components","sources":["Input/Input.tsx"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../components/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAC,EAAE,EAAoD,MAAM,OAAO,CAAC;AAEnF,OAAO,EAAmB,UAAU,EAAa,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../components/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAC,EAAE,EAAoD,MAAM,OAAO,CAAC;AAEnF,OAAO,EAAmB,UAAU,EAAa,MAAM,eAAe,CAAC;AAiDvE,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAqO1C,CAAC;;AAEF,wBAAqC"}
|