Search code examples
flutterdartdrop-down-menuflutter-layoutsharedpreferences

I got null from shared preference


error

enter image description here

I want like this

enter image description here

I used shared preference dependency in my project. At the initially open app 1st dropdown value must be 'howmany' and 2nd dropdown value 'which' but when selecting any other value and clicking the next button and closing the application from mobile recents and the user when reopening again then should display the value selected values by the user.

Ex:- At the initially user opens app then 1st dropdown value must be 'howmany' , 2nd 'which' and he select 1st dropdown "three" , 2nd dropdown "4th" and click next button after close the app and remove from recents apps. Later when he reopen the app must display dropdown values are "three" and "4th"

like this

enter image description here

My code


class _FamilyDetailsScreenState extends State<FamilyDetailsScreen> {
  // 1st dropdown button

  String dropdownValueMembers = 'howmany';

  // List of items in our dropdown menu
  var items = ['howmany', 'one', 'two', 'three  ', 'four    ', '5 or more'];

  void initState() {
    super.initState();
    checkValueMembers();
    checkValueNumber();
  }

  //IF "dropdownValueMembers" is empty pass "howmany" word as a initial value if al ready selected then pass the shared preference value
  checkValueMembers() {
    _getData();
  }

  _saveData(String dropdownValueMembersShared) async {
    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
    sharedPreferences.setString("data", dropdownValueMembersShared);
  }

  _getData() async {
    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
    dropdownValueMembers = sharedPreferences.getString("data") ?? "howmany";
    setState(() {});
  }
 // 2nd dropdown button

  // data which child
  String dropdownValueNumber = 'which';
//   // List of items in our dropdown menu
  var number = ['which', '1 st', '2 nd', '3 rd  ', '4 th    ', '5 th'];

  //IF "dropdownValueMembers" is empty pass "which" word as a initial value if al ready selected then pass the shared preference value
  checkValueNumber() {
    _getDataNumber();
  }

  _saveDataNumbers(String dropdownValueNumberShared) async {
    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
    sharedPreferences.setString("data2", dropdownValueNumberShared);
  }

  _getDataNumber() async {
    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
    dropdownValueMembers = sharedPreferences.getString("data2") ?? "which";
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      resizeToAvoidBottomInset: false,
      body: Container(
        child: SafeArea(
          child: Column(
            children: <Widget>[
              const Text(
                'family details',
                textAlign: TextAlign.center,
                style: TextStyle(
                  color: Colors.black,
                  fontSize: 18.00,
                  fontWeight: FontWeight.w700,
                ),
              ),
              const SizedBox(
                height: 30,
              ),
              Padding(
                padding: const EdgeInsets.only(top: 10, left: 15),
                child: Row(
                  children: <Widget>[
                    const Icon(
                      Icons.brightness_1,
                      color: Colors.black,
                      size: 10.0,
                    ),
                    const Padding(
                      padding: EdgeInsets.only(left: 13),
                      child: Text(
                        "Number of children",
                        style: TextStyle(
                            fontSize: 15, fontWeight: FontWeight.w600),
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.only(left: 2),
                      child: Container(
                        height: 25,
                        decoration: BoxDecoration(
                          boxShadow: const <BoxShadow>[
                            //apply shadow on Dropdown button
                            BoxShadow(
                                color: Color.fromRGBO(
                                    0, 0, 0, 0.37), //shadow for button
                                blurRadius: 5) //blur radius of shadow
                          ],
                          color: Colors.white,
                          borderRadius: BorderRadius.circular(15),
                        ),
                        child: DropdownButton(
                          underline: Container(),
                          borderRadius: BorderRadius.circular(20),
                          // Initial Value
                          value: dropdownValueMembers,
                          // Down Arrow Icon
                          icon: const Icon(Icons.keyboard_arrow_down),
                          // Array list of items
                          items: items.map((String items) {
                            return DropdownMenuItem(
                              value: items,
                              child: SizedBox(
                                height: 15,
                                width: 120.0, // for example
                                child: Text(items,
                                    style: const TextStyle(
                                        fontSize: 13.0,
                                        fontWeight: FontWeight.w700),
                                    textAlign: TextAlign.center),
                              ),
                            );
                          }).toList(),
                          // After selecting the desired option,it will
                          // change button value to selected value
                          onChanged: (String? newValue) {
                            setState(
                              () {
                                dropdownValueMembers = newValue!;
                              },
                            );
                          },
                        ),
                      ),
                    ),
                  ],
                ),
              ),
              const SizedBox(
                height: 25,
              ),
              Row(
                children: [
                  Padding(
                    padding: const EdgeInsets.only(left: 20),
                    child: Text('Which child'),
                  ),
                  Padding(
                    padding:
                        const EdgeInsets.only(left: 100, right: 0, top: 20),
                    child: Container(
                      height: 30,
                      decoration: BoxDecoration(
                        boxShadow: const <BoxShadow>[
                          //apply shadow on Dropdown button
                          BoxShadow(
                              color: Color.fromRGBO(
                                  0, 0, 0, 0.37), //shadow for button
                              blurRadius: 5) //blur radius of shadow
                        ],
                        color: Colors.white,
                        borderRadius: BorderRadius.circular(15),
                      ),
                      child: DropdownButton(
                        underline: Container(),
                        borderRadius: BorderRadius.circular(20),
                        // Initial Value
                        value: dropdownValueNumber,
                        // Down Arrow Icon
                        icon: const Icon(Icons.keyboard_arrow_down),
                        // Array list of items
                        items: number.map((String number) {
                          return DropdownMenuItem(
                            value: number,
                            child: SizedBox(
                              height: 17,
                              width: 120.0, // for example
                              child: Text(number,
                                  style: const TextStyle(
                                      fontSize: 13.0,
                                      fontWeight: FontWeight.w700),
                                  textAlign: TextAlign.center),
                            ),
                          );
                        }).toList(),
                        // After selecting the desired option,it will
                        // change button value to selected value
                        onChanged: (String? newNumber) {
                          setState(
                            () {
                              dropdownValueNumber = newNumber!;
                            },
                          );
                        },
                      ),
                    ),
                  ),
                ],
              ),
              const SizedBox(
                height: 60,
              ),
              Padding(
                padding: const EdgeInsets.only(bottom: 0.0, top: 150),
                child: SizedBox(
                  width: 160.0,
                  height: 35.0,
                  child: ElevatedButton(
                      style: ButtonStyle(
                        shape:
                            MaterialStateProperty.all<RoundedRectangleBorder>(
                          RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(18.0),
                            side: const BorderSide(
                              color: Colors.blueAccent,
                            ),
                          ),
                        ),
                      ),
                      onPressed: () {
                        _saveData(dropdownValueMembers);
                        _saveDataNumbers(dropdownValueNumber);
                      },
                      child: const Text('next')),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

How solve this and save 2 or more data using shared preferences?


Solution

  • On current snippet , you are assigning dropdownValueMembers from number data which doesn't contain on list. The checkValueNumber() is raising the issue.

    Also For Future method, I will suggest using FutureBuilder

    
    class FamilyDetailsScreen extends StatefulWidget {
      const FamilyDetailsScreen({super.key});
    
      @override
      State<FamilyDetailsScreen> createState() => _FamilyDetailsScreenState();
    }
    
    class _FamilyDetailsScreenState extends State<FamilyDetailsScreen> {
      // 1st dropdown button
    
      String? dropdownValueMembers;
    
      // List of items in our dropdown menu
      List<String> items = [
        'howmany',
        'one',
        'two',
        'three  ',
        'four',
        '5 or more'
      ];
    
      // data which child
      String? dropdownValueNumber;
    //   // List of items in our dropdown menu
      List<String> number = ['which', '1 st', '2 nd', '3 rd  ', '4 th    ', '5 th'];
    
      @override
      void initState() {
        super.initState();
        dropdownValueMembers = items.first;
        dropdownValueNumber = number.first;
        checkValueMembers();
        checkValueNumber();
      }
    
      checkValueMembers() {
        _getData();
      }
    
      _saveData(String dropdownValueMembersShared) async {
        SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
        sharedPreferences.setString("data", dropdownValueMembersShared);
      }
    
      _getData() async {
        SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
        dropdownValueMembers = sharedPreferences.getString("data") ?? items.first;
        setState(() {});
      }
      // 2nd dropdown button
    
      //IF "dropdownValueMembers" is empty pass "which" word as a initial value if al ready selected then pass the shared preference value
      checkValueNumber() {
        _getDataNumber();
      }
    
      _saveDataNumbers(String dropdownValueNumberShared) async {
        SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
        sharedPreferences.setString("data2", dropdownValueNumberShared);
      }
    
      _getDataNumber() async {
        SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
        dropdownValueNumber = sharedPreferences.getString("data2") ?? number.first;
        setState(() {});
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          backgroundColor: Colors.white,
          resizeToAvoidBottomInset: false,
          body: Container(
            child: SafeArea(
              child: Column(
                children: <Widget>[
                  const Text(
                    'family details',
                    textAlign: TextAlign.center,
                    style: TextStyle(
                      color: Colors.black,
                      fontSize: 18.00,
                      fontWeight: FontWeight.w700,
                    ),
                  ),
                  const SizedBox(
                    height: 30,
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 10, left: 15),
                    child: Row(
                      children: <Widget>[
                        const Icon(
                          Icons.brightness_1,
                          color: Colors.black,
                          size: 10.0,
                        ),
                        const Padding(
                          padding: EdgeInsets.only(left: 13),
                          child: Text(
                            "Number of children",
                            style: TextStyle(
                                fontSize: 15, fontWeight: FontWeight.w600),
                          ),
                        ),
                        Padding(
                          padding: const EdgeInsets.only(left: 2),
                          child: Container(
                            height: 25,
                            decoration: BoxDecoration(
                              boxShadow: const <BoxShadow>[
                                //apply shadow on Dropdown button
                                BoxShadow(
                                    color: Color.fromRGBO(
                                        0, 0, 0, 0.37), //shadow for button
                                    blurRadius: 5) //blur radius of shadow
                              ],
                              color: Colors.white,
                              borderRadius: BorderRadius.circular(15),
                            ),
                            child: DropdownButton(
                              underline: Container(),
                              borderRadius: BorderRadius.circular(20),
                              // Initial Value
                              value: dropdownValueMembers,
                              // Down Arrow Icon
                              icon: const Icon(Icons.keyboard_arrow_down),
                              // Array list of items
                              items: items.map((String data) {
                                return DropdownMenuItem(
                                  value: data,
                                  child: SizedBox(
                                    height: 15,
                                    width: 120.0, // for example
                                    child: Text(data,
                                        style: const TextStyle(
                                            fontSize: 13.0,
                                            fontWeight: FontWeight.w700),
                                        textAlign: TextAlign.center),
                                  ),
                                );
                              }).toList(),
                              // After selecting the desired option,it will
                              // change button value to selected value
                              onChanged: (String? newValue) {
                                setState(
                                  () {
                                    dropdownValueMembers = newValue!;
                                  },
                                );
                              },
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),
                  const SizedBox(
                    height: 25,
                  ),
                  Row(
                    children: [
                      Padding(
                        padding: const EdgeInsets.only(left: 20),
                        child: Text('Which child'),
                      ),
                      Padding(
                        padding:
                            const EdgeInsets.only(left: 100, right: 0, top: 20),
                        child: Container(
                          height: 30,
                          decoration: BoxDecoration(
                            boxShadow: const <BoxShadow>[
                              //apply shadow on Dropdown button
                              BoxShadow(
                                  color: Color.fromRGBO(
                                      0, 0, 0, 0.37), //shadow for button
                                  blurRadius: 5) //blur radius of shadow
                            ],
                            color: Colors.white,
                            borderRadius: BorderRadius.circular(15),
                          ),
                          child: DropdownButton(
                            underline: Container(),
                            borderRadius: BorderRadius.circular(20),
                            // Initial Value
                            value: dropdownValueNumber,
                            // Down Arrow Icon
                            icon: const Icon(Icons.keyboard_arrow_down),
                            // Array list of items
                            items: number.map((String number) {
                              return DropdownMenuItem(
                                value: number,
                                child: SizedBox(
                                  height: 17,
                                  width: 120.0, // for example
                                  child: Text(number,
                                      style: const TextStyle(
                                          fontSize: 13.0,
                                          fontWeight: FontWeight.w700),
                                      textAlign: TextAlign.center),
                                ),
                              );
                            }).toList(),
                            // After selecting the desired option,it will
                            // change button value to selected value
                            onChanged: (String? newNumber) {
                              setState(
                                () {
                                  dropdownValueNumber = newNumber!;
                                },
                              );
                            },
                          ),
                        ),
                      ),
                    ],
                  ),
                  const SizedBox(
                    height: 60,
                  ),
                  Padding(
                    padding: const EdgeInsets.only(bottom: 0.0, top: 150),
                    child: SizedBox(
                      width: 160.0,
                      height: 35.0,
                      child: ElevatedButton(
                          style: ButtonStyle(
                            shape:
                                MaterialStateProperty.all<RoundedRectangleBorder>(
                              RoundedRectangleBorder(
                                borderRadius: BorderRadius.circular(18.0),
                                side: const BorderSide(
                                  color: Colors.blueAccent,
                                ),
                              ),
                            ),
                          ),
                          onPressed: () {
                            //do null check 1st
                            _saveData(dropdownValueMembers!);
                            _saveDataNumbers(dropdownValueNumber!);
                          },
                          child: const Text('next')),
                    ),
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }