dart 在物理设备上的文本字段上挥动键盘

hs1ihplo  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(112)

bounty还有5天到期。此问题的答案有资格获得+50声望奖励。more正在寻找一个答案从一个有信誉的来源

当我在ios模拟器或android模拟器上运行应用程序时,键盘没有问题,一切正常。但是当我通过testflight在物理设备上运行时,键盘显示在SendInputField上。无法看到输入字段和发送按钮。
这里是代码

@override
  Widget build(BuildContext context) {
    return WillPopScope(
      child: Scaffold(
        resizeToAvoidBottomInset: true,
        appBar: AppBarWidget(
         
        ),
        body: _mainBody(context),
      ),
    );
  }

  _mainBody(BuildContext context) {
    return Obx(
      () => Column(
        children: [
          Expanded(
            flex: 5,
            child: SingleChildScrollView(
              reverse: true,
              child: Stack(
                children: <Widget>[
                  _buildList(),
                ],
              ),
            ),
          ),
          Expanded(
            flex: 0,
            child: Obx(() => Visibility(
                visible: controller.isLoading.value,
                child: const CustomLoadingAPI())),
          ),
          Expanded(flex: 0, child: _submitButton(context)),
          SizedBox(height: Dimensions.heightSize)
        ],
      ),
    );
  }

  _submitButton(BuildContext context) {

    return Align(
      ....
          SendInputField(
            
            hintText: Strings.typeYour.tr,
            onTap: () {
              if (!LocalStorage.isFreeUser()) {
                if (controller.chatController.text.isNotEmpty) {
                  controller.proccessChat(args[0]);
                  Future.delayed(const Duration(milliseconds: 50))
                      .then((_) => controller.scrollDown());
                } else {
                  ToastMessage.error(Strings.writeSomethingg.tr);
                }
              } else {
                ...
              }
            },
           ,
        ],
      ),
    );
  }

  _buildList() {
    return Obx(() => ListView.builder(
          controller: controller.scrollController,
          itemCount: controller.itemCount.value,
          shrinkWrap: true,
          itemBuilder: (context, index) {
            return ChatMessageWidget(
                ....
                text: controller.messages.value[index].text,
              ...
                index: index);
          },
        ));
  }

}

有什么建议吗?我应该如何解决这个问题?

lmyy7pcs

lmyy7pcs1#

1.使用MediaQuery.of(context).viewInsets.bottom属性获取键盘的高度。然后,使用此高度填充SendInputField的底部。这将确保SendInputField始终可见,即使在键盘打开时也是如此。
double keyboardHeight = MediaQuery.of(context).viewInsets.bottom;

Widget _submitButton(BuildContext context) {
   return Align(
     ...
       SendInputField(
         padding: EdgeInsets.only(bottom: keyboardHeight),
         ...
       ),
     );
   }

1.您也可以尝试ScrollView.keyboardDismissBehavior属性将键盘解除行为设置为ScrollViewKeyboardDismissBehavior.onDrag.这将允许用户通过将键盘拖离屏幕来解除键盘。

SingleChildScrollView(
        reverse:true,
        keyboardDismissBehavior:ScrollViewKeyboardDismissBehavior.onDrag,
        child:Stack(
        children:<Widget>[
        _buildList(),
        ],
        )

使用第三方键盘库,如flutter_keyboard_visibilitykeyboard_dismissible

sqxo8psd

sqxo8psd2#

您可以像这样使用底部insets:

_mainBody(BuildContext context) {
  return Obx(
    () => Padding(
      padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), // <- add bottom padding
      child: Column(
        // your existing code
      ),
    ),
  );
}

相关问题