Tencent / QMUI_iOS

QMUI iOS——致力于提高项目 UI 开发效率的解决方案
http://qmuiteam.com/ios
Other
7.05k stars 1.37k forks source link

4.7.0 Flutter工程调试有Assert崩溃 #1536

Closed yoferzhang closed 5 months ago

yoferzhang commented 6 months ago

Bug 表现 XCode15,调试,激活文本框时,会命中QMUI的Assert

截图 Thread 1: "register theme color fails, FlutterSecureTextInputView does not have method called attributedText"

image image

如何重现 如上所示

预期的表现 不会遇到Assert卡住

其他信息

yoferzhang commented 6 months ago

如需其他信息,可以同样英文名司内企微联系

youjone commented 6 months ago

我也遇到这个问题,我是密码输入框有这个问题,普通输入框没有,你解决了吗?

MoLice commented 5 months ago

根据 flutter 源码 FlutterTextInputPlugin.mm#L749-L776FlutterSecureTextInputView 继承自 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 的方法,里面什么都不用做,就可以避开这种问题。