Home > Net >  setState not updating the value in the screen using Flutter desktop
setState not updating the value in the screen using Flutter desktop

Time:06-23

So I'm trying to update the value of the drop down list using the setState, but when I select a value from the list, the value on the screen won't be able to change

    import 'package:demo_app_admin/Custom/custom_Font.dart';
    import 'package:flutter/material.dart';
    import '/Custom/Custom_Raised_Bottun.dart';
    import '/Custom/Header.dart';
    import '/Custom/inputField.dart';
    
    class LoginView extends StatefulWidget {
      @override
      _LoginViewState createState() => _LoginViewState();
    }
    
    class _LoginViewState extends State<LoginView> {
      @override
      Widget build(BuildContext context) {
        final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
        final isKeyboard = MediaQuery.of(context).viewInsets.bottom != 0;
        String _dropdownvalue = "Global admin";
        List<String> _items = <String> ["Global admin", "Institution admin"];
        return Scaffold(
          body: Container(
            width: double.infinity,
            decoration: BoxDecoration(
              gradient: LinearGradient(begin: Alignment.topCenter, colors: [
                Colors.teal[700]!,
                Colors.teal[200]!,
                Colors.teal[400]!
              ]),
            ),
            child: Column(
              children: <Widget>[
                const SizedBox(
                  height: 80,
                ),
                if (!isKeyboard)
                  Header(
                    padding: const EdgeInsets.all(20),
                    crossAxisAlignment: CrossAxisAlignment.start,
                    head: "Welcome",
                    headTextStyle:
                        const TextStyle(color: Colors.white, fontSize: 40),
                    sizedBoxHeight: 10,
                    subtitle: "Sign In to Your Admin Account",
                    subtitleTextStyle:
                        const TextStyle(color: Colors.white, fontSize: 18),
                  ),
                Expanded(
                    child: Container(
                  decoration: const BoxDecoration(
                      color: Colors.white,
                      borderRadius: BorderRadius.only(
                        topLeft: Radius.circular(60),
                        topRight: Radius.circular(60),
                      )),
                  child: Padding(
                    padding: const EdgeInsets.all(30),
                    child: SingleChildScrollView(
                      reverse: true,
                      padding: EdgeInsets.all(32),
                      child: Form(
                        key: _formKey,
                        child: Column(
                          children: <Widget>[
                            const SizedBox(
                              height: 40,
                            ),
                            Container(
                              decoration: BoxDecoration(
                                  color: Colors.white,
                                  borderRadius: BorderRadius.circular(10)),
                              child: Column(
                                children: <Widget>[
                                  InputField(
                                    labelText: 'Email',
                                    padding: EdgeInsets.all(10),
                                    borderSide: BorderSide(color: Colors.grey),
                                    hintText: "Enter your email",
                                    color: Colors.grey,
                                    inputBorder: InputBorder.none,
                                    obscureText: false,
                                    enableSuggestion: true,
                                    autoCorrect: true,
                                    onSaved: (value) {},
                                    // (value){controller.email = value!;},
                                    validator: (value) {
                                      if (value == null) {
                                        print("ERROR");
                                      }
                                    },
                                  ),
                                  InputField(
                                    labelText: 'Password',
                                    padding: EdgeInsets.all(10),
                                    borderSide: BorderSide(color: Colors.grey),
                                    hintText: "Enter your password",
                                    color: Colors.grey,
                                    inputBorder: InputBorder.none,
                                    obscureText: true,
                                    enableSuggestion: false,
                                    autoCorrect: false,
                                    onSaved: (value) {},
                                    // (value){ controller.password = value!;},
                                    validator: (value) {
                                      if (value == null) {
                                        print("ERROR");
                                      }
                                    },
                                  ),
                                ],
                              ),
                            ),
                            const SizedBox(
                              height: 40,
                            ),
here is the issue
                            DropdownButton<String>(
                                value: _dropdownvalue,
                                icon: Icon(Icons.keyboard_arrow_down),
                                items: _items.map((String _items) {
                                  return DropdownMenuItem<String>(
                                    value: _items,
                                    child: CustomFont(text: _items),
                                  );
                                }).toList(),
                                onChanged: (value) {
                                  setState(() => _dropdownvalue = value!);
                                }),
                            const SizedBox(
                              height: 40,
                            ),
                            CustomRaisedButton(
                                width: 200,
                                height: 50.0,
                                margin: const EdgeInsets.symmetric(horizontal: 50),
                                color: Colors.teal.shade500,
                                borderRadius: BorderRadius.circular(10),
                                text: "LOGIN",
                                textColor: Colors.white,
                                fontSize: 17,
                                fontWeight: FontWeight.bold,
                                function: () {}
                                // {
                                //   _formKey.currentState?.save();
                                //   if(_formKey.currentState?.validate() !=null){
                                //     controller.signInWithEmailAndPassword();
                                //   }
                                // },
                                ),
                            SizedBox(
                              height: 10,
                            ),
                          ],
                        ),
                      ),
                    ),
                  ),
                ))
              ],
            ),
          ),
        );
      }
    }

CodePudding user response:

The issue is here, you are declaring variables inside build. Therefore, variables get reset to default value on every build. Means setState.

Declare variables outside the build method.

class _LoginViewState extends State<LoginView> {
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();

  String _dropdownvalue = "Global admin";
  List<String> _items = <String>["Global admin", "Institution admin"];
  @override
  Widget build(BuildContext context) {
    final isKeyboard = MediaQuery.of(context).viewInsets.bottom != 0;
    return Scaffold(

More about StatefulWidget.

  • Related