#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.