-
Notifications
You must be signed in to change notification settings - Fork 57
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
多实例支持 #40
base: main
Are you sure you want to change the base?
多实例支持 #40
Conversation
感谢贡献!最近我会抽时间review下代码,完善下macos的实现。 键盘输入确实是一个难点,目前看flutter中的api没有暴露出足够api用来实现ime支持,当前的实现仅输入英文字母也是存在bug。IME这块是本项目能否正常使用的关键点,如果有思路希望踊跃提出,感谢! |
Hi @Doflatango , I cloned your repo, and the example/ app does not seem to compile. It throws an error initially:
Which I was able to fix by changing
to:
But then when I compile it again, I get this:
Am I doing something wrong? Am I missing something? |
Hi @BullsEye34, sorry, these changes does not support MacOS yet. |
hello,目前我这边IME support 的需求是比较强的,看了下您的fork,最近好像有重新针对IME这块做处理,找了一圈没找到您的联系方式,能不能聊下最新的方案是怎么考虑的。我这两天应该会介入这块的处理并且尝试在MacOS上同步完善 |
@SinyimZhi 主要是监听输入法开始事件,然后把键盘事件交给 Flutter engine 处理, 此时 dart 那边配合
输入法 C++ 部分的代码逻辑,macOS 与 Windows 会有些差别,所以我分开写了,但是仅实现了 Windows 的(https://github.com/Doflatango/webview_cef/blob/a/windows/webview_cef_plugin.cpp 搜索 ime 可以看到就那几个 method call 的逻辑) |
十分感谢 我先研究下 |
个人觉着没必要用flutter处理,应该是cef直接监听imm32 我找到了一个类似的c#的处理 不知道能不能给您一点启发 |
ref: flutter engine中的实现:https://github.com/flutter/engine/blob/a74d9d1f4776ccaf371cc60638db8719ad730fbe/shell/platform/windows/text_input_manager.cc#L17 |
另,macos中,如果自己注册了text input client,flutter engine中的输入法处理可能会失效:https://github.com/flutter/engine/blob/a74d9d1f4776ccaf371cc60638db8719ad730fbe/shell/platform/darwin/macos/framework/Source/FlutterTextInputPlugin.mm#L341 |
输入法只能给 Flutter engine 管理,再由框架分发给对应 input client,如果插件也要直接接手输入法,会和 Flutter engine 打架,表现为输入法位置跳来跳去,内容会输入到错误的 widget 去,这个是后来为什么要重写输入功能的原因。 |
@Doflatango @hlwhl @welnstar 关于ime support,综合以上各位的意见,经过试验,在windows平台下如果在cef初始化时,通过processKeyEventForCEF函数给cef注册键盘事件,使用输入法会同时激活flutter engine 和 cef对imm32的监听,确实会导致冲突。由于我的团队更高优需求在linux support上,我接下来会优先介入linux support,ime_support会利用空余时间处理。在我的fork上的ime_support分支我做了一些相应的处理,主要方案是:
|
对原有的代码结构做了一些调整,以适应多实例,调整后的结构如下:
调整一
对于每一个 WebView 实例,包含:
CefBrowser
实例WebviewHandler
实例WebViewController
实例MethodChannel
用于双向的方法调用,一个EventChannel
用于 c++ 推送各种CefBrowser
事件到 Dart,原来的一个 MethodChannel 作为插件级别 MethodChannel 使用,不与上面的混淆这些应该都是平台无关的,以后添加大部分 CefBrowser 相关的功能时,应该实现一次就可以了。
调整二
平台相关的,比如纹理处理独立出来(
TextureHandler
)仍然放在平台目录下目前的问题:
最后,非常感谢这个项目,这个插件完善之后,可能是未来很长一段时间里 Flutter Windows 能唯一稳定使用的 WebView 插件了。