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

Dart/Flutter中如何从接口JSON响应提取total_amount值存为字符串

Flutter XpayCubit支付逻辑修改方案

需求背景

在Flutter项目中使用Bloc模式实现XpayCubit支付逻辑时,原有代码会存储、打印接口返回的全量响应数据,现需要调整逻辑,仅提取响应中的total_amount字段值,存储为字符串类型。

原有代码问题

  • 未按照接口返回的JSON结构解析数据,直接将全量响应转字符串赋值
  • 缺少接口返回状态校验,异常场景下会错误触发成功状态
  • 目标字段取值路径错误,无法拿到正确的总金额数值

接口返回结构说明

接口返回的JSON层级如下,目标字段路径为:根节点 -> Total Amount -> data -> total_amount

{
  "Total Amount": {
    "status": { "code": 200, "message": "success", "errors": [] },
    "data": {
      "total_amount": 500.0,
      "total_amount_currency": "EGP",
      "KIOSK": { "total_amount": 500.0, "total_amount_currency": "EGP" }
    },
    "count": null,
    "next": null,
    "previous": null
  }
}

修改后完整代码

import 'package:tagyourtaxi_driver/models/first_token.dart';
import 'package:tagyourtaxi_driver/modules/payment/cubit/states.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:tagyourtaxi_driver/pages/NavigatorPages/walletpage.dart';
import 'package:tagyourtaxi_driver/pages/login/get_started.dart';
import 'package:tagyourtaxi_driver/shared/components/constants.dart';
import 'package:tagyourtaxi_driver/xpay/xpaymodels/prepare_amount.dart';
import 'package:tagyourtaxi_driver/xpay/xpayshared/xpayconstants.dart';
import 'package:tagyourtaxi_driver/xpay/xpaycubit/xpaystates.dart';
import 'package:tagyourtaxi_driver/xpay/xpaymodels/xpay_payment.dart';

import '../../../functions/functions.dart';
import '../../shared/network/dio.dart';

class XpayCubit extends Cubit<XpayStates>{
  XpayCubit(): super(XpayPaymentInitialState());

  static XpayCubit get(context)=> BlocProvider.of(context);

  PrepareAmount? prepareAmount;

  Future getPrepareAmount(String addMoney,String CommunityId) async {
    DioHelperPayment.postData(
        url: 'payments/prepare-amount/',
        data: {
          'community_id': CommunityId,
          'amount': addMoney.toString()
        }).then((value) {
      // 逐层解析响应结构
      final response = value.data as Map<String, dynamic>;
      final totalAmountModule = response['Total Amount'] as Map<String, dynamic>;
      final respStatus = totalAmountModule['status'] as Map<String, dynamic>;
      
      // 校验接口返回状态
      if (respStatus['code'] == 200) {
        final respData = totalAmountModule['data'] as Map<String, dynamic>;
        // 提取total_amount转字符串存储
        TotalAmount = respData['total_amount'].toString();
        print('Total Amount: ${TotalAmount}');
        emit(XpayPaymentSuccessState());
      } else {
        emit(XpayPaymentErrorState(respStatus['message'].toString()));
      }
    }).catchError((error){
      emit(XpayPaymentErrorState(error));
    });
  }
}

关键修改点说明

  • 按照JSON层级逐层解析,不再直接操作全量响应数据
  • 新增接口返回状态码校验,只有状态码为200(请求成功)时才提取金额、触发成功状态
  • 精准定位到data节点下的total_amount字段,调用toString()转为字符串类型后赋值
  • 异常场景下返回接口自带的错误信息,方便后续定位问题

内容的提问来源于stack exchange,提问作者Tarek Hammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:21:46