Flutter多语言虚拟键盘插件virtual_keyboard_multi_language的使用

发布于 1周前 作者 nodeper 来自 Flutter

Flutter多语言虚拟键盘插件virtual_keyboard_multi_language的使用

简介

virtual_keyboard_multi_language 是一个用于在Flutter应用程序中显示虚拟键盘的简单包。它适用于类似自助终端和ATM的设备,完全用Dart编写,不依赖原生代码。该插件是从virtual_keyboard项目fork而来,旨在支持多语言输入并处理事件。

特性与待办事项

  • 已完成特性
    • 支持多语言(如英语、阿拉伯语、库尔德语)
    • 自定义布局
  • 待办事项
    • 实现弹出式浮动键盘/键数选项
    • 添加输入结果显示并处理事件

使用方法

VirtualKeyboard Widget

属性

  • type: 键盘类型,可以是数字或字母数字组合。
  • preKeyPress: 按下按键前的回调函数,会在添加到控制器之前触发。
  • postKeyPress: 按下按键后的回调函数,会在添加到控制器之后触发。
  • height: 虚拟键盘的高度,默认为300。
  • width: 虚拟键盘的宽度,默认为屏幕宽度。
  • textColor: 键文本颜色。
  • fontSize: 键文本大小。
  • alwaysCaps: 是否只允许大写字母。
  • customLayoutKeys: 自定义多语言或单语言布局。
  • defaultLayouts: 默认使用的布局列表,默认仅支持英语。
  • reverseLayout: 是否反转布局以适应从右到左的语言,默认为false。

示例:显示字母数字键盘(默认视图)

Container(
  color: Colors.deepPurple,
  child: VirtualKeyboard(
    height: 350,
    width: 600,
    textColor: Colors.white,
    fontSize: 20,
    defaultLayouts: [VirtualKeyboardDefaultLayouts.English],
    type: VirtualKeyboardType.Alphanumeric,
    postKeyPress: _onKeyPress,
  ),
)

示例:显示数字键盘(默认视图)

Container(
  color: Colors.red,
  child: VirtualKeyboard(
    type: VirtualKeyboardType.Numeric,
    postKeyPress: (key) => print(key.text),
  ),
)

示例:自定义键的字母数字键盘

Container(
  color: Colors.deepPurple,
  child: VirtualKeyboard(
    height: keyboardHeight,
    textColor: Colors.white,
    fontSize: 20,
    builder: _builder,
    type: VirtualKeyboardType.Numeric,
    postKeyPress: _onKeyPress,
  ),
)

Widget _builder(BuildContext context, VirtualKeyboardKey key) {
  Widget keyWidget;

  switch (key.keyType) {
    case VirtualKeyboardKeyType.String:
      keyWidget = _keyboardDefaultKey(key);
      break;
    case VirtualKeyboardKeyType.Action:
      keyWidget = _keyboardDefaultActionKey(key);
      break;
  }

  return keyWidget;
}

onKeyPressed事件基本用法示例

String text = '';
bool shiftEnabled = false;

_onKeyPress(VirtualKeyboardKey key) {
  if (key.keyType == VirtualKeyboardKeyType.String) {
    text += shiftEnabled ? key.capsText : key.text;
  } else if (key.keyType == VirtualKeyboardKeyType.Action) {
    switch (key.action) {
      case VirtualKeyboardKeyAction.Backspace:
        if (text.isNotEmpty) {
          text = text.substring(0, text.length - 1);
        }
        break;
      case VirtualKeyboardKeyAction.Return:
        text += '\n';
        break;
      case VirtualKeyboardKeyAction.Space:
        text += key.text;
        break;
      case VirtualKeyboardKeyAction.Shift:
        shiftEnabled = !shiftEnabled;
        break;
      default:
        break;
    }
  }
  setState(() {});
}

完整示例Demo

下面是一个完整的示例,展示了如何在Flutter应用中使用virtual_keyboard_multi_language来创建一个多语言虚拟键盘:

import 'package:flutter/material.dart';
import 'package:virtual_keyboard_multi_language/virtual_keyboard_multi_language.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Virtual Keyboard Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Virtual Keyboard Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;
  MyHomePage({Key? key, required this.title}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // Holds the text that user typed.
  String text = '';
  bool shiftEnabled = false;
  bool isNumericMode = false;
  late TextEditingController _controllerText;

  @override
  void initState() {
    _controllerText = TextEditingController();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            Text(
              text,
              style: Theme.of(context).textTheme.bodyMedium,
            ),
            Text(
              _controllerText.text,
              style: TextStyle(color: Colors.red),
            ),
            SwitchListTile(
              title: Text(
                'Keyboard Type = ' +
                    (isNumericMode
                        ? 'VirtualKeyboardType.Numeric'
                        : 'VirtualKeyboardType.Alphanumeric'),
              ),
              value: isNumericMode,
              onChanged: (val) {
                setState(() {
                  isNumericMode = val;
                });
              },
            ),
            Expanded(
              child: Container(),
            ),
            Container(
              color: Colors.deepPurple,
              child: VirtualKeyboard(
                height: 300,
                textColor: Colors.white,
                textController: _controllerText,
                defaultLayouts: [
                  VirtualKeyboardDefaultLayouts.Arabic,
                  VirtualKeyboardDefaultLayouts.English
                ],
                type: isNumericMode
                    ? VirtualKeyboardType.Numeric
                    : VirtualKeyboardType.Alphanumeric,
                postKeyPress: _onKeyPress,
              ),
            )
          ],
        ),
      ),
    );
  }

  /// Fired when the virtual keyboard key is pressed.
  _onKeyPress(VirtualKeyboardKey key) {
    if (key.keyType == VirtualKeyboardKeyType.String) {
      text += shiftEnabled ? key.capsText : key.text;
    } else if (key.keyType == VirtualKeyboardKeyType.Action) {
      switch (key.action) {
        case VirtualKeyboardKeyAction.Backspace:
          if (text.isNotEmpty) {
            text = text.substring(0, text.length - 1);
          }
          break;
        case VirtualKeyboardKeyAction.Return:
          text += '\n';
          break;
        case VirtualKeyboardKeyAction.Space:
          text += key.text;
          break;
        case VirtualKeyboardKeyAction.Shift:
          shiftEnabled = !shiftEnabled;
          break;
        default:
          break;
      }
    }
    setState(() {});
  }
}

这个例子展示了如何创建一个包含多语言虚拟键盘的应用程序,并允许用户切换键盘模式(数字或字母数字)。通过设置不同的defaultLayouts属性,你可以轻松地支持多种语言。


更多关于Flutter多语言虚拟键盘插件virtual_keyboard_multi_language的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter多语言虚拟键盘插件virtual_keyboard_multi_language的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用virtual_keyboard_multi_language插件的简单示例代码。这个插件允许你在Flutter应用中集成多语言虚拟键盘。

首先,确保你已经在pubspec.yaml文件中添加了virtual_keyboard_multi_language依赖:

dependencies:
  flutter:
    sdk: flutter
  virtual_keyboard_multi_language: ^最新版本号  # 请替换为实际最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中如下使用virtual_keyboard_multi_language插件:

import 'package:flutter/material.dart';
import 'package:virtual_keyboard_multi_language/virtual_keyboard_multi_language.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Virtual Keyboard Multi Language Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: VirtualKeyboardDemo(),
    );
  }
}

class VirtualKeyboardDemo extends StatefulWidget {
  @override
  _VirtualKeyboardDemoState createState() => _VirtualKeyboardDemoState();
}

class _VirtualKeyboardDemoState extends State<VirtualKeyboardDemo> {
  String _inputText = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Virtual Keyboard Multi Language Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              controller: TextEditingController(text: _inputText),
              onChanged: (value) {
                setState(() {
                  _inputText = value;
                });
              },
              decoration: InputDecoration(
                labelText: 'Enter Text',
                border: OutlineInputBorder(),
              ),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                showVirtualKeyboard(
                  context,
                  onTextInput: (String text) {
                    setState(() {
                      _inputText += text;
                    });
                  },
                  onKeyboardClosed: () {
                    print('Keyboard closed');
                  },
                );
              },
              child: Text('Show Virtual Keyboard'),
            ),
            SizedBox(height: 16),
            Text(
              'Input Text: $_inputText',
              style: TextStyle(fontSize: 18),
            ),
          ],
        ),
      ),
    );
  }
}

// 假设 showVirtualKeyboard 是插件提供的方法,
// 根据插件的实际API,你可能需要调整下面的函数定义
void showVirtualKeyboard(
    BuildContext context,
    ValueChanged<String> onTextInput,
    VoidCallback onKeyboardClosed) {
  // 这里是插件的调用示例,实际调用可能需要根据插件文档调整
  // 例如:VirtualKeyboardMultiLanguage.show(context, ...);
  // 注意:以下代码仅为示例,具体实现需要参考插件的实际API
  Navigator.push(
    context,
    MaterialPageRoute<void>(
      builder: (BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text('Virtual Keyboard')),
          body: VirtualKeyboardPage(
            onTextInput: onTextInput,
            onKeyboardClosed: onKeyboardClosed,
          ),
        );
      },
    ),
  );
}

// 假设 VirtualKeyboardPage 是插件提供或者自定义的实现虚拟键盘的页面
class VirtualKeyboardPage extends StatefulWidget {
  final ValueChanged<String> onTextInput;
  final VoidCallback onKeyboardClosed;

  VirtualKeyboardPage({required this.onTextInput, required this.onKeyboardClosed});

  @override
  _VirtualKeyboardPageState createState() => _VirtualKeyboardPageState();
}

class _VirtualKeyboardPageState extends State<VirtualKeyboardPage> {
  // 这里应该是虚拟键盘的具体实现
  // 由于插件的具体实现未知,这里仅提供一个简单的占位示例
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('This is a placeholder for Virtual Keyboard'),
    );
  }

  // 示例:假设在某个按钮点击事件中触发文本输入和键盘关闭
  void _onSomeButtonPressed() {
    widget.onTextInput('Hello, World!');  // 模拟键盘输入
    widget.onKeyboardClosed();  // 模拟键盘关闭
    Navigator.pop(context);  // 关闭键盘页面
  }
}

注意:上面的代码是一个简化的示例,实际的virtual_keyboard_multi_language插件可能有不同的API和方法调用方式。你需要参考插件的官方文档来调整代码。特别是showVirtualKeyboard函数和VirtualKeyboardPage类的实现,这些需要根据插件的实际功能进行自定义或调整。

此外,由于插件可能会更新其API,因此请确保查阅最新的插件文档以获取准确的信息。

回到顶部