Flutter 使用RESTAPI搜索数据';飘飘然
我有一个API请求来搜索数据。如果数据通过,响应需要将响应传递到屏幕 API请求为post,post方法具有文本字段的参数 如何从API获得响应并传递到屏幕 如果状态为1,它将被执行,否则返回null。传递json响应数据需要传递到屏幕 我使用dio作为http客户端Flutter 使用RESTAPI搜索数据';飘飘然,flutter,http,dart,dio,Flutter,Http,Dart,Dio,我有一个API请求来搜索数据。如果数据通过,响应需要将响应传递到屏幕 API请求为post,post方法具有文本字段的参数 如何从API获得响应并传递到屏幕 如果状态为1,它将被执行,否则返回null。传递json响应数据需要传递到屏幕 我使用dio作为http客户端 import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flut
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:my_app/src/api_provider/apis_provider.dart';
import 'package:my_app/src/model/search_doctor.dart';
import 'package:my_app/src/utils/commons.dart';
class Doctorbydetails extends StatefulWidget {
@override
_DoctorbydetailsState createState() => _DoctorbydetailsState();
}
class _DoctorbydetailsState extends State<Doctorbydetails> {
// Future<SearchDoctor> searchModel;
final API_Manager api = API_Manager();
final _searchKey = GlobalKey<FormState>();
TextEditingController _searchController = TextEditingController();
bool _isLoading = false;
int success = 1;
// @override
// void initState() {
// _searchModel = API_Manager().searchdoctor();
// print(_searchModel);
// super.initState();
// }
Future<SearchDoctor> searchdoctor(var search) async {
var searchModel;
try{
Options options = Options(
headers: {"Content-Type": "application/json"},
);
Response response = await Commons.dio.post('/search_doctor',
data: {
"search":search
},
options: options);
setState(() {
searchModel = jsonDecode(response.data);
print(searchModel);
});
if (searchModel['status'] == success) {
if (response.statusCode == 200) {
var jsonString = response.data;
var jsonMap = json.decode(jsonString);
print(jsonMap);
searchModel = SearchDoctor.fromJson(jsonMap);
}
else if (response.statusCode == 401) {
throw Exception("Incorrect Email/Password");
} else
throw Exception('Authentication Error');
}else {
Fluttertoast.showToast(
msg:searchModel['message'],
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.black,
textColor: Colors.white,
fontSize: 16.0);
}
}catch (Exception) {
return null;
}
return searchModel;
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Container(
child: Scaffold(
backgroundColor: Color(0xff29ABE2),
appBar: AppBar(
elevation: 0,
backgroundColor: Color(0xff29ABE2),
leading: Container(
child: IconButton(
icon: Image.asset('assets/images/home/left_arrow.png'),
onPressed: () {
Navigator.pop(context);
},
),
),
title: Container(
height: 60,
width: 60,
child: IconButton(
icon: Image.asset('assets/images/home/patient.png'),
tooltip: 'Closes application',
onPressed: () {
Navigator.pop(context);
},
),
),
),
body: SingleChildScrollView(
child: Column(
children: <Widget>[
Container(
width: double.infinity,
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(20)),
),
child: Padding(
padding: EdgeInsets.all(15),
child: Column(children: <Widget>[
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: <Widget>[
Column(
children: <Widget>[
SizedBox(
height: 5,
),
Text(
"Search doctor",
style: TextStyle(
fontSize: 18,
fontFamily: "SansRegular",
fontWeight: FontWeight.w100),
)
],
),
],
),
SizedBox(
height: 10,
),
Form(
key: _searchKey,
child: Container(
width: double.infinity,
child: TextFormField(
controller: _searchController,
style: TextStyle(
color: Colors.black,
fontFamily: 'OpenSans',
),
decoration: InputDecoration(
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: Colors.black)),
contentPadding:
EdgeInsets.only(top: 14.0),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: Color(0xff29ABE2))),
hintText:
'Search doctors by ID, Mobile number',
suffixIcon: IconButton(
icon: Icon(Icons.search),
onPressed: () {
})),
validator: (value) {
if (value.isEmpty) {
return 'null';
}
return null;
},
),
),
),
SizedBox(
height: 8,
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Container(
child: FlatButton(
onPressed: () {
if (_searchKey.currentState.validate()) {
_searchKey.currentState.save();
api.searchdoctor(_searchController.text);
}
},
// padding: EdgeInsets.only(left: 30, right: 30),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(8.0),
),
child: Text(
"Search",
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w600,
fontFamily: "SansRegular",
fontSize: 20),
),
color: Color(0xff29ABE2),
)),
],
),
// Container(child: Text(),)
FutureBuilder<SearchDoctor>(
future: searchModel ,
builder: (context, snapshot) {
if (snapshot.connectionState ==
ConnectionState.done &&
snapshot.hasData) {
return Container();}else
return Center(
child: CircularProgressIndicator());})
])))
// ])
),
],
),
)),
));
}
}
导入'dart:convert';
进口“包装:dio/dio.dart”;
进口“包装:颤振/材料.省道”;
进口“包装:fluttoast/fluttoast.dart”;
导入“包:my_app/src/api_provider/api_provider.dart”;
导入“package:my_app/src/model/search_doctor.dart”;
导入“包:my_app/src/utils/commons.dart”;
类Doctorbydetails扩展StatefulWidget{
@凌驾
_DoctorbydetailsState createState()=>\u DoctorbydetailsState();
}
类_DoctorbydetailsState扩展状态{
//未来搜索模型;
最终API_Manager API=API_Manager();
final _searchKey=GlobalKey();
TextEditingController_searchController=TextEditingController();
bool_isLoading=false;
int成功=1;
//@覆盖
//void initState(){
//_searchModel=API_Manager().searchdoctor();
//打印(搜索模型);
//super.initState();
// }
未来搜索医生(var搜索)异步{
var模型;
试一试{
选项=选项(
标题:{“内容类型”:“应用程序/json”},
);
Response Response=wait Commons.dio.post(“/search\u doctor”,
数据:{
“搜索”:搜索
},
选择:选择);
设置状态(){
searchModel=jsonDecode(response.data);
打印(搜索模型);
});
if(searchModel['status']==成功){
如果(response.statusCode==200){
var jsonString=response.data;
var jsonMap=json.decode(jsonString);
打印(jsonMap);
searchModel=SearchDoctor.fromJson(jsonMap);
}
else if(response.statusCode==401){
抛出异常(“错误的电子邮件/密码”);
}否则
抛出异常(“身份验证错误”);
}否则{
烤面包片(
msg:searchModel['message'],
烤面包片长度:烤面包片长度,
重力:ToastGravity.BOTTOM,
背景颜色:Colors.black,
textColor:Colors.white,
体积:16.0),;
}
}捕获(例外){
返回null;
}
返回搜索模型;
}
@凌驾
小部件构建(构建上下文){
返回安全区(
子:容器(
孩子:脚手架(
背景颜色:颜色(0xff29ABE2),
appBar:appBar(
海拔:0,
背景颜色:颜色(0xff29ABE2),
领先:集装箱(
孩子:我的钮扣(
图标:Image.asset('assets/images/home/left_arrow.png'),
已按下:(){
Navigator.pop(上下文);
},
),
),
标题:集装箱(
身高:60,
宽度:60,
孩子:我的钮扣(
图标:Image.asset('assets/images/home/patient.png'),
工具提示:“关闭应用程序”,
已按下:(){
Navigator.pop(上下文);
},
),
),
),
正文:SingleChildScrollView(
子:列(
儿童:[
容器(
宽度:double.infinity,
孩子:卡片(
形状:圆形矩形边框(
borderRadius:borderRadius.all(半径圆形(20)),
),
孩子:填充(
填充:边缘设置。全部(15),
子项:列(子项:[
划船(
主轴对准:
MainAxisAlignment.spaceBetween,
儿童:[
纵队(
儿童:[
大小盒子(
身高:5,,
),
正文(
“搜索医生”,
样式:TextStyle(
尺码:18,
fontFamily:“SansRegular”,
fontWeight:fontWeight.w100),
)
],
),
],
),
大小盒子(
身高:10,
),
形式(
键:_searchKey,
子:容器(
宽度:double.infinity,
子项:TextFormField(
控制器:\ u搜索控制器,
样式:TextStyle(
颜色:颜色,黑色,
fontFamily:“OpenSans”,
),
装饰:输入装饰(
enabledBorder:下划线