Сбой приложения, если уже активен один «ожидающий» - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть приложение для показа мирового времени. У меня есть страница для изменения разных мест по всему миру. Это ListView.

  Widget build(BuildContext context) {

return Scaffold(
  backgroundColor: colorOne,
  appBar: AppBar(
    backgroundColor: Colors.black,
    title: Text("Change location"),
    centerTitle: true,
    elevation: 0.0,
  ),
  body: ListView.builder(
    physics: const AlwaysScrollableScrollPhysics(),
    padding: EdgeInsets.fromLTRB(5, 10, 5, 0),
    itemCount: locations.length,
    itemBuilder: (context, index) {
      return Card(
        child: ListTile(
          onTap: () {
            updateTime(index);
           ... rest code

Как видите, когда я нажимаю на ListTIle, он вызывает функцию updateTime

updateTime:

  void updateTime(index) async {
WorldTime instance = locations[index];
await instance.getTime();
Navigator.pop(context, {
  "location": instance.location,
  "flag": instance.flag,
  "time": instance.time,
  "date": instance.date,
  "isDayTime": instance.isDayTime,
});
// obtain shared preferences
final savingLastLocation = await SharedPreferences.getInstance();

// set value
savingLastLocation.setString("location", instance.location);
savingLastLocation.setString("url", instance.url);
savingLastLocation.setString("flag", instance.flag);

}

Если пользователь начинает рассылать спам на плитках в ожидании этой функции, приложение либо покажет полностью пустой серый экран, либо сбросит красный экран смерти с надписью «логическое выражение должно быть нулевым».

Как добавить какой-либо вид загрузки экрана / виджета или запретить повторный вызов функции, если она уже была вызвана один раз?

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020

Вы можете обернуть свой экран с помощью IgnorePointer, который игнорирует любой щелчок.

Создать переменную bool.

bool ignore = false;
bool methodcalled = false; // new added line variable

Теперь оберните свой эшафот с помощью IgnorePointer.

return IgnorePointer(
      ignoring: ignore,
      child: Scaffold(

теперь, установите ignore variable на true, когда пользователь нажимает на любой элемент.

onTap: () {
        setState(() {
                  ignore = true;
         });
        updateTime(index).then((_){
             setState(() {
                  ignore = false;
             });
        });
       .... rest code

Добавьте возврат в ваш метод.

 return 1


 void updateTime(index) async {
 if(!methodcalled){
    methodcalled = !methodcalled;
 }else{
    return 0;
 }

WorldTime instance = locations[index];
await instance.getTime();
Navigator.pop(context, {
  "location": instance.location,
  "flag": instance.flag,
  "time": instance.time,
  "date": instance.date,
  "isDayTime": instance.isDayTime,
});
// obtain shared preferences
final savingLastLocation = await SharedPreferences.getInstance();

// set value
savingLastLocation.setString("location", instance.location);
savingLastLocation.setString("url", instance.url);
savingLastLocation.setString("flag", instance.flag);
methodcalled = !methodcalled;  // added line 
return 1; // added line
}
0 голосов
/ 30 апреля 2020

onНажмите, как это

onPressed: () async {
                dynamic result =
                    await Navigator.pushNamed(context, '/location');
                if (result != null) {
                  setState(() {
                    data = {
                      'location': result['location'],
                      'flag': result['flag'],
                      'time': result['time'],
                      'isDateTime': result['isDateTime']
                    };
                  });
                }
              },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...