Flutter自定义键盘插件super_keyboard的使用

Flutter自定义键盘插件super_keyboard的使用

super_keyboard 是一个用于报告键盘可见性和大小的插件。该插件支持iOS和Android平台。

支持平台

此插件支持iOS和Android。

统一API

对于不关心iOS和Android如何报告键盘信息的用户来说,最简单的方法是通过统一API(最低公分母)来使用super_keyboard

构建基于键盘状态的小部件子树

[@override](/user/override)
Widget build(BuildContext context) {
  return SuperKeyboardBuilder(
    builder: (context, keyboardState) {
      // 根据键盘状态执行操作
      return const SizedBox();
    }
  );
}

直接监听键盘状态的变化

void startListeningToKeyboardState() {
  SuperKeyboard.instance.state.addListener(_onKeyboardStateChange);
}

void stopListeningToKeyboardState() {
  SuperKeyboard.instance.state.removeListener(_onKeyboardStateChange);
}

void _onKeyboardStateChange(KeyboardState newState) {
  // 根据新的键盘状态执行操作
}

激活日志

SuperKeyboard.initLogs();

iOS 和 Android

还提供了特定于平台的API。统一的SuperKeyboard API在底层委托给特定平台的API。

  • iOS可以在SuperKeyboardIOS中使用。
  • Android可以在SuperKeyboardAndroid中使用。

特定平台的API之所以可用,是因为每个平台以不同的方式报告键盘状态和高度。这些报告方法可能不完全兼容。此外,一个平台可能会报告比另一个平台更多的键盘信息。我们希望为用户提供尽可能多的信息,而不仅仅是最低公分母API所能提供的信息。

完整示例代码

以下是一个完整的示例代码,展示了如何使用super_keyboard插件:

import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:super_keyboard/super_keyboard.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();

    initSuperKeyboard();
  }

  Future<void> initSuperKeyboard() async {
    SuperKeyboard.initLogs();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        resizeToAvoidBottomInset: defaultTargetPlatform != TargetPlatform.android,
        body: Center(
          child: ConstrainedBox(
            constraints: const BoxConstraints(maxWidth: 250),
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                ValueListenableBuilder(
                  valueListenable: SuperKeyboard.instance.state,
                  builder: (context, value, child) {
                    final icon = switch (value) {
                      KeyboardState.closed => Icons.border_bottom,
                      KeyboardState.opening => Icons.upload_sharp,
                      KeyboardState.open => Icons.border_top,
                      KeyboardState.closing => Icons.download_sharp,
                    };

                    return Icon(
                      icon,
                      size: 24,
                    );
                  },
                ),
                const SizedBox(height: 12),
                SuperKeyboardBuilder(builder: (context, keyboardState) {
                  return Text("Keyboard state: $_keyboardState");
                }),
                const SizedBox(height: 12),
                ValueListenableBuilder(
                  valueListenable: SuperKeyboard.instance.keyboardHeight,
                  builder: (context, value, child) {
                    return Text("Keyboard height: ${value != null ? "${value.toInt()}" : "???"}");
                  },
                ),
                const SizedBox(height: 48),
                TextField(
                  decoration: const InputDecoration(
                    hintText: "Type some text",
                  ),
                  onTapOutside: (_) {
                    FocusManager.instance.primaryFocus?.unfocus();
                  },
                ),
                ValueListenableBuilder(
                  valueListenable: SuperKeyboard.instance.keyboardHeight,
                  builder: (context, value, child) {
                    if (value == null) {
                      return const SizedBox();
                    }

                    return SizedBox(height: value / MediaQuery.of(context).devicePixelRatio);
                  },
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }

  String get _keyboardState {
    return switch (SuperKeyboard.instance.state.value) {
      KeyboardState.closed => "Closed",
      KeyboardState.opening => "Opening",
      KeyboardState.open => "Open",
      KeyboardState.closing => "Closing",
    };
  }
}

更多关于Flutter自定义键盘插件super_keyboard的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义键盘插件super_keyboard的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


super_keyboard 是一个用于 Flutter 的自定义键盘插件,允许开发者创建完全自定义的软键盘。使用该插件,你可以设计适合特定应用场景的键盘布局,例如数字键盘、密码键盘、表情符号键盘等。

安装 super_keyboard

首先,你需要在 pubspec.yaml 文件中添加 super_keyboard 依赖:

dependencies:
  flutter:
    sdk: flutter
  super_keyboard: ^1.0.0  # 请检查最新版本

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

使用 super_keyboard

以下是一个简单的示例,展示如何使用 super_keyboard 创建一个自定义数字键盘。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Super Keyboard Example'),
        ),
        body: KeyboardDemo(),
      ),
    );
  }
}

class KeyboardDemo extends StatefulWidget {
  @override
  _KeyboardDemoState createState() => _KeyboardDemoState();
}

class _KeyboardDemoState extends State<KeyboardDemo> {
  TextEditingController _controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        TextField(
          controller: _controller,
          decoration: InputDecoration(
            labelText: 'Enter your text',
          ),
        ),
        Expanded(
          child: SuperKeyboard(
            onKeyPressed: (String key) {
              setState(() {
                _controller.text += key;
              });
            },
            keys: [
              ['1', '2', '3'],
              ['4', '5', '6'],
              ['7', '8', '9'],
              ['0', '<-'],
            ],
          ),
        ),
      ],
    );
  }
}

解释

  1. 依赖安装:在 pubspec.yaml 中添加 super_keyboard 依赖。
  2. 导入包:在 Dart 文件中导入 super_keyboard 包。
  3. 创建控制器:使用 TextEditingController 来管理文本输入。
  4. 使用 SuperKeyboard:在 SuperKeyboard 组件中定义键盘的布局,并通过 onKeyPressed 回调处理按键事件。

自定义键盘布局

你可以通过 keys 参数来自定义键盘的布局。keys 是一个二维列表,每个子列表代表键盘的一行。例如:

keys: [
  ['1', '2', '3'],
  ['4', '5', '6'],
  ['7', '8', '9'],
  ['0', '<-'],
]
回到顶部