Flutter Windows:如果将 TextField 放置在 AlertDialog 内,则它不允许有空间

aym*_*969 2 widget dart flutter flutter-alertdialog flutter-windows

一小时前,当我将 TextField 放入 AlertDialog 中时,我发现了一个奇怪的行为,它不允许输入空格,否则它的行为正常,这是我的代码:

\n

//================Flutter doctor -v\n[\xe2\x88\x9a] Flutter(频道稳定,2.0.2,在 Microsoft Windows 上 [版本 10.0.18363.1316] ,语言环境 en-US)\n\xe2\x80\xa2 Flutter 版本 2.0.2,位于 C:\\Flutter\\flutter-latest\n\xe2\x80\xa2 框架修订版 8962f6dc68(5 天前),2021-03 -11 13:22:20 -0800\n\xe2\x80\xa2 引擎修订版 5d8bf811b3\n\xe2\x80\xa2 Dart 版本 2.12.1

\n

[\xe2\x88\x9a] Android 工具链 - 为 Android 设备开发(Android SDK 版本 29.0.3)\n\xe2\x80\xa2 Android SDK,位于 C:\\Users\\user\\AppData\\Local\\ Android\\sdk\n\xe2\x80\xa2 平台 android-30,构建工具 29.0.3\n\xe2\x80\xa2 Java 二进制文件位于:C:\\Program Files\\Android\\Android Studio\\ jre\\bin\\java\n\xe2\x80\xa2 Java 版本 OpenJDK 运行时环境(内部版本 1.8.0_202-release-1483-b03)\n\xe2\x80\xa2 接受所有 Android 许可证。

\n

[\xe2\x88\x9a] Chrome - 为网络开发\n\xe2\x80\xa2 Chrome,位于 C:\\Users\\user\\AppData\\Local\\Google\\Chrome\\Application\\chrome 。EXE文件

\n

[\xe2\x88\x9a] Visual Studio - 针对 Windows 进行开发(Visual Studio Community 2019 16.9.0)\n\xe2\x80\xa2 Visual Studio 位于 C:\\Program Files (x86)\\Microsoft Visual Studio\\ 2019\\Community\n\xe2\x80\xa2 Visual Studio Community 2019 版本 16.9.31025.194\n\xe2\x80\xa2 Windows 10 SDK 版本 10.0.19041.0

\n

[\xe2\x88\x9a] Android Studio(版本 3.5)\n\xe2\x80\xa2 Android Studio 位于 C:\\Program Files\\Android\\Android Studio\n\xe2\x80\xa2 Flutter 插件版本 42.1 .1\n\xe2\x80\xa2 Dart 插件版本 191.8593\n\xe2\x80\xa2 Java 版本 OpenJDK 运行时环境(内部版本 1.8.0_202-release-1483-b03)

\n

[\xe2\x88\x9a] IntelliJ IDEA 社区版(版本 2020.2)\n\xe2\x80\xa2 IntelliJ 位于 C:\\Program Files\\JetBrains\\IntelliJ IDEA 社区版 2020.2.1\n\xe2\x80 \xa2 Flutter 插件可以从以下位置安装:\n https://plugins.jetbrains.com/plugin/9212-flutter \n\xe2\x80\xa2 Dart 插件可以从以下位置安装:\n https://plugins.jetbrains .com/plugin/6351-dart

\n

[\xe2\x88\x9a] VS Code(版本 1.54.3)\n\xe2\x80\xa2 VS Code 位于 C:\\Users\\user\\AppData\\Local\\Programs\\Microsoft VS Code\ n\xe2\x80\xa2 Flutter 扩展版本 3.20.0

\n

[\xe2\x88\x9a] 连接的设备(3 个可用)\n\xe2\x80\xa2 Windows(桌面) \xe2\x80\xa2 windows \xe2\x80\xa2 windows-x64 \xe2\x80\xa2 Microsoft Windows [版本 10.0.18363.1316]\n\xe2\x80\xa2 Chrome(网络)\xe2\x80\xa2 chrome \xe2\x80\xa2 web-javascript \xe2\x80\xa2 Google Chrome 89.0.4389.82\n\xe2\ x80\xa2 Edge(网络)\xe2\x80\xa2 边缘 \xe2\x80\xa2 web-javascript \xe2\x80\xa2 Microsoft Edge 89.0.774.54

\n

\xe2\x80\xa2 未发现问题!

\n
\n\n\n//======AppTextField widget\n\n\nimport \'package:flutter/material.dart\';\nimport \'package:flutter/services.dart\';\n\nclass AppTextField extends StatefulWidget {\n  final String caption;\n  final dynamic initialValue;\n  final dynamic Function(String) onSubmitted;\n  final bool readOnly;\n  const AppTextField(\n      {Key key,\n      this.caption,\n      this.onSubmitted,\n      this.initialValue,\n      this.readOnly = false})\n      : super(key: key);\n\n  @override\n  _AppTextFieldState createState() => _AppTextFieldState();\n}\n\nclass _AppTextFieldState extends State<AppTextField> {\n  TextEditingController _textEditingController;\n\n  TextStyle _captionStyle = TextStyle(fontSize: 17);\n  TextStyle _textStyle = TextStyle(fontSize: 17);\n\n  String get value => _textEditingController.text;\n\n  @override\n  void initState() {\n    super.initState();\n\n    this._textEditingController = TextEditingController();\n    this._textEditingController.text = this.widget.initialValue != null\n        ? this.widget.initialValue.toString()\n        : "";\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TextField(\n      textInputAction: TextInputAction.none,\n      readOnly: this.widget.readOnly,\n      enableInteractiveSelection: true,\n      cursorHeight: 30,\n      onEditingComplete: () {\n        int u = 9;\n      },\n      onChanged: (v) {\n        // if (this.widget.onSubmitted != null) {\n        //   var val = this.widget.onSubmitted(v);\n        //   if (val != null) this._textEditingController.text = val.toString();\n        // }\n      },\n      style: _textStyle,\n      controller: _textEditingController,\n      decoration: InputDecoration(\n          isDense: true,\n          contentPadding: EdgeInsets.all(15.0),\n          labelText: this.widget.caption,\n          floatingLabelBehavior: FloatingLabelBehavior.always,\n          border: OutlineInputBorder(\n              borderRadius: BorderRadius.circular(10),\n              borderSide: BorderSide(color: Colors.green, width: 1.0))),\n    );\n  }\n\n  @override\n  void dispose() {\n    this._textEditingController.dispose();\n    super.dispose();\n  }\n}\n\n\n//======the I use AppTextField widget inside AlertDialog like this :\n\nimport \'package:animate_do/animate_do.dart\';\nimport \'package:flutter/material.dart\';\nimport \'package:flutter_desktop/Views/App-Widgets/AppTextField.dart\';\nimport \'package:flutter_desktop/Views/Room/Notification-Dialog.dart\';\nimport \'package:flutter_desktop/Views/states/Message-State.dart\';\nimport \'package:provider/provider.dart\';\n\nimport \'Chat/ChatMessage.dart\';\n\nclass SendNotificationDialog extends StatefulWidget {\n  @override\n  _SendNotificationDialogState createState() => _SendNotificationDialogState();\n}\n\nclass _SendNotificationDialogState extends State<SendNotificationDialog> {\n  String _message = "";\n  @override\n  Widget build(BuildContext context) {\n    return AlertDialog(\n      elevation: 10,\n      titleTextStyle: TextStyle(\n          fontSize: 20, fontWeight: FontWeight.bold, color: Colors.black),\n      title: Text("\xd8\xb1\xd8\xb3\xd8\xa7\xd9\x84\xd8\xa9 \xd8\xaa\xd9\x86\xd8\xa8\xd9\x8a\xd9\x87"),\n      content: Builder(\n        builder: (context) => _createBody(context),\n      ),\n      actions: [\n        MaterialButton(\n          onPressed: () {\n            Navigator.pop(context);\n\n            var messageState =\n                Provider.of<MessageState>(context, listen: false);\n\n            messageState.addMessage(_message, MessageType.NOTIFICATION);\n\n            Navigator.push(\n                context,\n                PageRouteBuilder(\n                    barrierDismissible: true,\n                    opaque: false,\n                    pageBuilder: (_, __, ___) => NotificationDialog(\n                          userName: "Yousel : ",\n                          notification: _message,\n                        )));\n          },\n          child: Text("\xd9\x85\xd9\x88\xd8\xa7\xd9\x81\xd9\x82"),\n        ),\n        MaterialButton(\n          onPressed: () {\n            Navigator.pop(context);\n          },\n          child: Text("\xd8\xa5\xd9\x84\xd8\xba\xd8\xa7\xd8\xa1"),\n        ),\n      ],\n    );\n  }\n\n  _createBody(BuildContext context) {\n    return Container(\n      width: 500,\n      height: 100,\n      child: ListTile(\n        autofocus: true,\n        title: AppTextField(\n          initialValue: _message,\n          onSubmitted: (v) {\n            _message = v;\n            return _message;\n          },\n          caption: "\xd8\xa3\xd8\xaf\xd8\xae\xd9\x84 \xd8\xa7\xd9\x84\xd9\x86\xd8\xb5 \xd8\xa7\xd9\x84\xd8\xb0\xd9\x89 \xd8\xb3\xd9\x88\xd9\x81 \xd9\x8a\xd8\xb4\xd8\xa7\xd9\x87\xd8\xaf\xd9\x87 \xd8\xa7\xd9\x84\xd8\xac\xd9\x85\xd9\x8a\xd8\xb9",\n        ),\n      ),\n    );\n  }\n}\n\n\n//=======Then I push SendNotificationDialog page :\n\n Navigator.push(\n        context,\n        PageRouteBuilder(\n            barrierDismissible: true,\n            opaque: false,\n            transitionDuration: Duration(milliseconds: 500),\n            transitionsBuilder:\n                (context, firstAnimation, secondAnimation, child) {\n              firstAnimation = CurvedAnimation(\n                  parent: firstAnimation, curve: Curves.fastLinearToSlowEaseIn);\n\n              return ScaleTransition(\n                scale: firstAnimation,\n                child: child,\n              );\n            },\n            pageBuilder: (_, __, ___) {\n              return SendNotificationDialog();\n            }));\n\n\n
Run Code Online (Sandbox Code Playgroud)\n

aym*_*969 5

该问题是由将 TextField 包装在 ListTile 小部件中引起的,而不是将其包装在 AlertDialog 中引起的。删除 ListTile 可以解决问题。