Commit 1c94789d authored by “Icebear”'s avatar “Icebear”

修复response.data的格式问题

parent bbbf4e98
...@@ -7,8 +7,7 @@ class LoginApi { ...@@ -7,8 +7,7 @@ class LoginApi {
///示例请求 ///示例请求
static loginRequest(Map<String, dynamic> param, OnResult onResult) { static loginRequest(Map<String, dynamic> param, OnResult onResult) {
return HttpManager.getInstance().request('auth/oauth/token', parameters: param, onResult: (data,errorMsg){ return HttpManager.getInstance().request('auth/oauth/token', parameters: param, onResult: (data,errorMsg){
BaseHttpModel httpModel = data; UserModel userModel = UserModel.fromJson(data.data);
UserModel userModel = UserModel.fromJson(httpModel.data);
UserModel.saveModel(userModel); UserModel.saveModel(userModel);
print(UserModel.getModel().token); print(UserModel.getModel().token);
if(onResult != null){ if(onResult != null){
...@@ -16,4 +15,13 @@ class LoginApi { ...@@ -16,4 +15,13 @@ class LoginApi {
} }
}); });
} }
///上传头像
static uploadAvatarRequest(String avatarPath, OnResult onResult) {
return HttpManager.getInstance().request('file/upload', parameters: null,method: "POST", imagePath: avatarPath,onResult: (data,errorMsg){
if(onResult != null){
onResult(data, errorMsg);
}
});
}
} }
import 'package:flustars/flustars.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:netrain_flutter_app/zhangfeng/UserModel.dart'; import 'package:netrain_flutter_app/zhangfeng/UserModel.dart';
import 'LoginApi.dart'; import 'LoginApi.dart';
import 'package:netrain_flutter_app/common/Images.dart'; import 'package:netrain_flutter_app/common/Images.dart';
import 'package:image_picker/image_picker.dart';//从相册里面选择图片或者拍照获取照片
import 'dart:io';
class LoginRequestPage extends StatefulWidget { class LoginRequestPage extends StatefulWidget {
final String title = "登录页"; final String title = "登录页";
...@@ -16,6 +19,7 @@ class _LoginState extends State<LoginRequestPage> { ...@@ -16,6 +19,7 @@ class _LoginState extends State<LoginRequestPage> {
// This widget is the root of your application. // This widget is the root of your application.
final phoneTextField = TextEditingController(); final phoneTextField = TextEditingController();
final pwdTextField = TextEditingController(); final pwdTextField = TextEditingController();
PickedFile _image;
@override @override
void dispose() { void dispose() {
...@@ -51,6 +55,25 @@ class _LoginState extends State<LoginRequestPage> { ...@@ -51,6 +55,25 @@ class _LoginState extends State<LoginRequestPage> {
Fluttertoast.showToast(msg:'退出成功'); Fluttertoast.showToast(msg:'退出成功');
} }
Future getImage() async {
var image = await ImagePicker.platform.pickImage(source: ImageSource.gallery);
_upLoadImage(image);//上传图片
setState(() {
_image = image;
});
}
_upLoadImage(PickedFile image) async {
LoginApi.uploadAvatarRequest(image.path, (httpModel, error){
if(error != null){
Fluttertoast.showToast(msg: error);
}else{
Fluttertoast.showToast(msg:'更改成功');
}
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
...@@ -111,6 +134,21 @@ class _LoginState extends State<LoginRequestPage> { ...@@ -111,6 +134,21 @@ class _LoginState extends State<LoginRequestPage> {
onPressed: _loginAction, onPressed: _loginAction,
), ),
), ),
Container(
margin: EdgeInsets.only(top: 50),
width: 100,
height: 100,
child: ElevatedButton(
child: Text("上传头像"),
onPressed: getImage,
),
),
Container(
margin: EdgeInsets.only(top: 50),
width: 100,
height: 100,
child: Image.asset(_image != null ? _image.path : Images.lake),
),
], ],
), ),
), // This trailing comma makes auto-formatting nicer for build methods. ), // This trailing comma makes auto-formatting nicer for build methods.
......
...@@ -2,12 +2,10 @@ import 'package:json_annotation/json_annotation.dart'; ...@@ -2,12 +2,10 @@ import 'package:json_annotation/json_annotation.dart';
part 'BaseHttpModel.g.dart'; part 'BaseHttpModel.g.dart';
@JsonSerializable() @JsonSerializable()
class BaseHttpModel{ class BaseHttpModel{
final data; final data;
final code; int code;
@JsonKey(name:'message') String msg;
final msg;
BaseHttpModel(this.data, this.code, this.msg); BaseHttpModel(this.data, this.code, this.msg);
......
...@@ -9,8 +9,8 @@ part of 'BaseHttpModel.dart'; ...@@ -9,8 +9,8 @@ part of 'BaseHttpModel.dart';
BaseHttpModel _$BaseHttpModelFromJson(Map<String, dynamic> json) { BaseHttpModel _$BaseHttpModelFromJson(Map<String, dynamic> json) {
return BaseHttpModel( return BaseHttpModel(
json['data'], json['data'],
json['code'], json['code'] as int,
json['msg'], json['msg'] as String,
); );
} }
......
import 'dart:convert';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:netrain_flutter_app/zhangfeng/Network/BaseHttpModel.dart'; import 'package:netrain_flutter_app/zhangfeng/Network/BaseHttpModel.dart';
import 'package:netrain_flutter_app/zhangfeng/UserModel.dart';
import 'BaseHttpModel.dart'; import 'BaseHttpModel.dart';
import 'UrlPath.dart'; import 'UrlPath.dart';
typedef OnResult = void Function(BaseHttpModel t, String errorMsg) ; typedef OnResult = void Function(BaseHttpModel httpModel, String errorMsg) ;
class HttpManager { class HttpManager {
static HttpManager _instance = HttpManager._internal(); static HttpManager _instance = HttpManager._internal();
...@@ -48,15 +50,32 @@ class HttpManager { ...@@ -48,15 +50,32 @@ class HttpManager {
request(String url, request(String url,
{parameters, {parameters,
method = 'GET', method = 'GET',
OnResult onResult}) async { OnResult onResult,String imagePath}) async {
parameters = parameters ?? {}; parameters = parameters ?? {};
if(onResult==null){ if(onResult==null){
return; return;
} }
try { try {
FormData formdata;
if(imagePath != null){
var name = imagePath.substring(imagePath.lastIndexOf("/") + 1, imagePath.length);
var suffix = name.substring(name.lastIndexOf(".") + 1, name.length);
formdata = FormData.fromMap({
"file": await MultipartFile.fromFile(
imagePath, //图片路径
filename: name,
)
});
}
parameters = new Map<String, dynamic>.from(parameters);
Map<String,String> map = new Map<String,String>();
if(UserModel.getModel() != null) {
map[UserModel.getModel().header] = UserModel.getModel().tokenHead + UserModel.getModel().token;
}
Response response = await _dio.request(url, Response response = await _dio.request(url,
queryParameters: parameters, options: new Options(method: method)); queryParameters: parameters, data: formdata, options: new Options(method: method,headers: map));
BaseHttpModel httpModel = BaseHttpModel.fromJson(response.data); Map<String, dynamic> result = json.decode(response.toString());
BaseHttpModel httpModel = BaseHttpModel.fromJson(result);
if (httpModel.isSuccess()) { if (httpModel.isSuccess()) {
onResult(httpModel, null); onResult(httpModel, null);
}else{ }else{
......
...@@ -32,7 +32,7 @@ dependencies: ...@@ -32,7 +32,7 @@ dependencies:
# The following adds the Cupertino Icons font to your application. # The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons. # Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.3 cupertino_icons: ^0.1.3
image_picker: ^0.8.1+3 image_picker: 0.7.4
fluttertoast: ^3.1.3 fluttertoast: ^3.1.3
http: 0.13.3 http: 0.13.3
mqtt_client: ^9.3.2 mqtt_client: ^9.3.2
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment