SetState не обновляет виджет - PullRequest
1 голос
/ 08 апреля 2020

Здравствуйте. Я пытался создать меню Mpin, используя "pin_code_text_field: ^ 1.5.1". Я уже создал файл dart для плагина pin_code_text_field и сейчас работаю, и моей следующей целью было активировать кнопку Готово, если они уже состоят из 6 цифр. на контакте, но когда я использую setState для переменной, значение меняется, но пользовательский интерфейс или кнопка не обновляются, вот код ниже. Можете ли вы предложить, что пошло не так, и какие-либо рекомендации для такого рода.

Неактивная кнопка, когда не завершен или не завершен вывод Inactive button when no pin or not complete

Активная кнопка, когда завершен вывод

Active Button when pin is complete

class _setMPin extends State<setMPin>{
TextEditingController initialPincontroller = TextEditingController(text: "");
bool initPinButtonInActive = true;
  @override
  void initState(){
    super.initState();
    initPinButtonInActive = true;
    hasError = true;
  }


    void nextPinVerification(){
    print("done success");
    controller.clear();
  }
  @override
Widget build(BuildContext context) {
    Widget initialPin = Container(
      width: 400,
      child: Column(
        children: <Widget>[
          GestureDetector(
            child: new PinCodeTextField(
              autofocus: true,
              controller: initialPincontroller,
              hideCharacter: true,
              highlight: true,
              highlightColor: Colors.blue,
              defaultBorderColor: Colors.black,
              pinBoxWidth: 60,
              pinBoxHeight: 50,
              hasTextBorderColor: Colors.green,
              maxLength: pinLength,
              hasError: hasError,
              maskCharacter: "*",
              onTextChanged: (text) {
                setState(() {
                  hasError = false;
                  initPinButtonInActive = true;
                });
              },
              onDone: (text){
                print(text.length);
                if(text.length == 6){
                  setState(() {
                    print(text.length);
                    hasError = true;
                    initPinButtonInActive = false;
                  });
                }
              },
            ),
          ),
          Visibility(
            child: Text(
              'Incorrect Pin Format',
              style: TextStyle(color: Colors.red),
            ),
            visible: hasError,
          ),
          Row(
            children: <Widget>[ Expanded(
                child:Padding(
                    padding: EdgeInsets.only(left: 5,top: 20),
                    child:  ButtonTheme(
                      minWidth: 190,
                      height: 50,
                      child: new FlatButton(
                        shape: RoundedRectangleBorder(
                            borderRadius: new BorderRadius.circular(10.0),
                            side: BorderSide(color: Colors.white)
                        ),
                        child: new Text("Done",style: TextStyle(color: Colors.white),),
                        color: Colors.blue,
                        disabledColor: Colors.blue[200],
                        onPressed: initPinButtonInActive ? null : nextPinVerification
                      ),
                    )
                )
            )],
          )

        ],
      )
    );
        return WillPopScope(
        child: MaterialApp(
      home: Scaffold(
        body: ListView(
          children: <Widget>[
            Column(
              children: <Widget>[
                initialPin,

              ],
            ),
          ],
        ),
      ),
    ),
        onWillPop: (){
          Navigator.pop(context);
    return Future.value(false);
  }
        );

  }


}

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

установить следующий код

onTextChanged: (text) {
            setState(() {
              hasError = false;
              initPinButtonInActive = true;
              if(text.length== 6 ){
              hasError = true;
              initPinButtonInActive = false;
              }
            });
          },

и удалить одну часть.

0 голосов
/ 08 апреля 2020

Я верю, что вы хотите сделать, это установить свойство text или ваш контроллер в setState, когда onDone вызывается следующим образом

 onDone: (text){
                print(text.length);
                if(text.length == 6){
                  setState(() {
                    print(text.length);
                    initialPincontroller.text = text;
                    hasError = true;
                    initPinButtonInActive = false;
                  });
                }

Надеюсь, это поможет

...