Flutter 有没有办法将自定义工具栏放在键盘上?

Flutter 有没有办法将自定义工具栏放在键盘上?,flutter,android-keypad,iphone-keypad,Flutter,Android Keypad,Iphone Keypad,我想在键盘上放置一个自定义工具栏,如上图所示。在颤振中可能吗?或者我应该在iOS或Android端编写代码?是的,有一种方法可以实现这一点 创建要添加的工具栏小部件 将其设置为在输入焦点上可见 作为参考,我分享的代码,我如何实现这一点 class InputDoneView extends StatelessWidget { @override Widget build(BuildContext context) { return Container( width:


我想在键盘上放置一个自定义工具栏,如上图所示。在颤振中可能吗?或者我应该在iOS或Android端编写代码?

是的,有一种方法可以实现这一点

  • 创建要添加的工具栏小部件
  • 将其设置为在输入焦点上可见
  • 作为参考,我分享的代码,我如何实现这一点

    class InputDoneView extends StatelessWidget {
    
    
    @override
      Widget build(BuildContext context) {
        return Container(
          width: double.infinity,
          color: Style.lightGrey,
          child: Align(
            alignment: Alignment.topRight,
            child: Padding(
              padding: const EdgeInsets.only(top: 1.0, bottom: 1.0),
              child: CupertinoButton(
                padding: EdgeInsets.only(right: 24.0, top: 2.0, bottom: 2.0),
                onPressed: () {
                  FocusScope.of(context).requestFocus(new FocusNode());
                },
                child: Text(
                  "Done",
                  style: TextStyle(color: Style.primaryColor,fontWeight: FontWeight.normal)
                ),
              ),
            ),
          ),
        );
      }
    }
    
    当输入字段集中在输入和输出时,在主视图中调用此选项

    showOverlay(BuildContext context) {
        if (overlayEntry != null) return;
        OverlayState overlayState = Overlay.of(context);
        overlayEntry = OverlayEntry(builder: (context) {
          return Positioned(
              bottom: MediaQuery.of(context).viewInsets.bottom, right: 0.0, left: 0.0, child: InputDoneView());
        });
    
        overlayState.insert(overlayEntry);
      }
    
      removeOverlay() {
        if (overlayEntry != null) {
          overlayEntry.remove();
          overlayEntry = null;
        }
      }
    

    是的,在颤振中有一种方法可以实现这一点

  • 创建要添加的工具栏小部件
  • 将其设置为在输入焦点上可见
  • 作为参考,我分享的代码,我如何实现这一点

    class InputDoneView extends StatelessWidget {
    
    
    @override
      Widget build(BuildContext context) {
        return Container(
          width: double.infinity,
          color: Style.lightGrey,
          child: Align(
            alignment: Alignment.topRight,
            child: Padding(
              padding: const EdgeInsets.only(top: 1.0, bottom: 1.0),
              child: CupertinoButton(
                padding: EdgeInsets.only(right: 24.0, top: 2.0, bottom: 2.0),
                onPressed: () {
                  FocusScope.of(context).requestFocus(new FocusNode());
                },
                child: Text(
                  "Done",
                  style: TextStyle(color: Style.primaryColor,fontWeight: FontWeight.normal)
                ),
              ),
            ),
          ),
        );
      }
    }
    
    当输入字段集中在输入和输出时,在主视图中调用此选项

    showOverlay(BuildContext context) {
        if (overlayEntry != null) return;
        OverlayState overlayState = Overlay.of(context);
        overlayEntry = OverlayEntry(builder: (context) {
          return Positioned(
              bottom: MediaQuery.of(context).viewInsets.bottom, right: 0.0, left: 0.0, child: InputDoneView());
        });
    
        overlayState.insert(overlayEntry);
      }
    
      removeOverlay() {
        if (overlayEntry != null) {
          overlayEntry.remove();
          overlayEntry = null;
        }
      }
    

    您可以复制粘贴运行下面的完整代码
    请参见下面的工作演示
    您可以使用软件包
    步骤1:将
    与HandleFocusnodesOverlyMixin一起使用
    步骤2:对
    focusNode
    使用
    FocusNodeOverlay
    步骤3:使用
    GetFocusNodeOverlay
    并设置
    \u focusNodeOverlay=GetFocusNodeOverlay(

    第4步:
    TextField
    使用
    TextField(focusNode:\u focusNodeOverlay,

    代码片段

    class _MyHomePageState extends State<MyHomePage>
        with HandleFocusNodesOverlayMixin {
      FocusNodeOverlay _focusNodeOverlay;
    
      @override
      void initState() {
        _focusNodeOverlay = GetFocusNodeOverlay(
          child: TopKeyboardUtil(
            Container(
              color: Colors.white,
              height: 45,
              width: MediaQueryData.fromWindow(ui.window).size.width,
              child: Row(
                children: [
                  GestureDetector(
                    child: Icon(Icons.save),
                    onTap: () => print("click"),
                  ),
                 ...
                  Spacer(),
                  Container(
                    width: 60,
                    child: Center(
                      child: DoneButtonIos(
                        backgroundColor: Colors.white,
                        textColor: Colors.green,
                        label: 'Post',
                        onSubmitted: () {
                          print("submit");
                        },
                        platforms: ['android', 'ios'],
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
        );
    
    class\u MyHomePageState扩展状态
    用手扶眼睑结缔组织{
    FocusNodeOverlay\u FocusNodeOverlay;
    @凌驾
    void initState(){
    _focusNodeOverlay=GetFocusNodeOverlay(
    孩子:TopKeyboardUtil(
    容器(
    颜色:颜色,白色,
    身高:45,
    宽度:MediaQueryData.fromWindow(ui.window).size.width,
    孩子:排(
    儿童:[
    手势检测器(
    子:图标(Icons.save),
    onTap:()=>打印(“单击”),
    ),
    ...
    垫片(),
    容器(
    宽度:60,
    儿童:中心(
    孩子:DoneButtonIos(
    背景颜色:Colors.white,
    textColor:Colors.green,
    标签:'Post',
    提交:(){
    打印(“提交”);
    },
    平台:['android','ios'],
    ),
    ),
    ),
    ],
    ),
    ),
    ),
    );
    
    工作演示

    完整代码

    import 'package:flutter/material.dart';
    import 'package:keyboard_overlay/keyboard_overlay.dart';
    import 'dart:ui' as ui;
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage>
        with HandleFocusNodesOverlayMixin {
      FocusNodeOverlay _focusNodeOverlay;
    
      @override
      void initState() {
        _focusNodeOverlay = GetFocusNodeOverlay(
          child: TopKeyboardUtil(
            Container(
              color: Colors.white,
              height: 45,
              width: MediaQueryData.fromWindow(ui.window).size.width,
              child: Row(
                children: [
                  GestureDetector(
                    child: Icon(Icons.save),
                    onTap: () => print("click"),
                  ),
                  GestureDetector(
                    child: Icon(Icons.computer),
                    onTap: () => print("click"),
                  ),
                  GestureDetector(
                    child: Icon(Icons.home),
                    onTap: () => print("click"),
                  ),
                  Spacer(),
                  Container(
                    width: 60,
                    child: Center(
                      child: DoneButtonIos(
                        backgroundColor: Colors.white,
                        textColor: Colors.green,
                        label: 'Post',
                        onSubmitted: () {
                          print("submit");
                        },
                        platforms: ['android', 'ios'],
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
        );
    
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                TextField(
                  focusNode: _focusNodeOverlay,
                  style: TextStyle(color: Colors.grey),
                  decoration: InputDecoration(
                    labelText: 'Type Something',
                    labelStyle: TextStyle(color: Colors.black),
                    fillColor: Colors.orange,
                    hintStyle: TextStyle(
                      color: Colors.grey,
                    ),
                    enabledBorder: UnderlineInputBorder(
                      borderSide: BorderSide(color: Colors.black, width: 1.0),
                    ),
                  ),
                ),
              ],
            ),
          ),
        );
      }
    }
    
    导入“包装:颤振/材料.省道”;
    导入“package:keyboard_overlay/keyboard_overlay.dart”;
    将“dart:ui”导入为ui;
    void main(){
    runApp(MyApp());
    }
    类MyApp扩展了无状态小部件{
    @凌驾
    小部件构建(构建上下文){
    返回材料PP(
    标题:“颤振演示”,
    主题:主题数据(
    主样本:颜色。蓝色,
    ),
    主页:MyHomePage(标题:“颤振演示主页”),
    );
    }
    }
    类MyHomePage扩展StatefulWidget{
    MyHomePage({Key,this.title}):超级(Key:Key);
    最后的字符串标题;
    @凌驾
    _MyHomePageState createState()=>\u MyHomePageState();
    }
    类_MyHomePageState扩展状态
    用手扶眼睑结缔组织{
    FocusNodeOverlay\u FocusNodeOverlay;
    @凌驾
    void initState(){
    _focusNodeOverlay=GetFocusNodeOverlay(
    孩子:TopKeyboardUtil(
    容器(
    颜色:颜色,白色,
    身高:45,
    宽度:MediaQueryData.fromWindow(ui.window).size.width,
    孩子:排(
    儿童:[
    手势检测器(
    子:图标(Icons.save),
    onTap:()=>打印(“单击”),
    ),
    手势检测器(
    子:图标(Icons.computer),
    onTap:()=>打印(“单击”),
    ),
    手势检测器(
    子:图标(Icons.home),
    onTap:()=>打印(“单击”),
    ),
    垫片(),
    容器(
    宽度:60,
    儿童:中心(
    孩子:DoneButtonIos(
    背景颜色:Colors.white,
    textColor:Colors.green,
    标签:'Post',
    提交:(){
    打印(“提交”);
    },
    平台:['android','ios'],
    ),
    ),
    ),
    ],
    ),
    ),
    ),
    );
    super.initState();
    }
    @凌驾
    小部件构建(构建上下文){
    返回脚手架(
    appBar:appBar(
    标题:文本(widget.title),
    ),
    正文:中(
    子:列(
    mainAxisAlignment:mainAxisAlignment.center,
    儿童:[
    文本字段(
    focusNode:_focusNodeOverlay,
    样式:TextStyle(颜色:Colors.grey),
    装饰:输入装饰(
    labelText:“键入某物”,
    标签样式:文本样式(颜色:Colors.black),
    fillColor:Colors.orange,
    hintStyle:TextStyle(
    颜色:颜色。灰色,
    ),
    enabledBorder:UnderlineInputBorder(
    borderSide:borderSide(颜色:Colors.black,宽度:1.0),
    ),
    ),
    ),
    ],
    ),
    ),
    );
    }
    }
    
    您可以复制粘贴运行下面的完整代码
    请参见下面的工作演示
    您可以使用软件包
    步骤1:将
    与HandleFocusnodesOverlyMixin一起使用
    步骤2:对
    focusNode
    使用
    FocusNodeOverlay
    步骤3:使用
    GetFocusNodeOverlay
    并设置
    \u focusNodeOverlay=GetFocusNodeOverlay(

    第4步:
    TextField
    使用
    TextField(focusNode:\u focusNodeOverlay,

    代码片段

    class _MyHomePageState extends State<MyHomePage>
        with HandleFocusNodesOverlayMixin {
      FocusNodeOverlay _focusNodeOverlay;
    
      @override
      void initState() {
        _focusNodeOverlay = GetFocusNodeOverlay(
          child: TopKeyboardUtil(
            Container(
              color: Colors.white,
              height: 45,
              width: MediaQueryData.fromWindow(ui.window).size.width,
              child: Row(
                children: [
                  GestureDetector(
                    child: Icon(Icons.save),
                    onTap: () => print("click"),
                  ),
                 ...
                  Spacer(),
                  Container(
                    width: 60,
                    child: Center(
                      child: DoneButtonIos(
                        backgroundColor: Colors.white,
                        textColor: Colors.green,
                        label: 'Post',
                        onSubmitted: () {
                          print("submit");
                        },
                        platforms: ['android', 'ios'],
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
        );
    
    class\u MyHomePageState扩展状态
    用手扶眼睑结缔组织{
    FocusNodeOverlay\u FocusNodeOverlay;
    @凌驾
    void initState(){
    _focusNodeOverlay=GetF