Flutter iOS端webview_flutter无法识别外接蓝牙硬件键盘问题求助
问题1:获取BinaryMessenger创建FlutterMethodChannel的方案
你遇到的强转报错是因为根视图控制器已经被替换为UINavigationController,原FlutterViewController是该导航控制器的子视图控制器,需要先从导航控制器的视图栈中取出对应实例,再获取BinaryMessenger即可,参考代码如下:
// 先取出根视图的导航控制器 guard let navController = window?.rootViewController as? UINavigationController else { return } // 从导航控制器的视图栈中获取FlutterViewController实例 guard let flutterVC = navController.viewControllers.first as? FlutterViewController else { return } // 拿到所需的BinaryMessenger let binaryMessenger = flutterVC.binaryMessenger // 后续可直接用该实例创建FlutterMethodChannel
该方法无需额外实例化新的FlutterViewController,复用现有实例即可实现需求。
问题2:WebView蓝牙键盘适配及替代实现方案
iOS端WebView无法识别蓝牙键盘是WKWebView嵌套在UiKitView中的已知兼容性问题,和权限无关,你可以优先尝试现有库的修复方案,无需更换第三方包:
- 升级webview_flutter到3.0.0及以上版本,官方已在该版本修复了iOS端硬件键盘输入无响应的问题,升级后只需在WebView配置中开启
allowsInlineMediaPlayback,同时在Info.plist中将UIRequiresFullScreen设为NO即可完成适配 - 若无法升级依赖,可在iOS原生层自定义WebViewController,重写第一响应者相关方法强制WebView接收键盘输入:
override var canBecomeFirstResponder: Bool { return true } override func becomeFirstResponder() -> Bool { return true }
如果需要完全避开UiKitView的适配问题,可以采用系统原生SafariViewController实现Web页面打开,通过url_launcher库唤起内置Safari页面,用户交互完成后通过通用链接跳转回应用获取对应数据,该方案完全不依赖UiKitView,不会出现蓝牙键盘适配问题。
内容的提问来源于stack exchange,提问作者J. Sarabia
相关产品推荐
相关产品推荐

