ShowDialog отображается несколько раз при флаттере

#flutter #flutter-layout

#flutter #флаттер-макет

Вопрос:

Я создаю свой собственный ProgressDialog с помощью ShowDialog, он работает, но показывает ProgressDialog несколько раз. Я публикую свой код, что я могу сделать, чтобы просто обновить свой прогресс по индикатору CircularProgress на основе значения прогресса?

Редактировать: я также пытался использовать StateBuilder, но получаю тот же результат. Я знаю, что проблема в том, что ShowDialog вызывается несколько раз, как мне предотвратить это и просто обновить прогресс?

Вызывающий пример функции :

 void uploadAndShowProgress() {
    for (double i = 0; i < 50; i  = 10) {
      Future.delayed(Duration(seconds: 1));
      _dialog.showOrUpdateProgressDialog((i*0.01));
    }
}
  

Класс ProgressDialog :

 import 'package:flutter/material.dart';
import 'package:snapik/common/utils/mediaquery.dart';

class ProgressDialog {
  bool isShowing;
  double currentProgress;
  BuildContext context;

  ProgressDialog(
      {@required BuildContext context,
      bool isShowing,
      double currentProgress}) {
    this.context = context;
    this.isShowing = isShowing ??= false;
    this.currentProgress = currentProgress ??= 0.0;
  }

  void showOrUpdateProgressDialog(double progress) {
    if (!isShowing) {
      isShowing = true;
    }

    final _dialog = await showDialog(
    context: context,
    barrierColor: Colors.black54,
    builder: (context) => StatefulBuilder(
          builder: (context, setState) {
            setState(() {
              currentProgress = progress;
            });
            return ProgressWidget(
              progress: currentProgress,
            );
          },
        ),
    barrierDismissible: true);
  }

  void hideProgressDialog() {
    if (isShowing) {
      Navigator.pop(context);
    }
  }
}

class ProgressWidget extends StatelessWidget {
  final double progress;

  ProgressWidget({@required this.progress});

  Widget build(BuildContext context) {
    return Container(
      color: Colors.black54,
      margin: EdgeInsets.all(8),
      width: MediaQueryUtils(context).width * 0.85,
      height: MediaQueryUtils(context).height * 0.15,
      child: Card(
        child: Row(
          children: [
            Flexible(
              child: Container(
                padding: EdgeInsets.all(8),
                child: CircularProgressIndicator(
                  value: progress,
                ),
              ),
              flex: 1,
            ),
            Flexible(
              child: Container(
                margin: EdgeInsets.all(4),
                child: Text(
                  'uploading...',
                  style: TextStyle(
                      fontWeight: FontWeight.w600,
                      fontSize: Theme.of(context).textTheme.headline5.fontSize),
                ),
              ),
              flex: 4,
            ),
          ],
        ),
      ),
    );
  }
}
  

Комментарии:

1. как вы вызываете uploadAndShowProgress? можете ли вы добавить больше кода

2. это происходит при нажатии кнопки. Основная проблема заключается в обновлении значений внутри ShowDialog, что является головной болью, поскольку я не могу создать синглтон для ShowDialog.

3. используете ли вы какой-либо вид управления состоянием в своем приложении?

4. @thusith.92 Я не думаю, что для этого конкретного сценария требуется statemanagement, сработало бы простое setState. JFI Я использую пакет flutter_bloc.