使用颤振在 UI 中进行 POST 调用后显示来自 json 响应的特定数据

Posted

技术标签:

【中文标题】使用颤振在 UI 中进行 POST 调用后显示来自 json 响应的特定数据【英文标题】:Display a particular data from a json response after a POST call in the UI using flutter 【发布时间】:2021-10-22 01:54:36 【问题描述】:

我正在调用一个 POST 请求 API,它接受输入,然后返回他/她的详细信息。所以我已经实现了大部分,我能够从 API 中检索数据并在终端中打印该响应数据。但我需要在 UI 中显示该数据。我添加了一个检查快照是否有数据,所以每次我执行显示数据时我都无法做到这一点,而且由于我正在处理 API 调用,它总是打印出问题。

我附上了我的代码 sn-ps,以便它们可以帮助您了解我哪里出错了。 另外,在我认为我犯错的地方,请参考我所做的所有 cmet。

API调用函数:

Future<PanCardVerify> panCardVerify(dynamic param) async 
var client = http.Client();
String? token = await storage.readSecureToken('key');
if (token == null) 
  throw Exception("No token stored in storage");

try 
  var response = await client
      .post(
          Uri.https("baseURL", "endpoint"),
          headers: <String, String>
            'Authorization': 'Token $token',
          ,
          body: param)
      .timeout(Duration(seconds: TIME_CONST))
      .catchError(handleError);

  if (response.statusCode == 200) 
    print('Response Body: $response.body');
    final data = await jsonDecode(response.body);
    return PanCardVerify.fromJson(data); //This is where I believe I am supposed to return to the snapshot
    );
   else if (response.statusCode == 400) 
    print("Invalid PAN Card Details");
    return param;
   else 
    print("Bad Input");
    return param;
  
 on SocketException 
  throw FetchDataException('message', 'url'); 
 on TimeoutException 
  throw ApiNotRespondingException("message", "url");


模型类:

import 'dart:convert';

PanCardVerify transactionFromJson(String str) =>
    PanCardVerify.fromJson(json.decode(str));

String transactionToJson(PanCardVerify data) => json.encode(data.toJson());

class PanCardVerify 
  PanCardVerify(
    required this.status,
    this.panData,
  );

  String status;
  PanData? panData;

  factory PanCardVerify.fromJson(Map<String, dynamic> json) => PanCardVerify(
        status: json["status"],
        panData: PanData.fromJson(json["pan_data"]),
      );

  Map<String, dynamic> toJson() => 
        "status": status,
        "pan_data": panData?.toJson(),
      ;


class PanData 
  PanData(
    required this.code,
    required this.timestamp,
    required this.transactionId,
    required this.data,
  );

  int code;
  int timestamp;
  String transactionId;
  Data data;

  factory PanData.fromJson(Map<String, dynamic> json) => PanData(
        code: json["code"],
        timestamp: json["timestamp"],
        transactionId: json["transaction_id"],
        data: Data.fromJson(json["data"]),
      );

  Map<String, dynamic> toJson() => 
        "code": code,
        "timestamp": timestamp,
        "transaction_id": transactionId,
        "data": data.toJson(),
      ;


class Data 
  Data(
    required this.entity,
    required this.pan,
    required this.fullName,
    required this.status,
    required this.category,
  );

  String entity;
  String pan;
  String fullName;
  String status;
  String category;

  factory Data.fromJson(Map<String, dynamic> json) => Data(
        entity: json["@entity"],
        pan: json["pan"],
        fullName: json["full_name"],
        status: json["status"],
        category: json["category"],
      );

  Map<String, dynamic> toJson() => 
        "@entity": entity,
        "pan": pan,
        "full_name": fullName,
        "status": status,
        "category": category,
      ;

异常控制器类:

class BaseController 
  void handleError(error) 
    hideLoading();
    if (error is BadRequestException) 
      var message = error.message;
      DialogHelper.showErroDialog(description: message);
      else if (error is SocketException) 
      print(error);
     else 
      print("Error in the else block");
    
  

我试图在其中显示 fullName 的小部件:

FutureBuilder<PanCardVerify>(
                  future: ApiService().panCardVerify(context),
                  builder: (context, snapshot) 
                    if (snapshot.hasData) 
                      PanData? data = snapshot.data!.panData;
                      return Flexible(
                        child: Text('$data!.data.fullName'),
                      );
                     else 
                      return Text("Something went wrong");
                    
                  ),

【问题讨论】:

嘿@RavindraS.Patil!!参考这些答案后,我对代码进行了一些更改。但是现在我在控制台中没有收到任何错误,而是 else 块正在执行,并且我收到的文本是“出了点问题”,并且 catch 块也正在执行,这就是我收到弹出窗口的原因。非常感谢和欢迎任何帮助。 这意味着您的快照是空的,这意味着 panCardVerify 根本没有获取数据。重新思考你使用的逻辑。 嘿@AshiqKhan 不,快照不能为空,因为我的终端中显示了 API 响应数据 嘿@RavindraS.Patil 请考虑上面编写的代码正在发出 POST 请求并获得响应,我需要在 UI 中显示该特定响应。请检查我随问题附上的代码。 是的,但是当您在 UI 中访问 panCardVerify 时,它没有数据。你需要检查一下。 【参考方案1】:

您需要创建 ApiService 对象,才能访问 panCardVerify。 只需在 ApiService 之后添加 () 即可。 像这样

FutureBuilder<PanCardVerify>(
              future: ApiService().panCardVerify(), 
              builder: (context, snapshot)
                
              
              )

【讨论】:

但现在它说,预期有 1 个位置参数,但找到了 0 个。尝试添加缺少的参数。这是我正在发出的 HTTP 发布请求,并希望显示响应数据中的名称。【参考方案2】:

尝试在此处使用您的 fromJson 构造函数:

if (response.statusCode == 200) 
    print('Response Body: $response.body');
    final data = jsonDecode(response.body);
    return PanCardVerify.fromJson(data);     //// here
 
  

【讨论】:

嘿,我修改了代码,但没有任何反应。而是异常类控制器的 else 块仍在图片中,并且我还没有实现它的解决方案。 我稍微修改了代码。请看一下

以上是关于使用颤振在 UI 中进行 POST 调用后显示来自 json 响应的特定数据的主要内容,如果未能解决你的问题,请参考以下文章

PHP POST api 在邮递员中工作,但在颤振应用程序中不工作

在有状态小部件外部调用方法以使用颤振 Bloc 更新 UI

如何使用Ajax动态更新JSON-LD脚本?

无法使用颤振 Bloc 模式更新小部件外部的 UI

如何与来自 Flutter integration_test 的原生 UI 元素进行交互?

在颤振加载中加载更多列表,但用户界面没有改变