Flutter Windows: TextField не допускает места, если он помещен внутри AlertDialog

Час назад я обнаружил странное поведение TextField, когда я помещаю его в AlertDialog, он не позволяет вводить пробел. В противном случае он ведет себя нормально. Вот мой код:

//================Flutter doctor -v[√] Flutter (стабильный канал, 2.0.2, в Microsoft Windows [версия 10.0.18363.1316], локаль en-US) • Версия Flutter 2.0.2 в C: \ Flutter \ flutter-latest • Версия фреймворка 8962f6dc68 (5 дней назад), 2021-03-11 13:22:20 -0800 • Версия движка 5d8bf811b3 • Версия Dart 2.12.1

[√] Android toolchain - разработка для устройств Android (Android SDK версии 29.0.3) • Android SDK в C: \ Users \ user \ AppData \ Local \ Android \ sdk • Платформа android-30, инструменты сборки 29.0.3• Java двоичный файл по адресу: C: \ Program Files \ Android \ Android Studio \ jre \ bin \ java • Версия Java OpenJDK Runtime Environment (сборка 1.8.0_202-release-1483-b03) • Принимаются все лицензии Android.

[√] Chrome - разработка для Интернета • Chrome в C: \ Users \ user \ AppData \ Local \ Google \ Chrome \ Application \ chrome.exe

[√] Visual Studio - разработка для Windows (Visual Studio Community 2019 16.9.0) • Visual Studio в C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community• Visual Studio Community 2019 версии 16.9.31025.194• Windows 10 SDK версии 10.0.19041.0

[√] Android Studio (версия 3.5) • Android Studio в C: \ Program Files \ Android \ Android Studio • Плагин Flutter версии 42.1.1 • Плагин Dart версии 191.8593 • Версия Java Среда выполнения OpenJDK (сборка 1.8.0_202-release-1483-b03)

[√] IntelliJ IDEA Community Edition (версия 2020.2) • IntelliJ в C: \ Program Files \ JetBrains \ IntelliJ IDEA Community Edition 2020.2.1 • Плагин Flutter можно установить с:https://plugins.jetbrains.com/plugin/9212-flutter • Плагин Dart можно установить с:https://plugins.jetbrains.com/plugin/6351-dart

[√] Код VS (версия 1.54.3) • Код VS в C: \ Users \ user \ AppData \ Local \ Programs \ Microsoft VS Code • Расширение Flutter версии 3.20.0

[√] Подключенное устройство (доступно 3)• Windows (рабочий стол) • windows • windows-x64 • Microsoft Windows [версия 10.0.18363.1316]• Chrome (веб) • Chrome • веб-javascript • Google Chrome 89.0.4389.82• Edge (веб ) • край • веб-javascript • Microsoft Edge 89.0.774.54

• Проблем не обнаружено!

      


//======AppTextField widget


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

class AppTextField extends StatefulWidget {
  final String caption;
  final dynamic initialValue;
  final dynamic Function(String) onSubmitted;
  final bool readOnly;
  const AppTextField(
      {Key key,
      this.caption,
      this.onSubmitted,
      this.initialValue,
      this.readOnly = false})
      : super(key: key);

  @override
  _AppTextFieldState createState() => _AppTextFieldState();
}

class _AppTextFieldState extends State<AppTextField> {
  TextEditingController _textEditingController;

  TextStyle _captionStyle = TextStyle(fontSize: 17);
  TextStyle _textStyle = TextStyle(fontSize: 17);

  String get value => _textEditingController.text;

  @override
  void initState() {
    super.initState();

    this._textEditingController = TextEditingController();
    this._textEditingController.text = this.widget.initialValue != null
        ? this.widget.initialValue.toString()
        : "";
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      textInputAction: TextInputAction.none,
      readOnly: this.widget.readOnly,
      enableInteractiveSelection: true,
      cursorHeight: 30,
      onEditingComplete: () {
        int u = 9;
      },
      onChanged: (v) {
        // if (this.widget.onSubmitted != null) {
        //   var val = this.widget.onSubmitted(v);
        //   if (val != null) this._textEditingController.text = val.toString();
        // }
      },
      style: _textStyle,
      controller: _textEditingController,
      decoration: InputDecoration(
          isDense: true,
          contentPadding: EdgeInsets.all(15.0),
          labelText: this.widget.caption,
          floatingLabelBehavior: FloatingLabelBehavior.always,
          border: OutlineInputBorder(
              borderRadius: BorderRadius.circular(10),
              borderSide: BorderSide(color: Colors.green, width: 1.0))),
    );
  }

  @override
  void dispose() {
    this._textEditingController.dispose();
    super.dispose();
  }
}


//======the I use AppTextField widget inside AlertDialog like this :

import 'package:animate_do/animate_do.dart';
import 'package:flutter/material.dart';
import 'package:flutter_desktop/Views/App-Widgets/AppTextField.dart';
import 'package:flutter_desktop/Views/Room/Notification-Dialog.dart';
import 'package:flutter_desktop/Views/states/Message-State.dart';
import 'package:provider/provider.dart';

import 'Chat/ChatMessage.dart';

class SendNotificationDialog extends StatefulWidget {
  @override
  _SendNotificationDialogState createState() => _SendNotificationDialogState();
}

class _SendNotificationDialogState extends State<SendNotificationDialog> {
  String _message = "";
  @override
  Widget build(BuildContext context) {
    return AlertDialog(
      elevation: 10,
      titleTextStyle: TextStyle(
          fontSize: 20, fontWeight: FontWeight.bold, color: Colors.black),
      title: Text("رسالة تنبيه"),
      content: Builder(
        builder: (context) => _createBody(context),
      ),
      actions: [
        MaterialButton(
          onPressed: () {
            Navigator.pop(context);

            var messageState =
                Provider.of<MessageState>(context, listen: false);

            messageState.addMessage(_message, MessageType.NOTIFICATION);

            Navigator.push(
                context,
                PageRouteBuilder(
                    barrierDismissible: true,
                    opaque: false,
                    pageBuilder: (_, __, ___) => NotificationDialog(
                          userName: "Yousel : ",
                          notification: _message,
                        )));
          },
          child: Text("موافق"),
        ),
        MaterialButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text("إلغاء"),
        ),
      ],
    );
  }

  _createBody(BuildContext context) {
    return Container(
      width: 500,
      height: 100,
      child: ListTile(
        autofocus: true,
        title: AppTextField(
          initialValue: _message,
          onSubmitted: (v) {
            _message = v;
            return _message;
          },
          caption: "أدخل النص الذى سوف يشاهده الجميع",
        ),
      ),
    );
  }
}


//=======Then I push SendNotificationDialog page :

 Navigator.push(
        context,
        PageRouteBuilder(
            barrierDismissible: true,
            opaque: false,
            transitionDuration: Duration(milliseconds: 500),
            transitionsBuilder:
                (context, firstAnimation, secondAnimation, child) {
              firstAnimation = CurvedAnimation(
                  parent: firstAnimation, curve: Curves.fastLinearToSlowEaseIn);

              return ScaleTransition(
                scale: firstAnimation,
                child: child,
              );
            },
            pageBuilder: (_, __, ___) {
              return SendNotificationDialog();
            }));


1 ответ

Проблема решена, проблема возникает, когда я обертываю TextField внутри виджета ListTile, он не имеет отношения к обертке AlertDialog, я тестировал, когда удаляю ListTile, он ведет себя нормально, в противном случае я отказываюсь от символа пробела, спасибо друзьям.

Другие вопросы по тегам