You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:45:40