#flutter #listview #tags
Вопрос:
Я создаю плитку расширения , и на ней отображаются дни с использованием ListView.builder
и CheckboxListTile
, а затем, если пользователь установит флажок, он отобразит add icon
и при нажатии на него появится диалоговое окно, в котором пользователь должен ввести from time
и to time
, а затем нажать кнопку «Отправить», он отобразит тег с названием тех времен.
Проблема: Итак, он работает, но неправильно, допустим, когда я устанавливаю флажок в понедельник и делаю то же самое, он отображает теги, но когда я устанавливаю флажок во вторник, он также отображает тот же тег, который я создал для понедельника, и когда я удаляю теги, он удаляет как понедельник, так и вторник.
вот код плитки расширения (я создал пользовательскую)
Listlt;CheckBoxListTileModelForTokengt; checkBoxListTileModelForToken =CheckBoxListTileModelForToken.getUsers(); Listlt;Stringgt; _timingTagListForToken=[]; customExpansionTile(context, "Token Distribution Time", true, Icon(Icons.timer, color: HexColor("#5344ed")), lt;Widgetgt;[ Container( child: Row( children: [ Expanded( child: SizedBox( height: MediaQuery.of(context).size.height * 0.45, child: ListTile( title: ListView.builder( itemCount: checkBoxListTileModelForToken.length, itemBuilder: (BuildContext context, int index) { return new Card( child: new Container( padding: new EdgeInsets.all(10.0), child: Column( children: lt;Widgetgt;[ new CheckboxListTile( controlAffinity:ListTileControlAffinity.leading, activeColor: HexColor("#5344ed"), dense: true, title: new Text( checkBoxListTileModelForToken[index].title, style: TextStyle( fontSize: 14, fontWeight: FontWeight.w600, letterSpacing: 0.5), ), value: checkBoxListTileModelForToken[index].isCheck? true:false, secondary: Container( alignment:Alignment.centerRight, height: MediaQuery.of(context).size.height*0.9, width: MediaQuery.of(context).size.width *0.2, child:checkBoxListTileModelForToken[index].isCheck ==true? IconButton( tooltip:"Pick Time", onPressed: () { _tokenTimeDialogue( checkBoxListTileModelForToken[index].id); }, icon: Icon(Icons.add,color: HexColor("#5344ed"),) ) : null), onChanged: (bool? val) { itemChangeforToken(val!, index); }), SizedBox10(), Wrap( direction:Axis.horizontal, children:[ Container( child:checkBoxListTileModelForToken[index].isCheck? Tags( itemCount: _timingTagListForToken.length, itemBuilder: (int index){ return ItemTags( key: Key(index.toString()), activeColor:HexColor("#5344ed"), index: index, // required title: _timingTagListForToken[index], textStyle: TextStyle( fontSize: 14, ), combine: ItemTagsCombine.withTextBefore, removeButton: ItemTagsRemoveButton( backgroundColor:HexColor("#5344ed"), onRemoved: (){ setState(() { _timingTagListForToken.removeAt(index); }); return true; }, ), onPressed: (item) =gt; print(item), onLongPressed: (item) =gt; print(item), ); },):Padding( padding: const EdgeInsets.only(left: 70), child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: []))), ])]), ), ); }), ))), ), ], )) ]), ], );
Дни занятий
class CheckBoxListTileModelForToken { int id; String title; bool isCheck; CheckBoxListTileModelForToken({required this.id,required this.title, required this.isCheck}); static Listlt;CheckBoxListTileModelForTokengt; getUsers() { return lt;CheckBoxListTileModelForTokengt;[ CheckBoxListTileModelForToken(id:1,title: "Monday", isCheck: true,), CheckBoxListTileModelForToken(id:2,title: "Tue", isCheck: false), CheckBoxListTileModelForToken(id:3,title: "Wed", isCheck: false), CheckBoxListTileModelForToken(id:4,title: "Thu", isCheck: false), CheckBoxListTileModelForToken(id:5,title: "Fri", isCheck: false), CheckBoxListTileModelForToken(id:6,title: "Sat", isCheck: false), CheckBoxListTileModelForToken(id:7,title: "Sun", isCheck: false), ]; } }
_tokenTimeDialogue (dialogue box where user have to enter from
and to
time)
_tokenTimeDialogue(dynamic id) { AlertDialog alert = AlertDialog( scrollable: true, insetPadding: EdgeInsets.symmetric(vertical: 50), title: Text("Add timing of the day", style: TextStyle(fontWeight: FontWeight.bold, color: HexColor("#5344ed"))), content: Container( child: SingleChildScrollView( scrollDirection: Axis.vertical, child: Column(children: lt;Widgetgt;[ textfieldforTimeDialogue( context, () async { TimeOfDay? pickedTime = await showTimePicker( initialTime: TimeOfDay.now(), context: context, ); if (pickedTime != null) { // print(pickedTime.format(context)); // DateTime parsedTime = DateFormat.jm() // .parse(pickedTime.format(context).toString()); // String formattedTime = // DateFormat('HH:mm').format(parsedTime); setState(() { fromTimeForToken.text = pickedTime.format(context); }); } else { print("Time is not selected"); } }, Icons.timer_off, fromTimeForToken, "From", "From", ), SizedBox20(), textfieldforTimeDialogue( context, () async { FocusScope.of(context).unfocus(); TimeOfDay? pickedTime = await showTimePicker( initialTime: TimeOfDay.now(), context: context, ); if (pickedTime != null) { // DateTime parsedTime = DateFormat.jm() // .parse(pickedTime.format(context).toString()); // String formattedTime = // DateFormat('HH:mm').format(parsedTime); setState(() { toTimeForToken.text = pickedTime.format(context); }); } else { print("Time is not selected"); } }, Icons.timer_off, toTimeForToken, "To", "To", ), ]), )), actions: [ TextButton( onPressed: () { setState(() { print("id " id.toString()); print(fromTimeForToken.text); print(toTimeForToken.text); _timingTagListForToken.add(fromTimeForToken.text "-" toTimeForToken.text); print(_timingTagListForToken); fromTimeForToken.text=""; toTimeForToken.text=""; }); Navigator.pop(context); }, child: Text( "Submit", style: TextStyle( fontWeight: FontWeight.bold, color: HexColor("#5344ed"), fontSize: 20), ), ) ]); showDialog( context: context, builder: (BuildContext context) { return alert; }, ); }
setState(() { checkBoxListTileModelForToken[index].isCheck = val; }); }
пожалуйста, помогите, как это сделать.