skip to Main Content

I am currently creating a dropdown where the value of it should by dynamic depending the selected value that I am going to use in different widget. This is my current dropdown stateful widget:

periodic_modal.dart

extension StringExtension on String {
    String capitalize() {
      return "${this[0].toUpperCase()}${this.substring(1).toLowerCase()}";
    }
}


class DropDown1 extends StatefulWidget {
  DropDown1({super.key});

  @override
  State<DropDown1> createState() => _DropDown1State();
}

class _DropDown1State extends State<DropDown1> {
  String? selectedMonth;
  String? selectedYear;
  
  @override
  Widget build(BuildContext context) {
    print("Selection month = ${Selection.currMonth}");
    return Row(
      children: [
        DropdownButton(
      // isExpanded: true,
          hint: Text("Pilih Bulan"),
          underline: Container(
            height: 2,
            color: Colors.black,
          ),
          icon: Visibility(visible: false, child: Icon(Icons.arrow_downward)),
          items: months
              .map((item) => DropdownMenuItem<String>(
                    value: item,
                    child: Text(
                      item,
                      style: const TextStyle(
                        fontSize: 14,
                        color: Colors.black,
                      ),
                      overflow: TextOverflow.ellipsis,
                    ),
                  ))
              .toList(),
          value: Selection.currMonth.capitalize().isEmpty?null:Selection.currMonth.capitalize(),
          onChanged: (value) {
            setState(() {
              selectedMonth = value as String;
              Selection.currMonth = value as String;
              Selection.nextMonth = value as String;
            });
          },
        ),

        SizedBox(
          width: 50,
        ),

        DropdownButton(
          underline: Container(
            height: 2,
            color: Colors.black,
          ),
          icon: Visibility(visible: false, child: Icon(Icons.arrow_downward)),
          items: years
              .map((item) => DropdownMenuItem<String>(
                    value: item,
                    child: Text(
                      item,
                      style: const TextStyle(
                        fontSize: 14,
                        color: Colors.black,
                      ),
                      overflow: TextOverflow.ellipsis,
                    ),
                  ))
              .toList(),
          hint: Text("Pilih Tahun"),
          value: Selection.currYear == -1 ? null : Selection.currYear.toString(),
          onChanged: (value) {
            setState(() {
              // selectedYear = value as String;
            
              Selection.currYear = value as int;
              print("value = ${value} selection currYear = ${Selection.currYear}");
              print("Selection.currYear = ${Selection.currYear}");
              Selection.nextYear = value as int;
              print("Selection.nextYear = ${Selection.nextYear}");
            });
          })
      ],
    );
  }
}

home_page.dart (Part of this whole file)

class Selection{
  static int _currYear = 0;
  static String _currMonth = "";
  static int _nextYear = 0;
  static String _nextMonth = "";

  static int get currYear => _currYear;
  static String get currMonth => _currMonth;
  static int get nextYear => _nextYear;
  static String get nextMonth => _nextMonth;

  static set currYear(int value) => _currYear = value;
  static set currMonth(String value) => _currMonth = value;
  static set nextYear(int value) => _nextYear = value;
  static set nextMonth(String value) => _nextMonth = value;
}

after I did a small debugging, I have an inkling that there is something wrong on this part of code within periodic_model.dart

onChanged: (value) {
            setState(() {
              // selectedYear = value as String;
            
              Selection.currYear = value as int;
              print("value = ${value} selection currYear = ${Selection.currYear}");
              print("Selection.currYear = ${Selection.currYear}");
              Selection.nextYear = value as int;
              print("Selection.nextYear = ${Selection.nextYear}");
            });
          })

if I write print("value = ${value} selection currYear = ${Selection.currYear}"); above Selection.currYear = value as int; it prints successfully before I get the error. But if I did it the way I do it in the snippet – I got the error without print the print, therefore I assume there is something wrong in Selection.currYear = value as int; although I am not 100% sure.

How should I fix this?

//Edit

this is the list for years

final List<String> years = [
  '2022',
  '2021',
  '2020',
  '2019',
  '2018',
  '2017',
  '2016',
  '2015',
  '2014',
  '2013',
  '2012',
  '2011',
  '2010',
  '2009',
];

//Edit 2:
This is the class for Selection that is placed in home_page.dart

class Selection{

  static List<List<Map<String,String>>> dataDummy = dummy;
  static int _currYear = 0;
  static String _currMonth = "";
  static int _nextYear = 0;
  static String _nextMonth = "";

  static int get currYear => _currYear;
  static String get currMonth => _currMonth;
  static int get nextYear => _nextYear;
  static String get nextMonth => _nextMonth;

  static set currYear(int value) => _currYear = value;
  static set currMonth(String value) => _currMonth = value;
  static set nextYear(int value) => _nextYear = value;
  static set nextMonth(String value) => _nextMonth = value;
  
}

2

Answers


  1. Chosen as BEST ANSWER

    I managed to find the answer, however I am not entirely sure if my approach is the right one or not but for this particular problem, it manages to fix it.

    Within setState() on the line of

    Selection.currYear = value as int;
    

    I change it to

    Selection.currYear = int.parse(value??"0");
    

    and I also did it for

    Selection.nextYear = value as int;
    

    too


  2. I guess years data is List<String>.

     int.parse(value);
    

    Insert upper line before Selection.currYear = value as int;

    Hope to working well. Happy Coding 🧑‍💻

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search