Tencent / QMUI_iOS

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

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

Closed yoferzhang closed 10 months ago

yoferzhang commented 11 months ago

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

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

image image

如何重现 如上所示

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

其他信息

yoferzhang commented 11 months ago

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

youjone commented 10 months ago

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

MoLice commented 10 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 的方法,里面什么都不用做,就可以避开这种问题。

codeguesser commented 3 weeks 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 的方法,里面什么都不用做,就可以避开这种问题。

在两方都不愿意修改的情况下,也可以通过QMUIThemePrivate.m#L150,把这个代码注释掉来解决