Closed yoferzhang closed 10 months ago
如需其他信息,可以同样英文名司内企微联系
我也遇到这个问题,我是密码输入框有这个问题,普通输入框没有,你解决了吗?
根据 flutter 源码 FlutterTextInputPlugin.mm#L749-L776,FlutterSecureTextInputView
继承自 FlutterTextInputView
,而 FlutterTextInputView
继承自 UIView
,所以本质上 FlutterSecureTextInputView
是一个普通 view,并非输入框。
然后 flutter 为了让 FlutterSecureTextInputView
以输入框的身份存在,它重写了 isKindOfClass:
,在里面对 UITextField
返回 YES
,于是在 FlutterSecureTextInputView
初始化的时候,会走进去 QMUITheme 这个 if 判断里,QMUIThemePrivate.m#L150 ,然后试图为它注册一个任意 UITextField
都拥有的方法 attributedText
。
但由于 FlutterSecureTextInputView
是假的 UITextField
,且它伪装的手段也没写完整(应该重写 respondsToSelector:
),所以就导致命中 assert。
综上所述,结论是这属于 flutter 的 bug,你们可以提 issue 给他们,QMUI 后续版本也不会为其写任何兼容代码。
在此之前,也可以在业务项目里通过 runtime 给 FlutterSecureTextInputView
动态添加一个叫 attributedText 的方法,里面什么都不用做,就可以避开这种问题。
根据 flutter 源码 FlutterTextInputPlugin.mm#L749-L776,
FlutterSecureTextInputView
继承自FlutterTextInputView
,而FlutterTextInputView
继承自UIView
,所以本质上FlutterSecureTextInputView
是一个普通 view,并非输入框。然后 flutter 为了让
FlutterSecureTextInputView
以输入框的身份存在,它重写了isKindOfClass:
,在里面对UITextField
返回YES
,于是在FlutterSecureTextInputView
初始化的时候,会走进去 QMUITheme 这个 if 判断里,QMUIThemePrivate.m#L150 ,然后试图为它注册一个任意UITextField
都拥有的方法attributedText
。但由于
FlutterSecureTextInputView
是假的UITextField
,且它伪装的手段也没写完整(应该重写respondsToSelector:
),所以就导致命中 assert。综上所述,结论是这属于 flutter 的 bug,你们可以提 issue 给他们,QMUI 后续版本也不会为其写任何兼容代码。
在此之前,也可以在业务项目里通过 runtime 给
FlutterSecureTextInputView
动态添加一个叫 attributedText 的方法,里面什么都不用做,就可以避开这种问题。
在两方都不愿意修改的情况下,也可以通过QMUIThemePrivate.m#L150,把这个代码注释掉来解决
Bug 表现 XCode15,调试,激活文本框时,会命中QMUI的Assert
截图 Thread 1: "register theme color fails, FlutterSecureTextInputView does not have method called attributedText"
如何重现 如上所示
预期的表现 不会遇到Assert卡住
其他信息