Flutter ExpansionTile сбрасывается при запуске SetState в onExpansionChanged - PullRequest
1 голос
/ 19 февраля 2020

Когда Flutter ExpansionTile и DropdownButton сбрасываются, выполняется SetState в onExpansionChanged.

У меня есть DropdownButton и ExpansionTile на моей странице. Заполнение ExpansionTile на основе данных из DropDownButton.

При нажатии на ExpansionTile он сбрасывается и обновляется. Я думаю, что это вызвано выпадающим и setState. Потому что DropDownButton также сбрасывает и обновляет себя.

Моя проблема заключается в следующем: https://drive.google.com/file/d/1lNo1mvz0y2WYFI1oIipf5pZKsPlVu3b8/view

сброс моего ExpansionTile из-за setState. также мой сброс выпадающего из-за setState

Спасибо.

MY DropDownButton

List<Year> _years = Year.getYears();
List<DropdownMenuItem<Year>> _dropdownMenuItemYear;
Year _selectedYear;

@override
  void initState() {
    _dropdownMenuItemYear = buildDropdownMenuYearItems(_years);
    _selectedYear = _dropdownMenuItemYear[1].value;

    super.initState();
  }

List<DropdownMenuItem<Year>> buildDropdownMenuYearItems(List years) {
    List<DropdownMenuItem<Year>> items = List();
    for (Year year in years) {
      items.add(DropdownMenuItem(
        value: year,
        child: Text(year.year),
      ));
    }
    return items;
  }

  onChangeDropdownYearItem(Year selectedYear) {
    setState(() {
      _selectedYear = selectedYear;
    });
  }


ButtonTheme(
     alignedDropdown: true,
     child: DropdownButton(
     isExpanded: true,
     value: _selectedYear,
     items: _dropdownMenuItemYear,
     onChanged: onChangeDropdownYearItem,
     icon: Icon(Icons.keyboard_arrow_down),
     iconSize: 20.0,
     iconEnabledColor: MyColors.grey,
      underline: Container(
        decoration: const BoxDecoration(
      border: Border(
         bottom: BorderSide.none)),
     ),
     style: TextStyle(
     color: MyColors.greyDark,
       fontSize: deviceType ? 11.5 : 17.5 )))


class Year {
  String year;

  Year(this.year);

  static List<Year> getYears() {
    DateTime now = DateTime.now();
    return <Year>[
      for (int i = 0; i < 11; i++) Year((now.year + 1 - i).toString())
    ];
  }
}

MY ExpansionTile


FutureBuilder<APIResponse<List<TestModel>>>(
   future: TestService.getTestList(context, _selectedMonthValue, _selectedYear.year),
   builder: (context, snapshot) {
         if (snapshot.connectionState != ConnectionState.done) {
               return Container(child: Text('no year'));   }

   return snapshot.hasData ? 
            Column( children: <Widget>[
                       ListView.builder(
                            key: Key('builder ${selected.toString()}'),
                            shrinkWrap: true,
                            physics: NeverScrollableScrollPhysics(),
                            itemCount: snapshot.data.count,
                            itemBuilder: (context, index) {
                                 return Column(
                                     children: <Widget>[
                                       Divider(
                                          height: 0.0,
                                           color: MyColors.white,
                                        ),
                          Theme(
                             data: theme,
                             child: ExpansionTile(
                             key: Key(index.toString()),
                             initiallyExpanded: index == selected,
                             title: Column( children: <Widget>[
                                         Row(children: <Widget>[
                                             Column(children:<Widget>[                  
                                               Text(snapshot.data.source[index].eventDate)),
                                               Text(snapshot.data.source[index].month),
                                            ]),
                                            Expanded(child:  
                                                 Padding(padding: EdgeInsets.all(10),
                                                    child: Column( children: <Widget>[
                                                       Padding(padding: EdgeInsets.all(7.5),
                                                         child:Text(snapshot.data.source[index].name,)
                                                    )])))
                                             ])] )
                                              children: <Widget>[
                                               Container(
                                                 child: Padding( padding: EdgeInsets.all(15),
                                                 child:Text(snapshot.data.source[index].description)),
                                            )],
                                              onExpansionChanged: ((newState) {
                                                  if (newState)
                                                        setState(() {
                                                          selected = index;
                                                        });
                                                  else
                                                        setState(() {
                                                          selected = -1;
                                                        });
                                                    }))),
                                          ]);
                                      })])
                              : CircularProgressIndicator();
                        }),

...