Значение In alert Диалог не обновляется, а диалог оповещения не закрывается Flutter - PullRequest
0 голосов
/ 02 мая 2020

Я новичок во Flutter, я создаю приложение, которое требует диалоговое окно оповещения, которое содержит значение, значение обновляется через каждую секунду. Но в моем случае значение не обновляется, даже диалог оповещений не закрывается сам по себе.

  Timer.periodic(Duration(milliseconds: 10), (timer) {
  BuildContext dialoguecontext;
      if ((stopwatch.elapsedMilliseconds / 6000) >= 1) {
        stopwatch.stop();
        assetsAudioPlayer.stop();

          showDialog(
            context: context,
            builder: (BuildContext context) {
              dialoguecontext = context;
              return Dialog(
                child:
                new Text('Break Time Left : ${breakTime} s'),
              );
            },
          );

        while(breakTime > 0)
          {
            Future.delayed(Duration(seconds: 1));

            setState(() {
              breakTime--;
            });
          }
          breakTime = 40;
        Navigator.pop(dialoguecontext);
        ++imgnumber;
        assetsAudioPlayer.next();
        stopwatch.start();
      }
    });

Как заставить этот код работать правильно?

1 Ответ

0 голосов
/ 02 мая 2020

В showDialog вы не можете изменять никакие значения.

Следующая строка - из официальных документов.

Виджет, возвращаемый компоновщиком, не разделяет контекст с местоположением, из которого первоначально вызывается showDialog. Используйте StatefulBuilder или пользовательский StatefulWidget, если диалог должен динамически обновляться.

Итак, вам нужно использовать Stateful виджет.

Следующий минимальный код поможет вам понять больше.

class _DeleteWidgetState extends State<DeleteWidget> {
  int t = 10;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RaisedButton(
          child: Text("Press"),
          onPressed: () {
            showDialog(
                context: context,
                builder: (_) {
                  return NewWidget(t);
                });
          },
        ),
      ),
    );
  }
}

class NewWidget extends StatefulWidget {
  final int t;
  NewWidget(this.t);
  @override
  _NewWidgetState createState() => _NewWidgetState();
}

class _NewWidgetState extends State<NewWidget> {
  int newt;
  @override
  void initState() {
    super.initState();
    newt = widget.t;
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: RaisedButton(
        child: Text(newt.toString()),
        onPressed: () {
          setState(() {
            newt = newt + 1;
          });
        },
      ),
    );
  }
}
...