在 TextFormField Flutter 的值更改时禁用 AlertDialog 按钮

问题描述

在我的一个 Flutter 项目中,我试图从警报对话框 内的TextFormField 获取价值。我正在尝试验证输入,并基于该验证我想启用/禁用 AlertDialog 按钮。

我为显示对话框做了什么:

 _displayDialog(BuildContext context) async {
    return showDialog(
        context: context,builder: (context) {
          return AlertDialog(
            title: Text('TextField AlertDemo'),content: _container(),actions: <Widget>[
              RaisedButton(
                onpressed: isValid
                    ? () {
                        print("ISVALID:");
                      }
                    : null,child: Text("Click Me"),)
            ],);
        });
  }

_container() 方法代码

 Widget _container() {
    return Container(
      margin: EdgeInsets.all(25),child: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,children: [
            TextFormField(
              onChanged: (text) {
                setState(() {
                  if (text.length > 5) {
                    isValid = true;
                  } else {
                    isValid = false;
                  }
                });
              },decoration: Inputdecoration(labelText: 'Enter Text'),),SizedBox(height: 15),RaisedButton(
              onpressed: isValid
                  ? () {
                      print("ISVALID:");
                    }
                  : null,child: Text("Done!"),)
          ],);
  }

不幸的是,它在 Scaffold 主体中工作:

@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,children: [
          _container(),RaisedButton(
            onpressed: (){_displayDialog(context);},child: Text("Show Alert"),)
        ],);
  }

谁能帮我解决这个问题。 TIA

解决方法

复制粘贴此代码,它工作正常,我使用了 StateFullBuilder 小部件来更新 stateAlertDialogBox

有关更新或刷新 DialogBox Click HERE

的更多参考

下面是Code

import 'dart:async';

import 'package:flutter/material.dart';

class MyTimer extends StatefulWidget {
  @override
  _MyTimerState createState() => _MyTimerState();
}

class _MyTimerState extends State<MyTimer> {
  
  bool isValidAlert = false;
  bool isValidScafold = false;

  _displayDialog(BuildContext context) async {
    return showDialog(
        context: context,builder: (context) {
          return StatefulBuilder(builder: (context,setState) {
            return AlertDialog(
              title: Text('TextField AlertDemo'),content: _containerAlert(setState),actions: <Widget>[
                RaisedButton(
                  onPressed: isValidAlert
                      ? () {
                          print("ISVALID:");
                        }
                      : null,child: Text("Click Me"),)
              ],);
          });
        });
  }

  Widget _container() {
    return Container(
      margin: EdgeInsets.all(25),child: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,children: [
            TextFormField(
              onChanged: (text) {
                setState(() {
                  if (text.length > 5) {
                    isValidScafold = true;
                  } else {
                    isValidScafold = false;
                  }
                });
              },decoration: InputDecoration(labelText: 'Enter Text'),),SizedBox(height: 15),RaisedButton(
              onPressed: isValidScafold
                  ? () {
                      print("ISVALID:");
                    }
                  : null,child: Text("Done!"),)
          ],);
  }

  Widget _containerAlert(StateSetter setState) {
    return Container(
      margin: EdgeInsets.all(25),children: [
            TextFormField(
              onChanged: (text) {
                setState(() {
                  if (text.length > 5) {
                    isValidAlert = true;
                  } else {
                    isValidAlert = false;
                  }
                  print(text);
                });
              },RaisedButton(
              onPressed: isValidAlert
                  ? () {
                      print("ISVALID:");
                    }
                  : null,);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,children: [
          _container(),RaisedButton(
            onPressed: () {
              _displayDialog(context);
            },child: Text("Show Alert"),)
        ],);
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...