Flutter:如何从Provider的HTTP方法获取状态码修改弹窗文本
如何在Flutter中通过Provider传递HTTP请求状态码到页面并显示对应弹窗
步骤1:修改Provider类,记录请求状态码和错误信息
在ReservationList类中添加状态码、错误信息的变量,同时将addReservation改造为异步方法,完整处理请求成功/失败的情况:
import 'dart:convert'; import 'package:apetit_project/models/reservation.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; class ReservationList with ChangeNotifier { List<Reservation> _items = []; List<Reservation> get items => [..._items]; int get itemsCount => _items.length; // 存储最后一次请求的状态码 int? _lastStatusCode; int? get lastStatusCode => _lastStatusCode; // 存储错误信息(可选,用于更精准的提示) String? _errorMessage; String? get errorMessage => _errorMessage; Future<void> addReservation(Reservation reservation) async { // 重置状态 _errorMessage = null; _lastStatusCode = null; try { final response = await http.post( Uri.parse('http://\$url/ords/apiteste/integrafoods/reservas'), headers: <String, String>{ 'Content-Type': 'application/json; charset=UTF-8', }, body: jsonEncode({ "id_usuario": reservation.userId.toString(), "usu_inclusao": reservation.userName.toString(), "id_cardapio": reservation.menuId.toString(), "hora_almoco": reservation.resTime.toString(), "cancelado_sn": reservation.canceledYn.toString(), 'servido_sn': reservation.servedYn.toString(), }), ); _lastStatusCode = response.statusCode; // 状态码200时添加数据 if (response.statusCode == 200) { _items.add(reservation); } else { // 尝试解析接口返回的错误信息 try { final errorData = jsonDecode(response.body); _errorMessage = errorData['message'] ?? '请求失败'; } catch (_) { _errorMessage = '请求失败,状态码:${response.statusCode}'; } } } catch (e) { // 处理网络异常等情况 _lastStatusCode = -1; _errorMessage = '网络连接失败,请检查网络状态'; } // 通知页面状态更新 notifyListeners(); } }
步骤2:改造页面的请求方法,等待请求完成后显示弹窗
将_newReservation改为异步方法,等待addReservation执行完成后,根据Provider中的状态码生成对应提示内容并显示弹窗:
Future<void> _newReservation() async { final loggedUserList = Provider.of<LoggedUser>(context, listen: false); final newReservation = Reservation( userId: loggedUserList.loggedItems.first.id.toString(), userName: loggedUserList.loggedItems.first.name.toString(), menuId: widget.meal.menuId, resTime: dropDownValue, canceledYn: 'N', servedYn: 'N', altDate: '', restaurantId: '', service: '', userNo: '', userSector: '', menuDate: '', ); final reservationList = Provider.of<ReservationList>(context, listen: false); await reservationList.addReservation(newReservation); // 防止页面已销毁时调用弹窗 if (!mounted) return; // 根据状态码生成提示文本 String message; if (reservationList.lastStatusCode == 200) { message = 'Reserva confirmada!\n(O Cancelamento será permitidos apenas até as 9:00 do dia de consumo da reserva)'; } else { message = reservationList.errorMessage ?? 'Erro! por favor, tente novamente!'; } // 显示弹窗 showDialog( context: context, builder: (context) { return CustomAlert(message: message); }, ); }
额外注意事项
- 确保
CustomAlert组件去掉const关键字,避免无法动态传递message参数。 !mounted的判断是为了避免页面已销毁时调用showDialog引发异常。- 如果需要在页面其他位置监听请求状态变化,可以使用
Consumer<ReservationList>或Provider.of<ReservationList>(context)来监听lastStatusCode的更新。
内容的提问来源于stack exchange,提问作者pedro.curti
相关产品推荐
相关产品推荐

