fireOS 上的 Flutter 文本字段 firetv/firestick 在文本字段之上
Flutter textfield on fireOS firetv/firestick on top of textfield
当在 fire 电视设备的 fireOS 中调用 flutter 上的文本字段时,为了进行搜索,例如 fireOS 虚拟键盘弹出在文本字段的顶部,并且不像其他 android 键盘打开的设备那样工作底部和文本字段可见。
例如,在 android 旧版上,我可以使用 edittext 小部件,相同的键盘会在顶部弹出,但无论我用控制器键入什么,都会在虚拟键盘本身上更新,因为键盘有自己的文本字段或 edittext。所以我的问题是如何用 flutter 更新 firetv 虚拟键盘上的 edittext。
好的,所以我没有在任何地方找到答案,所以我不得不在这里做一些 hacky 的东西,因为 flutter 是行不通的。
解决方案概述:
1.- 所以首先检查你是 运行 on Android,你可以用 if (Platform.isAndroid) on flutter 来做到这一点。
2.- 如果你实际上是 运行 在 android 上,你可以打开一个平台渠道到本地 android 来检查实际制造商(我会 post如何在下面编码)。
3.- 检查 "Amazon" 或 "Kindle" 或任何 if(string.contains("")) 的制造商或设备名称。
4.- 再次打开到 Native Android 的平台通道并打开带有 Edittext 的警告对话框,捕获生成的字符串并 return 使其颤动。
这就是我如何让 firetv 的键盘在 flutter 下工作。
if (Platform.isAndroid){
checkOs().then((String osName){
print("Device running on: $osName");
if(osName.contains("Amazon") || osName.contains("AFTN")){
fireTvKeyboardInput().then((String result){
buscarTitulo(result);
});
}else{
_showDialog(); // Keyboard for NON FIREOS devices on Android.
}
});
}else{
//IF Device is not Android Eg. IOS
_showDialog();
}
现在我使用了两个函数 "checkOs" 和 "fireTvKeyboardInput" 这是代码:
Future<String> checkOs() async {
String myResult = "";
try {
myResult = await platform.invokeMethod("checkOS", <String, dynamic>{
'param1': "hello",
});
}catch (e){
print ("exception: $e");
}
return myResult;
}
Future<String> fireTvKeyboardInput() async {
String myResult = "";
try {
myResult = await platform.invokeMethod("fireKeyBoard", <String, dynamic>{
'param1': "hello",
});
}catch (e){
print ("exception: $e");
}
return myResult;
}
原生 Android 代码如下:
if(call.method == "checkOS"){
val operatingSystem = android.os.Build.MANUFACTURER + "- " + android.os.Build.MODEL
result.success(operatingSystem)
}
if(call.method == "fireKeyBoard"){
val alert = AlertDialog.Builder(this)
alert.setMessage("Search")
// Set an EditText view to get user input
val input = EditText(this)
input.hint = "Enter Text"
input.inputType = InputType.TYPE_CLASS_TEXT
alert.setView(input)
input.setOnKeyListener { view, keyCode, keyEvent ->
if (keyCode == 66) {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(input.windowToken, 0)
}
false
}
alert.setPositiveButton("Ok") { dialog, whichButton ->
result.success(input.text.toString());
}
alert.setNegativeButton("Cancel") { dialog, whichButton ->
// Canceled.
}
alert.show()
}
当在 fire 电视设备的 fireOS 中调用 flutter 上的文本字段时,为了进行搜索,例如 fireOS 虚拟键盘弹出在文本字段的顶部,并且不像其他 android 键盘打开的设备那样工作底部和文本字段可见。
例如,在 android 旧版上,我可以使用 edittext 小部件,相同的键盘会在顶部弹出,但无论我用控制器键入什么,都会在虚拟键盘本身上更新,因为键盘有自己的文本字段或 edittext。所以我的问题是如何用 flutter 更新 firetv 虚拟键盘上的 edittext。
好的,所以我没有在任何地方找到答案,所以我不得不在这里做一些 hacky 的东西,因为 flutter 是行不通的。
解决方案概述:
1.- 所以首先检查你是 运行 on Android,你可以用 if (Platform.isAndroid) on flutter 来做到这一点。
2.- 如果你实际上是 运行 在 android 上,你可以打开一个平台渠道到本地 android 来检查实际制造商(我会 post如何在下面编码)。
3.- 检查 "Amazon" 或 "Kindle" 或任何 if(string.contains("")) 的制造商或设备名称。
4.- 再次打开到 Native Android 的平台通道并打开带有 Edittext 的警告对话框,捕获生成的字符串并 return 使其颤动。
这就是我如何让 firetv 的键盘在 flutter 下工作。
if (Platform.isAndroid){
checkOs().then((String osName){
print("Device running on: $osName");
if(osName.contains("Amazon") || osName.contains("AFTN")){
fireTvKeyboardInput().then((String result){
buscarTitulo(result);
});
}else{
_showDialog(); // Keyboard for NON FIREOS devices on Android.
}
});
}else{
//IF Device is not Android Eg. IOS
_showDialog();
}
现在我使用了两个函数 "checkOs" 和 "fireTvKeyboardInput" 这是代码:
Future<String> checkOs() async {
String myResult = "";
try {
myResult = await platform.invokeMethod("checkOS", <String, dynamic>{
'param1': "hello",
});
}catch (e){
print ("exception: $e");
}
return myResult;
}
Future<String> fireTvKeyboardInput() async {
String myResult = "";
try {
myResult = await platform.invokeMethod("fireKeyBoard", <String, dynamic>{
'param1': "hello",
});
}catch (e){
print ("exception: $e");
}
return myResult;
}
原生 Android 代码如下:
if(call.method == "checkOS"){
val operatingSystem = android.os.Build.MANUFACTURER + "- " + android.os.Build.MODEL
result.success(operatingSystem)
}
if(call.method == "fireKeyBoard"){
val alert = AlertDialog.Builder(this)
alert.setMessage("Search")
// Set an EditText view to get user input
val input = EditText(this)
input.hint = "Enter Text"
input.inputType = InputType.TYPE_CLASS_TEXT
alert.setView(input)
input.setOnKeyListener { view, keyCode, keyEvent ->
if (keyCode == 66) {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(input.windowToken, 0)
}
false
}
alert.setPositiveButton("Ok") { dialog, whichButton ->
result.success(input.text.toString());
}
alert.setNegativeButton("Cancel") { dialog, whichButton ->
// Canceled.
}
alert.show()
}