Flutter键盘遮挡处理插件never_behind_keyboard的使用

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

Flutter键盘遮挡处理插件never_behind_keyboard的使用

标题

Flutter键盘遮挡处理插件never_behind_keyboard的使用

内容

使您的输入表单区域及其特定底部不会被弹出键盘遮挡。

此包的目标是在您有一个TextField或TextFormField时,每当它们被聚焦时,不仅需要让它们位于弹出键盘上方,还需要确保它们下方的区域也处于可见状态。

该区域可以是任何内容。

特性

  • 提供无需键盘遮挡的输入表单区域
  • 支持TextField和TextFormField
  • 检测多个焦点源,例如您可以将多个TextField或TextFormField设置为焦点源

限制

  • 目前仅支持一个区域的底部作为永不遮挡区域
  • 我使用`Scrollable.ensureVisible()`来滚动到目标控件。但有时我发现动画不完全平滑。您可以尝试使用示例项目

开始使用

  1. 将此包添加到您的项目,请遵循安装标签中的说明
  2. 您已经准备好使用此控件

使用方法

此包有3个控件。

  1. NeverBehindKeyboardArea: 您需要设置一个基于滚动视图(ScrollView或ListView)的控件。该控件会识别NeverBehindFocusSourceNeverBehindBottom,并将它们放在其中。
  2. NeverBehindFocusSource: 将此控件放在NeverBehindKeyboardArea中,并包裹可聚焦的控件,如TextField或TextFormField。此控件用于检测来自它们的焦点事件并通知NeverBehindKeyboardArea
  3. NeverBehindBottom: 需要将其作为标记控件放置在键盘下方。必须为其分配全局键。
NeverBehindKeyboardArea(
    // 设置一个基于滚动视图(ScrollView或ListView)
    scrollView: ListView(
        children: [
            // 这个例子展示了如果出现弹出键盘,区域会被隐藏。
            const SizedBox(
                height: 400,
            ),
            Column(
                children: [
                    // NeverBehindFocusSource控件将放在NeverBehindKeyboardArea控件中。
                    // 您可以将TextField或TextFormField放在里面,这个控件的目的是检测来自它们的焦点事件并通知NeverBehindKeyboardArea。
                    NeverBehindFocusSource(
                        child: Column(
                            children: [
                                TextField(
                                    decoration: InputDecoration(
                                        hintText: "ex. Google Flutter 2 for beginner",
                                    ),
                                )
                            ],
                        ),
                    ),
                    const SizedBox(
                        height: 70,
                    ),
                    ElevatedButton(
                        onPressed: () {},
                        child: const Text('Simple Sign in Button'),
                    ),
                    const Text("Look like I am not behind the keyboard any more, because there's NeverBehindBottom widget below me :)"),
                    // NeverBehindBottom控件不需要紧挨着或者放在NeverBehindFocusSource控件里面。它只需要放在NeverBehindKeyboardArea控件中。
                    // 在大多数情况下,您需要将其作为标记控件放置在键盘下方。
                    // 请记住给它分配全局键。这很重要。
                    NeverBehindBottom(key: GlobalKey()),
                ],
            ),
        ],
    ),
),

简单版本

NeverBehindKeyboardArea(
    scrollView: ListView(
        children: [
            Column(
                children: [
                    NeverBehindFocusSource(
                        child: TextField()
                    ),
                    ElevatedButton(
                        onPressed: () {},
                        child: const Text('Simple Sign in Button'),
                    ),
                    NeverBehindBottom(key: GlobalKey()),
                ],
            ),
        ],
    ),
),

补充信息

此包受到了akexorcist的GroupFocusable的启发。


示例代码

import 'package:flutter/material.dart';
import 'package:flutter_never_behind_keyboard/pages/never_behind_page.dart';
import 'package:flutter_never_behind_keyboard/pages/prototype_page.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Never Behind Keyboard Widget Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return NeverBehindPage();
  }
}

更多关于Flutter键盘遮挡处理插件never_behind_keyboard的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter键盘遮挡处理插件never_behind_keyboard的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用never_behind_keyboard插件来处理键盘遮挡问题的示例代码。

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

dependencies:
  flutter:
    sdk: flutter
  never_behind_keyboard: ^x.y.z  # 请将x.y.z替换为最新版本号

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

接下来,你可以在你的Flutter应用中使用这个插件。以下是一个简单的示例,展示如何在一个包含文本字段的页面上应用NeverBehindKeyboard

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Never Behind Keyboard Demo'),
        ),
        body: NeverBehindKeyboard(
          // 使用NeverBehindKeyboard包装你的内容
          child: Padding(
            padding: const EdgeInsets.all(16.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Text('这是一个示例页面,用于展示如何使用never_behind_keyboard插件。',
                    style: TextStyle(fontSize: 18)),
                SizedBox(height: 20),
                TextField(
                  decoration: InputDecoration(
                    labelText: '输入一些文本',
                  ),
                ),
                SizedBox(height: 20),
                TextField(
                  decoration: InputDecoration(
                    labelText: '更多文本输入',
                  ),
                  maxLines: 4,
                ),
                // 可以添加更多控件来测试键盘遮挡效果
              ],
            ),
          ),
        ),
      ),
    );
  }
}

在这个示例中,NeverBehindKeyboard组件被用来包装包含文本字段的列。这样,当键盘弹出时,内容不会被键盘遮挡,而是会自动调整位置。

never_behind_keyboard插件的工作原理是通过监听键盘的弹出和收回事件,然后调整被包装组件的padding或transform,以确保内容始终可见。

请注意,这个插件可能并不是在所有情况下都能完美工作,特别是当页面布局非常复杂时。因此,在实际项目中,你可能需要根据具体情况进行调整和优化。

回到顶部