У меня есть страница, когда нажимается кнопка, появляется всплывающее окно alertBox с одним полем ввода и кнопкой отправки.
Я установил bool с именем isLoading;по умолчанию false, что должно проверять, запущен ли еще процесс.При отправке вызывается асинхронный метод, который сначала устанавливает isLoading
в значение true, отправляет данные из поля ввода на сервер и получает ответ, а затем устанавливает isLoading
в значение false.Я создал индикатор прогресса, который должен показывать, если isLoading
имеет значение true, и скрывать, когда isLoading
- false.
При нажатии кнопки «Отправить» приложение полностью уныло, и у меня нет индикатора для отображения моего пользователя.Что я делаю неправильно?Вот мой пример кода:
Кнопка, которая отображает поле оповещения:
Padding(
padding: EdgeInsets.only(top: 18.0),
child: Material(
elevation: 5.0,
child: MaterialButton(
onPressed: () => _share(),
minWidth: 250.0,
height: 62.0,
color: _green,
child: Text('Share UID',
style: TextStyle(
color: Colors.white, fontSize: 18.0)),
),
),
),
Метод, отображающий окно оповещения:
_share() async {
showDialog(
context: context,
barrierDismissible: false, // user must tap button!
builder: (BuildContext context) {
return new AlertDialog(
title: new Text(
'You are about to share your Medical Profile with this Doctor',
textAlign: TextAlign.center,
style: TextStyle(fontSize: 16.0, color: Color(0xFFCBCBCB)),
),
content: new SingleChildScrollView(
child: new ListBody(
children: <Widget>[
Padding(padding: EdgeInsets.all(10.0)),
new TextFormField(
keyboardType: TextInputType.text,
autofocus: true,
decoration: InputDecoration(
labelText: 'For How Long?',
contentPadding:
EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(2.0))),
),
validator: this._validateDuration,
controller: _durationController),
Padding(padding: EdgeInsets.all(5.0)),
Container(
key: _scaffoldKey,
child: _isLoading
? _showStatus()
: Padding(padding: EdgeInsets.all(0.0)),
),
],
),
),
actions: <Widget>[
new FlatButton(
child: new Text('Proceed'),
onPressed: () => _saveShare(),
Navigator.of(context).pop();
),
new FlatButton(
child: new Text(
'Cancel',
style: TextStyle(color: Colors.red),
),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
); }
Метод, который обрабатывает действие отправки
_saveShare() async {
setState(() {
_isLoading = true;
});
String _duration = _durationController.text;
final endPoint = '/api/patient/profile/shares';
final url = NetworkUtils.host + endPoint;
String _accessToken = await auth.getAccessToken();
var response = await http.post(Uri.encodeFull(url),
headers: {
'Authorization': 'Bearer $_accessToken',
"Accept": "application/json",
"Content-Type": "application/json"
},
body: jsonEncode({
'chcode': widget.chcode,
'expiration': _duration,
}));
setState(() {
_isLoading = false;
});
Navigator.of(context).pop();
}
Обновить ... Это show_status()
Widget _showStatus() {
return Column(
children: <Widget>[
Padding(
padding: EdgeInsets.all(2.0),
),
LinearProgressIndicator(),
],
);
}