Skip to content

textInputAction on TextFormField always displays 'Done'. #55937

@Akora-IngDKB

Description

@Akora-IngDKB

Steps to Reproduce

  1. Run flutter create bug.
  2. Create a form with TextFormField and FocusNode.
class InputField extends StatelessWidget {
  final String hint;
  final TextEditingController controller;
  final FocusNode focusNode;
  final bool obscureText;
  final String Function(String value) validator;
  final VoidCallback onEditingComplete;
  final TextInputType keyboardType;
  final TextInputAction textInputAction;

  InputField({
    @required this.hint,
    @required this.controller,
    @required this.validator,
    @required this.focusNode,
    this.onEditingComplete,
    this.obscureText = false,
    this.keyboardType = TextInputType.text,
    this.textInputAction = TextInputAction.done,
  });

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.symmetric(horizontal: 20),
      child: TextFormField(
        focusNode: focusNode,
        controller: controller,
        maxLines: 1,
        expands: false,
        enableInteractiveSelection: true,
        autovalidate: true,
        obscureText: obscureText,
        textCapitalization: TextCapitalization.words,
        keyboardType: keyboardType,
        onEditingComplete: onEditingComplete,
        decoration: InputDecoration(
          border: OutlineInputBorder(
            borderRadius: BorderRadius.circular(100),
          ),
          hintText: hint,
          contentPadding: EdgeInsets.only(left: 16),
        ),
        validator: validator,
      ),
    );
  }
}
class _EmailAuthScreenState extends State<EmailAuthScreen> {
  final _formKey = GlobalKey<FormState>();

  final TextEditingController _emailController = TextEditingController();
  final TextEditingController _passController = TextEditingController();

  FocusNode _emailFocus;
  FocusNode _passFocus;

  @override
  void initState() {
    super.initState();
    _emailFocus = FocusNode();
    _passFocus = FocusNode();
  }

  @override
  void dispose() {
    _emailFocus.dispose();
    _passFocus.dispose();

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.transparent,
      ),
      body: Center(
        child: SingleChildScrollView(
          child: Form(
            key: _formKey,
            child: Column(
              mainAxisSize: MainAxisSize.min,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: <Widget>[
                Text( 
                  'Log into your account',
                  style: TextStyle(
                    fontSize: 24,
                    fontWeight: FontWeight.w600,
                  ),
                ),
                InputField(
                  focusNode: _emailFocus,
                  controller: _emailController,
                  hint: 'Email address',
                  keyboardType: TextInputType.emailAddress,
                  textInputAction: TextInputAction.next,
                  onEditingComplete: () => _passFocus.requestFocus(),
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Email cannot be empty';
                    }
                    if (!value.contains('@') || !value.contains('.')) {
                      return 'Invalid email address';
                    }
                    return null;
                  },
                ),
                SizedBox(height: 35),
                InputField(
                  focusNode: _passFocus,
                  controller: _passController,
                  hint: 'Password',
                  obscureText: true,
                  textInputAction: TextInputAction.go,
                  onEditingComplete: () {
                    _emailFocus.unfocus();
                    _passFocus.unfocus();
                  },
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Password cannot be empty';
                    }
                    if (value.length < 6) {
                      return 'Password cannot be less than 6 characters';
                    }
                    return null;
                  },
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

Results

flutter doctor -v

[√] Flutter (Channel beta, v1.17.0-3.2.pre, on Microsoft Windows [Version 10.0.18362.175], locale en-GH)
    • Flutter version 1.17.0-3.2.pre at D:\flutter
    • Framework revision 2a7bc389f2 (7 days ago), 2020-04-21 20:34:20 -0700
    • Engine revision 4c8c31f591
    • Dart version 2.8.0 (build 2.8.0-dev.20.10)

 
[√] Android toolchain - develop for Android devices (Android SDK version 29.0.1)
    • Android SDK at C:\Users\debra\AppData\Local\Android\Sdk
    • Platform android-29, build-tools 29.0.1
    • ANDROID_HOME = C:\Users\debra\AppData\Local\Android\Sdk
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b03)
    • All Android licenses accepted.

[√] Chrome - develop for the web
    • Chrome at C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

[√] Android Studio (version 3.5)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin version 39.0.3
    • Dart plugin version 191.8423
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b03)

[√] VS Code (version 1.44.2)
    • VS Code at C:\Users\debra\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.9.1

[√] Connected device (3 available)
    • SM A305F   • R58M62W011R • android-arm64  • Android 10 (API 29)
    • Chrome     • chrome      • web-javascript • Google Chrome 81.0.4044.122
    • Web Server • web-server  • web-javascript • Flutter Tools

• No issues found!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions