Flutter应用HTTP POST请求不生效,代码无报错该如何解决?
Flutter POST请求无响应问题修复方案
核心问题梳理
- 接口请求参数硬编码,未绑定输入框用户输入内容
- 异步请求未做等待处理,响应结果仅打印在控制台,未同步到页面展示
- 原生端未配置网络权限,导致请求被系统拦截
- 部分场景缺少必要的请求头配置
分步修复方案
1. 配置网络权限
- Android端:在
android/app/src/main/AndroidManifest.xml的manifest标签下添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
- iOS端:在
ios/Runner/Info.plist的dict标签下添加网络访问配置:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
2. 确认http依赖已添加
在pubspec.yaml中引入http库:
dependencies: flutter: sdk: flutter http: ^1.1.0
3. 修改请求方法,绑定输入参数
调整postData方法,支持接收用户输入的内容,增加状态码判断:
import 'dart:convert'; import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; Future<Map?> postData(String description) async { try { var response = await http.post( Uri.parse("https://zen-api-1010.azure-api.net/notes/v1/create"), headers: { "Ocp-Apim-Subscription-Key": "008c47b597e54aedadbd5e4d270b35ed", "Ocp-Apim-Trace": "true", "Content-Type": "application/x-www-form-urlencoded", }, body: { "noteType": 0.toString(), "description": description, "authorReaction": 0.toString(), "privacy": 0.toString(), }); print("响应状态码:${response.statusCode}"); print("响应内容:${response.body}"); if(response.statusCode == 200) { return jsonDecode(response.body); } return null; } catch (e) { print("请求报错:$e"); return null; } }
4. 调整提交按钮逻辑,同步结果到页面
在_NavPrivatePageState类中新增变量存储接口返回结果,修改按钮点击逻辑:
class _NavPrivatePageState extends State<NavPrivatePage> { TextEditingController descriptionController = TextEditingController(); Map? apiResult; // 存储接口返回结果 bool inVisible = true; bool isNotVisible = false; @override Widget build(BuildContext context) => Scaffold( appBar: AppBar( title: const Text( 'Private Note Auto Expand', style: TextStyle(fontSize: 14), ), centerTitle: true, backgroundColor: const Color.fromRGBO(255, 191, 0, 1), ), body: SingleChildScrollView( child: Center( child: Padding( padding: const EdgeInsets.all(10.0), child: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ Visibility( visible: inVisible, child: TextButton( onPressed: () { setState(() { isNotVisible = !isNotVisible; }); }, child: const Text( 'Create Private Note', style: TextStyle(color: Colors.white), ), style: TextButton.styleFrom(backgroundColor: Colors.grey[900]), ), ), Visibility( visible: isNotVisible, child: Padding( padding: const EdgeInsets.all(8.0), child: TextFormField( controller: descriptionController, autofocus: false, minLines: 2, maxLines: 20, keyboardType: TextInputType.multiline, decoration: InputDecoration( hintText: 'Enter your message here', hintStyle: TextStyle(color: Colors.grey[600], fontSize: 12), border: const OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(5)), ), ), ), ), ), Visibility( visible: isNotVisible, child: TextButton( onPressed: () async { String inputContent = descriptionController.text.trim(); if(inputContent.isEmpty) { ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("请输入笔记内容"))); return; } var result = await postData(inputContent); setState(() { apiResult = result; }); }, child: const Text( 'Submit', style: TextStyle(color: Colors.white), ), style: TextButton.styleFrom(backgroundColor: Colors.grey[600]), ), ), // 新增响应结果展示区域 if(apiResult != null) Padding( padding: const EdgeInsets.all(8.0), child: Text( "创建成功,笔记ID:${apiResult!['result']['id']}", style: const TextStyle(color: Colors.green, fontSize: 12), ), ), Visibility( visible: isNotVisible, child: Center( child: Card( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), color: Colors.grey[300], child: Container( padding: const EdgeInsets.all(10), height: 130, child: Column( mainAxisSize: MainAxisSize.min, children: [ ListTile( trailing: const Icon(Icons.more_horiz), leading: CircleAvatar( backgroundImage: NetworkImage( 'https://images.pexels.com/photos/220453/pexels-photo-220453.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500'), ), subtitle: Text( '2 days ago', style: TextStyle(color: Colors.grey[800]), ), ), const Text( 'This is a private note that auto expands based on the text entered. The background will determine the privacy level of the post', style: TextStyle(fontSize: 10, color: Colors.black87), textAlign: TextAlign.justify), ], ), ), ), ), ), ], ), ), ), ), ); }
内容的提问来源于stack exchange,提问作者Kushan De Silva
相关产品推荐
相关产品推荐

