Передача данных из одного виджета с отслеживанием состояния в другой виджет с отслеживанием состояния

#flutter #dart

Вопрос:

Я пытаюсь отфильтровать значения между(от 350 до 750). Я использую два виджета с отслеживанием состояния, ползунок диапазона помещен в «ShowModalBottomSheet». Пользователь нажмет кнопку, чтобы открыть модальный ползунок диапазона. Как только пользователь выберет значение и даст «Применить», я хочу обновить состояние в другом виджете с отслеживанием состояния. К сожалению, я не смог обновить второй виджет с отслеживанием состояния, в котором у меня есть значение. Я не пользуюсь услугами какого-либо провайдера. Я новичок в flutter, я пытаюсь достичь этого с помощью setstate. Когда я нажимаю кнопку Применить, состояние не обновляется, но когда я даю горячую перезагрузку, фильтр применяется. Любой может указать мне, где я совершаю ошибки. Заранее спасибо!

 @override  Widget build(BuildContext context) {  return SafeArea(  child: Scaffold(  body: Column(  mainAxisAlignment: MainAxisAlignment.spaceEvenly,  children: [  Align(  alignment: Alignment.topLeft,  child: IconButton(  onPressed: () {  setState(() {  for (var i = 0; i lt; listObject.length; i  ) {  listObject[i].isSelected = false;  }  });  _FluorsCardState.selectedCheckbox = [];   Navigator.of(context).pop();  },  icon: Icon(Icons.arrow_back)),  ),  Padding(  padding: EdgeInsets.only(left: 24, right: 24, bottom: 18),  child: Container(  decoration: BoxDecoration(  gradient: LinearGradient(colors: [  ZookaAppTheam.nearlyDarkBlue,  HexColor("#6F56E8")  ], begin: Alignment.topLeft, end: Alignment.bottomRight),  borderRadius: BorderRadius.only(  topLeft: Radius.circular(8.0),  bottomLeft: Radius.circular(8.0),  bottomRight: Radius.circular(8.0),  topRight: Radius.circular(68.0)),  boxShadow: lt;BoxShadowgt;[  BoxShadow(  color: ZookaAppTheam.grey.withOpacity(0.6),  offset: Offset(1.1, 1.1),  blurRadius: 10.0),  ],  ),  child: Stack(alignment: Alignment.bottomLeft, children: [  Padding(  padding: const EdgeInsets.all(8.0),  child: Column(  mainAxisAlignment: MainAxisAlignment.center,  crossAxisAlignment: CrossAxisAlignment.start,  children: lt;Widgetgt;[  Text(  '',  textAlign: TextAlign.left,  style: TextStyle(  fontFamily: ZookaAppTheam.fontName,  fontWeight: FontWeight.normal,  fontSize: 14,  letterSpacing: 0.0,  color: ZookaAppTheam.white,  ),  ),  Padding(  padding: const EdgeInsets.only(top: 8.0),  child: Text(  toolListData[widget.selectedIndex].titleTxt,  textAlign: TextAlign.left,  style: TextStyle(  fontFamily: ZookaAppTheam.fontName,  fontWeight: FontWeight.normal,  fontSize: 46,  letterSpacing: 0.0,  color: ZookaAppTheam.white,  ),  ),  ),  SizedBox(  height: 32,  ),  Padding(  padding: const EdgeInsets.only(right: 4),  child: Row(  crossAxisAlignment: CrossAxisAlignment.end,  mainAxisAlignment: MainAxisAlignment.center,  children: lt;Widgetgt;[  Expanded(  child: SizedBox(),  ),  Container(  decoration: BoxDecoration(  color: ZookaAppTheam.nearlyWhite,  shape: BoxShape.circle,  boxShadow: lt;BoxShadowgt;[  BoxShadow(  color: ZookaAppTheam.nearlyBlack  .withOpacity(0.4),  offset: Offset(8.0, 8.0),  blurRadius: 8.0),  ],  ),  child: Padding(  padding: const EdgeInsets.all(0.0),  child: Icon(  Icons.biotech_outlined,  color: HexColor("#6F56E8"),  size: 44,  ),  ),  )  ],  ),  )  ],  ),  ),  Padding(  padding: const EdgeInsets.all(16.0),  child: Row(  mainAxisAlignment: MainAxisAlignment.start,  children: [  ElevatedButton(  style: ButtonStyle(  backgroundColor:  MaterialStateProperty.all(Colors.white)),  onPressed: () {  setState(() {  isCheckBoxEnabled = !isCheckBoxEnabled;  });  },  child: Container(  decoration: BoxDecoration(  borderRadius: BorderRadius.circular(10),  ),  height: 40,  width: MediaQuery.of(context).size.width / 4.3,  child: Center(  child: Text(  "Compare Mode",  style: TextStyle(color: Colors.deepPurpleAccent),  textAlign: TextAlign.center,  )),  ),  ),  SizedBox(  width: 10,  ),  isCheckBoxEnabled  ? ElevatedButton(  style: ButtonStyle(  backgroundColor: MaterialStateProperty.all(  Colors.white)),  onPressed: () {  setState(() {});   if (_FluorsCardState.selectedCheckbox.length gt;  0) {  Navigator.of(context).push(  MaterialPageRoute(  builder: (BuildContext context) {  return GraphView(  moleculesList:  toolList[widget.selectedIndex],  selectedMolecule:  _FluorsCardState.selectedCheckbox,  );  }));  } else {  final snackBar = SnackBar(  content: const Text(  'Select atleast 1 flour'),  action: SnackBarAction(  label: 'close',  onPressed: () {  // Some code to undo the change.  },  ));   ScaffoldMessenger.of(context)  .showSnackBar(snackBar);  }  print(  "${_FluorsCardState.selectedCheckbox.length}");  },  child: Container(  decoration: BoxDecoration(  borderRadius: BorderRadius.circular(10),  ),  height: 40,  width: MediaQuery.of(context).size.width / 4,  child: Center(  child: Text(  "Compare",  style: TextStyle(  color: Colors.deepPurpleAccent),  textAlign: TextAlign.center,  )),  ),  )  : Container()  ],  ),  ),  ]),  ),  ),  Padding(  padding: const EdgeInsets.symmetric(horizontal: 24),  child: Row(  mainAxisAlignment: MainAxisAlignment.spaceBetween,  children: [  Row(  children: [  IconButton(  onPressed: () {  setState(() {  SetModalSheet(context);  });  },  icon: Icon(Icons.sort)),  ],  ),  Container(  child: TextField(  enabled: true,  textAlign: TextAlign.left,  showCursor: true,  toolbarOptions: ToolbarOptions(copy: false, cut: false),  autofillHints: ["Search"],  onChanged: (value) {  setState(() {  Listlt;MoleculesDataListgt; backUpList =  toolList[widget.selectedIndex];   var updatedList =  this.newSearchList.where((element) {  print(element.flourName);  var flourTitle = element.flourName.toLowerCase();  return flourTitle.contains(value);  }).toList();   this.listObject =  value.length == 0 ? backUpList : updatedList;   print(  "searchValue $value ${value.length}--- ${updatedList.length} ${backUpList.length}");  });  },  autocorrect: true,  textAlignVertical: TextAlignVertical.top,  keyboardType: TextInputType.text,  cursorHeight: 30,  decoration: InputDecoration(  filled: false,  focusColor: Colors.black,  suffixIcon: Icon(Icons.search),  enabled: true,  fillColor: Colors.white70,  border: OutlineInputBorder()),  ),  height: 40,  width: MediaQuery.of(context).size.width / 1.6,  decoration: BoxDecoration(  color: Colors.white70,  borderRadius: BorderRadius.circular(5),  boxShadow: [  BoxShadow(color: Colors.black54),  ])),  Row(  children: [  IconButton(  onPressed: () {  setState(() {  isSorted = !isSorted;  });  },  icon: Icon(Icons.sort_by_alpha_outlined))  ],  ),  ],  ),  ),  Expanded(  child: Container(  color: Colors.white.withOpacity(0.0),  height: MediaQuery.of(context).size.height / 1.5,  child: FluorsCard(  key: super.widget.key,  dnaListData: this.listObject,  selectedIndex: widget.selectedIndex)),  ),  ],  ),  ),  );  }   void SetModalSheet(context) {  RangeValues rangeValues = const RangeValues(400, 700);   showModalBottomSheet(  shape: RoundedRectangleBorder(),  context: context,  builder: (BuildContext c) {  return StatefulBuilder(  builder: (BuildContext context,  void Function(void Function()) setState) {  return Container(  height: 250,  child: Column(  mainAxisAlignment: MainAxisAlignment.spaceBetween,  crossAxisAlignment: CrossAxisAlignment.start,  children: [  Padding(  padding: const EdgeInsets.symmetric(  horizontal: 24, vertical: 24),  child: Text(  "Filter",  style: ZookaAppTheam.title,  ),  ),  Flexible(  fit: FlexFit.loose,  child: Container(  height: 180,  child: SliderTheme(  data: SliderTheme.of(context).copyWith(  activeTrackColor: Colors.pink,  inactiveTrackColor: Color(0xFF8D8E98),  thumbColor: Color(0xFFEB1555),  thumbShape:  RoundSliderThumbShape(enabledThumbRadius: 15),  overlayShape:  RoundSliderOverlayShape(overlayRadius: 30.0),  overlayColor: Color(0x29EB1555),  showValueIndicator: ShowValueIndicator.always,  ),  child: RangeSlider(  values: rangeValues,  min: 350,  max: 750,  labels: RangeLabels(  '${rangeValues.start.round()}',  '${rangeValues.end.round()}'),  // divisions: 10,   onChanged: (RangeValues newValue) {  setState(() {  rangeValues = newValue;  rangeStartValue = newValue.start;  rangeEndValue = newValue.end;  });  print(  "sliderRangeMethod: $rangeStartValue $rangeEndValue");  },  ),  ),  ),  ),  Padding(  padding: const EdgeInsets.all(8.0),  child: Row(  mainAxisAlignment: MainAxisAlignment.spaceEvenly,  children: [  GestureDetector(  onTap: () {  // WidgetsBinding.instance?.addPostFrameCallback(  // (_) =gt; setState(() {}));  setState(() {  int startValue = rangeStartValue.toInt();  int endValue = rangeEndValue.toInt();  print("sliderRangeMethod2 $startValue $endValue");  Listlt;MoleculesDataListgt; backUpList =  toolList[widget.selectedIndex];  this.newSearchList =  // ignore: can_be_null_after_null_aware  this.newSearchList?.where((element) {  int emissionValue = element.emission;   print((element.emission gt; startValue)  .toString());   return (element.emission gt;= startValue amp;amp;  element.emission lt;= endValue);  }).toList();   listObject = this.newSearchList.length lt;  backUpList.length  ? this.newSearchList  : backUpList;  print(this.newSearchList.length.toString());  print("ListObject: "    listObject.length.toString()    backUpList.length.toString());  Navigator.of(context).pop();   });   setState((){   });  },  child: Container(  decoration: BoxDecoration(  color: Colors.redAccent,  borderRadius: BorderRadius.circular(10)),  height: 50,  width: MediaQuery.of(context).size.width / 2.5,  child: Center(  child: Text(  "Apply123",  style: ZookaAppTheam.title,  )),  ),  ),  GestureDetector(  onTap: () {  Navigator.of(context).pop();  return Container();  // setState(() {});  },  child: Container(  decoration: BoxDecoration(  color: Colors.redAccent,  borderRadius: BorderRadius.circular(10)),  height: 50,  width: MediaQuery.of(context).size.width / 2.5,  child: Center(  child: Text(  "Cancel",  style: ZookaAppTheam.title,  )),  ),  )  ],  ),  )  ],  ));  },  );  });  } }