Измененное значение не улавливается флаттером setState

# #firebase #flutter #dart #flutter-layout #flutter-dependencies

Вопрос:

Я создаю страницу регистрации с опцией нескольких типов учетных записей. Приложение простое, поэтому у него нет никакого состояния, я использую только простое старое состояние Set, но я передаю свое измененное значение в состояние SET в виджете с отслеживанием состояния, но это происходит со мной в первый раз, когда flutter не подбирает значение в состоянии Set. Я слишком много часов чесал голову, но все та же проблема. Моя версия flutter составляет 2.5. Состояние кнопки GFRadio-это проблема, создающая проблему. Также, если я использую переключатель «простой дротик» или РадиоЛистТиль, они также создают ту же проблему

 import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:getwidget/colors/gf_color.dart';
import 'package:getwidget/components/radio/gf_radio.dart';
import 'package:getwidget/size/gf_size.dart';

class SignUpPage extends StatefulWidget {
  const SignUpPage({Key? key}) : super(key: key);

  @override
  State<SignUpPage> createState() => _SignUpPageState();
}

class _SignUpPageState extends State<SignUpPage> {
  bool _obscureText = true;
  int groupValue = 0;
  void _togglePasswordStatus() {
    setState(() {
      _obscureText = !_obscureText;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: Container(
        child: SingleChildScrollView(
          child: Column(
            children: <Widget>[
              Stack(
                children: <Widget>[
                  Image.asset(
                    "assets/loginpage.png",
                    fit: BoxFit.cover,
                  ),
                  Padding(
                    padding: EdgeInsets.only(
                      top: 250,
                    ),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: <Widget>[
                        Padding(
                          padding: EdgeInsets.only(left: 40),
                          child: Text("NewnAccount",
                              style: TextStyle(
                                  fontSize: 34, fontWeight: FontWeight.bold)),
                        ),
                        Stack(
                          children: <Widget>[
                            Padding(
                                padding: EdgeInsets.only(
                                  right: 40,
                                ),
                                child: Image.asset("assets/camera.png")),
                            Padding(
                                padding: EdgeInsets.only(right: 40, top: 70),
                                child: Text("Add Image")),
                          ],
                        )
                      ],
                    ),
                  ),
                  Padding(
                    padding: EdgeInsets.only(
                      top: 350,
                    ),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: <Widget>[
                        Padding(
                          padding: EdgeInsets.only(left: 40),
                          child: GFRadio(
                            size: GFSize.SMALL,
                            value: 2,
                            groupValue: groupValue,
                            onChanged: (value) {
                              setState(() {
                                groupValue = value;
                              });
                            },
                            inactiveIcon: null,
                            activeBorderColor: GFColors.SUCCESS,
                            radioColor: GFColors.SUCCESS,
                          ),
                        ),
                        Padding(
                          padding: EdgeInsets.only(
                            right: 40,
                          ),
                        ),
                      ],
                    ),
                  ),
                  Padding(
                    padding: EdgeInsets.only(
                      top: 400,
                    ),
                    child: Padding(
                      padding: EdgeInsets.only(left: 20, right: 20),
                      child: TextField(
                        decoration: InputDecoration(
                          hintText: "Username",
                          prefixIcon: Icon(
                            Icons.person,
                            color: Color(0xFFCF776B),
                          ),
                          enabledBorder: UnderlineInputBorder(
                            borderSide: BorderSide(color: Color(0xFFCF776B)),
                          ),
                          focusedBorder: UnderlineInputBorder(
                            borderSide: BorderSide(color: Color(0xFFCF776B)),
                          ),
                        ),
                      ),
                    ),
                  ),
                  Padding(
                    padding: EdgeInsets.only(
                      top: 470,
                    ),
                    child: Padding(
                      padding: EdgeInsets.only(left: 20, right: 20),
                      child: TextField(
                        decoration: InputDecoration(
                          hintText: "Mobile Number",
                          prefixIcon: Icon(
                            Icons.phone,
                            color: Color(0xFFCF776B),
                          ),
                          enabledBorder: UnderlineInputBorder(
                            borderSide: BorderSide(color: Color(0xFFCF776B)),
                          ),
                          focusedBorder: UnderlineInputBorder(
                            borderSide: BorderSide(color: Color(0xFFCF776B)),
                          ),
                        ),
                      ),
                    ),
                  ),
                  Padding(
                    padding: EdgeInsets.only(
                      top: 540,
                    ),
                    child: Padding(
                      padding: EdgeInsets.only(left: 20, right: 20),
                      child: TextField(
                        obscureText: _obscureText,
                        decoration: InputDecoration(
                          hintText: "Password",
                          prefixIcon: Icon(
                            Icons.lock,
                            color: Color(0xFFCF776B),
                          ),
                          suffixIcon: IconButton(
                              icon: Icon(
                                _obscureText
                                    ? Icons.visibility
                                    : Icons.visibility_off,
                              ),
                              onPressed: _togglePasswordStatus,
                              color: Color(0xFFCF776B)),
                          enabledBorder: UnderlineInputBorder(
                            borderSide: BorderSide(color: Color(0xFFCF776B)),
                          ),
                          focusedBorder: UnderlineInputBorder(
                            borderSide: BorderSide(color: Color(0xFFCF776B)),
                          ),
                        ),
                      ),
                    ),
                  ),
                  Padding(
                    padding: EdgeInsets.only(
                      top: 620,
                    ),
                    child: Center(
                      child: GestureDetector(
                        onTap: () {
                          // Navigator.push(
                          //     context,
                          //     MaterialPageRoute(
                          //         builder: (context) => SignUpPage()));
                        },
                        child: Container(
                          width: 180,
                          height: 60,
                          decoration: BoxDecoration(
                              color: Color(0xFFCF776B),
                              border: Border.all(
                                color: Color(0xFFCF776B),
                              ),
                              borderRadius:
                                  BorderRadius.all(Radius.circular(40))),
                          child: Center(
                            child: Text("Sign Up",
                                style: TextStyle(
                                    fontSize: 20,
                                    fontWeight: FontWeight.bold,
                                    color: Colors.white)),
                          ),
                        ),
                      ),
                    ),
                  ),
                  Padding(
                    padding: EdgeInsets.only(
                      top: 700,
                    ),
                    child: Center(
                      child: Text(
                        "Change Password",
                        style: TextStyle(
                            decoration: TextDecoration.underline,
                            color: Color(0xFFCF776B),
                            fontWeight: FontWeight.bold,
                            fontSize: 20),
                      ),
                    ),
                  ),
                ],
              )
            ],
          ),
        ),
      ),
    );
  }
}
 

Комментарии:

1. вы можете использовать TextEditingController

2. Можете ли вы, пожалуйста, привести какой-либо пример по этому поводу, если у вас есть какие-либо, я в замешательстве

Ответ №1:

Я думаю, что вы неправильно GFRadio поняли виджет здесь:

 GFRadio(
                            size: GFSize.SMALL,
                            value: 2,
                            groupValue: groupValue,
                            onChanged: (value) {
                              setState(() {
                                groupValue = value;
                              });
                            },
                            inactiveIcon: null,
                            activeBorderColor: GFColors.SUCCESS,
                            radioColor: GFColors.SUCCESS,
                          ),
 

Это groupValue создано для определения того, какие переключатели есть в этой группе, все переключатели в этой группе будут иметь одинаковые groupValue . И value это сделано для того, чтобы отличать переключатель от других в той же группе. Допустим, у вас есть 3 переключателя, чтобы пользователи могли выбирать свой пол(мужчина, женщина, гей;)), код может выглядеть следующим образом:

 int _value = 0;
Row(
                  children: [
                    GFRadio(
                      value: 0,
                      groupValue: 1,
                      onChanged: (value) {
                        setState(() {
                          _value = value;
                        });
                      },
                    ),
                    GFRadio(
                      value: 1,
                      groupValue: 1,
                      onChanged: (value) {
                        setState(() {
                          _value = value;
                        });
                      },
                    ),
                    GFRadio(
                      value: 2,
                      groupValue: 1,
                      onChanged: (value) {
                        setState(() {
                          _value = value;
                        });
                      },
                    ),
                  ],
                ),
 

Итак, как вы можете видеть , то, что нужно изменить в setState методе _value , — это то, а не то groupValue . Ваш код должен быть изменен на:

 //int groupValue = 0;
//replace the above line with the below line:
int _value = 0;
 

И в setState методе в GFRadio:

     setState(() {
 //groupValue = value; replace this line with below line
_value = value;
                                  });
 

Я ужасно умею объяснять, так что, если вы не понимаете, просто прокомментируйте !

Комментарии:

1. Не сработало. Если я удалю значение groupValue, GFRadio скажет, что его обязательно добавить, и со значением все будет по-прежнему

2. Можете ли вы предоставить журнал ошибок в вопросе ?