Я использую Stream Builder для получения данных из Esp32 BLE в свое приложение Flutter, я обнаруживаю припадки в своем приложении, поэтому я использовал условие currentValue = 2, если происходит припадок, и перехожу на другую страницу. Но другая страница вызывается много раз, пока не перестанет приходить текущее значение = 2. Как я могу вызвать страницу только один раз, если условие удовлетворяет, а значение 2 продолжает поступать?
Это моя code of Stream Builder
, где страница вызывается, когда текущее значение становится равным 2:
StreamBuilder<List<int>>(
stream: stream,
initialData: lastValue,
builder: (BuildContext context,
AsyncSnapshot<List<int>> snapshot) {
if (snapshot.hasError)
return Text(
'Error: ${snapshot.error}',
style: TextStyle(
fontFamily: 'SF Pro Display',
fontSize: 19,
color: const Color(0xffffffff),
fontWeight: FontWeight.w500,
height: 1.4736842105263157,
),
);
if (snapshot.connectionState ==
ConnectionState.active) {
//var currentValue = _dataParser(snapshot.data);
var currentVal =
snapshot.data.toString();
int currentValue = int.parse(
currentVal.substring(
1, currentVal.length - 1),
onError: (source) => -1); // 33
print("String data $currentValue");
if (currentValue == 2) {
return FutureBuilder(
future: Future.delayed(
const Duration(seconds: 0),
() async {
Seziurealert();
}
),
builder: (context, snapshot) {
// setState(() {
// currentValue = 0;
// });
return Text(
'Seizure Occurred',
style: TextStyle(
fontFamily: 'SF Pro Display',
fontSize: 19,
color: const Color(0xffffffff),
fontWeight: FontWeight.w500,
height: 1.4736842105263157,
),
);
});
} else if (currentValue == 0) {
return Text(
'Device not calibrated',
style: TextStyle(
fontFamily: 'SF Pro Display',
fontSize: 19,
color: const Color(0xffffffff),
fontWeight: FontWeight.w500,
height: 1.4736842105263157,
),
);
} else if (currentValue == 1) {
return Text(
'$currentValue',
style: TextStyle(
fontFamily: 'SF Pro Display',
fontSize: 19,
color: const Color(0xffffffff),
fontWeight: FontWeight.w500,
height: 1.4736842105263157,
),
);
}
return Text(
'$currentValue',
style: TextStyle(
fontFamily: 'SF Pro Display',
fontSize: 19,
color: const Color(0xffffffff),
fontWeight: FontWeight.w500,
height: 1.4736842105263157,
),
);
} else {
return Text(
'Check the stream',
style: TextStyle(
fontFamily: 'SF Pro Display',
fontSize: 19,
color: const Color(0xffffffff),
fontWeight: FontWeight.w500,
height: 1.4736842105263157,
),
);
}
},
),
Функция оповещения о приступе:
Seziurealert(){
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(
builder: (context) {
return TriggeringAlert(
device:
widget.device);
},
),
(route) => false,
);
}
Я также пытался использовать это, но происходило то же самое, что и с Future Builder:
SchedulerBinding.instance.addPostFrameCallback((_) {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(
builder: (context) {
return TriggeringAlert(
device:
widget.device);
},
),
(route) => false,
);
Это изображение моей страницы, которое вызывается при возникновении значения 2. Эта страница продолжает отображаться до тех пор, пока таймер не истечет 10 секунд или я не нажму кнопку отмены. Но в моем случае, даже если 10 секунд таймера истекли, страница вызывается снова ИЛИ если я нажимаю кнопку отмены, в этом случае страница также вызывается снова.
Пожалуйста, помогите мне, как я могу избежать этого, поскольку я новичок во Flutter.