reason

修改用户信息页面

import 'dart:convert';
import 'package:Parlando/generated/json/base/json_field.dart';
import 'package:Parlando/generated/json/upload_avatar_entity.g.dart';
@JsonSerializable()
class UploadAvatarEntity {
String? status;
int? code;
String? message;
UploadAvatarData? data;
UploadAvatarError? error;
UploadAvatarEntity();
factory UploadAvatarEntity.fromJson(Map<String, dynamic> json) =>
$UploadAvatarEntityFromJson(json);
Map<String, dynamic> toJson() => $UploadAvatarEntityToJson(this);
@override
String toString() {
return jsonEncode(this);
}
}
@JsonSerializable()
class UploadAvatarData {
String? avatar;
UploadAvatarData();
factory UploadAvatarData.fromJson(Map<String, dynamic> json) =>
$UploadAvatarDataFromJson(json);
Map<String, dynamic> toJson() => $UploadAvatarDataToJson(this);
@override
String toString() {
return jsonEncode(this);
}
}
@JsonSerializable()
class UploadAvatarError {
UploadAvatarError();
factory UploadAvatarError.fromJson(Map<String, dynamic> json) =>
$UploadAvatarErrorFromJson(json);
Map<String, dynamic> toJson() => $UploadAvatarErrorToJson(this);
@override
String toString() {
return jsonEncode(this);
}
}
import 'package:Parlando/account/models/upload_avatar_entity.dart';
import 'package:Parlando/models/upload_entity.dart';
import 'package:Parlando/net/dio_utils.dart';
import 'package:Parlando/net/http_api.dart';
import 'package:Parlando/util/toast_utils.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:Parlando/extension/int_extension.dart';
import 'package:Parlando/widgets/my_app_bar.dart';
......@@ -15,7 +23,10 @@ class AccountEditPage extends StatefulWidget {
class MapScreenState extends State<AccountEditPage>
with SingleTickerProviderStateMixin {
bool _status = true;
bool isUpdateAvatar = false;
final FocusNode myFocusNode = FocusNode();
String _imageFile =
'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif';
@override
void initState() {
......@@ -52,9 +63,13 @@ class MapScreenState extends State<AccountEditPage>
width: 140.px,
margin: EdgeInsets.only(bottom: 12.px),
child: ClipOval(
child: Image.network(
"https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif",
child: CachedNetworkImage(
fit: BoxFit.cover,
placeholder: (context, url) =>
const CircularProgressIndicator(),
errorWidget: (context, url, error) =>
const Icon(Icons.error),
imageUrl: _imageFile,
),
),
),
......@@ -99,10 +114,8 @@ class MapScreenState extends State<AccountEditPage>
ImageSource.camera,
context: context,
capturedImageFile: (s) {
setState(() {
print(s);
// _imageFile = s;
});
_imageFile = s;
updateAvatar(s);
},
);
},
......@@ -122,11 +135,8 @@ class MapScreenState extends State<AccountEditPage>
ImageSource.gallery,
context: context,
capturedImageFile: (s) {
print(
"file path ${s}");
setState(() {
// _imageFile = s;
});
_imageFile = s;
updateAvatar(s);
},
);
},
......@@ -138,6 +148,13 @@ class MapScreenState extends State<AccountEditPage>
)
],
)),
isUpdateAvatar
? const Center(
child: CupertinoActivityIndicator(
radius: 16.0,
),
)
: Container(),
]),
)
],
......@@ -158,8 +175,7 @@ class MapScreenState extends State<AccountEditPage>
top: 5.px,
),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Column(
......@@ -397,7 +413,8 @@ class MapScreenState extends State<AccountEditPage>
),
],
),
));
),
);
}
@override
......@@ -473,6 +490,48 @@ class MapScreenState extends State<AccountEditPage>
},
);
}
Future<void> updateAvatar(String path) async {
isUpdateAvatar = true;
dynamic avatar = await MultipartFile.fromFile(path, filename: "avatar.png");
Map<String, dynamic> map = <String, dynamic>{
"image": avatar,
};
FormData formData = FormData.fromMap(map);
DioUtils.instance.asyncRequestNetwork<UploadEntity>(
Method.post,
HttpApi.uploadImage,
params: formData,
onSuccess: (data) {
String path = data!.data!.relativePath!;
Map<String, String> params = <String, String>{
"avatar": path,
};
DioUtils.instance.asyncRequestNetwork<UploadAvatarEntity>(
Method.post,
HttpApi.avatar,
params: params,
onSuccess: (data) {
isUpdateAvatar = false;
setState(() {
_imageFile = data!.data!.avatar!;
});
Toast.show("头像更新成功");
},
onError: (code, msg) {
Toast.show(msg.toString());
isUpdateAvatar = false;
setState(() {});
},
);
},
onError: (code, msg) {
isUpdateAvatar = false;
setState(() {});
},
);
}
}
typedef CapturedImageFile = String Function(String);
......
......@@ -3,6 +3,7 @@ import 'package:Parlando/account/view_models/account_view_model.dart';
import 'package:Parlando/apis/api_response.dart';
import 'package:Parlando/login/login_router.dart';
import 'package:Parlando/res/constant.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flustars/flustars.dart';
import 'package:flutter/material.dart';
import 'package:Parlando/membership/membership_router.dart';
......@@ -98,9 +99,12 @@ class _AccountPageState extends State<AccountPage> {
),
),
child: ClipOval(
child: Image.network(
"https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif",
child: CachedNetworkImage(
fit: BoxFit.cover,
placeholder: (context, url) =>
const CircularProgressIndicator(),
errorWidget: (context, url, error) => const Icon(Icons.error),
imageUrl: _user.avatar!,
),
),
),
......
......@@ -17,7 +17,7 @@ class AccountViewProvider with ChangeNotifier {
}
Future<void> fetchAccountData(String value) async {
_apiResponse = ApiResponse.loading('Fetching artist data');
_apiResponse = ApiResponse.loading('请求数据中...');
DioUtils.instance.asyncRequestNetwork<UserEntity>(
Method.get,
HttpApi.user,
......
......@@ -4,6 +4,7 @@
// This file is automatically generated. DO NOT EDIT, all your changes would be lost.
import 'package:flutter/material.dart';
import 'package:Parlando/account/models/upload_avatar_entity.dart';
import 'package:Parlando/account/models/user_entity.dart';
import 'package:Parlando/category/models/category_item_entity.dart';
import 'package:Parlando/home/models/setting_entity.dart';
......@@ -18,6 +19,9 @@ typedef JsonConvertFunction<T> = T Function(Map<String, dynamic> json);
class JsonConvert {
static final Map<String, JsonConvertFunction> _convertFuncMap = {
(UploadAvatarEntity).toString(): UploadAvatarEntity.fromJson,
(UploadAvatarData).toString(): UploadAvatarData.fromJson,
(UploadAvatarError).toString(): UploadAvatarError.fromJson,
(UserEntity).toString(): UserEntity.fromJson,
(UserData).toString(): UserData.fromJson,
(UserError).toString(): UserError.fromJson,
......@@ -114,16 +118,40 @@ class JsonConvert {
//list is returned by type
static M? _getListChildType<M>(List<Map<String, dynamic>> data) {
if(<UserEntity>[] is M){
return data.map<UserEntity>((Map<String, dynamic> e) => UserEntity.fromJson(e)).toList() as M;
}
if(<UserData>[] is M){
return data.map<UserData>((Map<String, dynamic> e) => UserData.fromJson(e)).toList() as M;
}
if(<UserError>[] is M){
return data.map<UserError>((Map<String, dynamic> e) => UserError.fromJson(e)).toList() as M;
}
if(<CategoryItemEntity>[] is M){
if (<UploadAvatarEntity>[] is M) {
return data
.map<UploadAvatarEntity>(
(Map<String, dynamic> e) => UploadAvatarEntity.fromJson(e))
.toList() as M;
}
if (<UploadAvatarData>[] is M) {
return data
.map<UploadAvatarData>(
(Map<String, dynamic> e) => UploadAvatarData.fromJson(e))
.toList() as M;
}
if (<UploadAvatarError>[] is M) {
return data
.map<UploadAvatarError>(
(Map<String, dynamic> e) => UploadAvatarError.fromJson(e))
.toList() as M;
}
if (<UserEntity>[] is M) {
return data
.map<UserEntity>((Map<String, dynamic> e) => UserEntity.fromJson(e))
.toList() as M;
}
if (<UserData>[] is M) {
return data
.map<UserData>((Map<String, dynamic> e) => UserData.fromJson(e))
.toList() as M;
}
if (<UserError>[] is M) {
return data
.map<UserError>((Map<String, dynamic> e) => UserError.fromJson(e))
.toList() as M;
}
if (<CategoryItemEntity>[] is M) {
return data.map<CategoryItemEntity>((Map<String, dynamic> e) => CategoryItemEntity.fromJson(e)).toList() as M;
}
if(<SettingEntity>[] is M){
......
import 'package:Parlando/generated/json/base/json_convert_content.dart';
import 'package:Parlando/account/models/upload_avatar_entity.dart';
UploadAvatarEntity $UploadAvatarEntityFromJson(Map<String, dynamic> json) {
final UploadAvatarEntity uploadAvatarEntity = UploadAvatarEntity();
final String? status = jsonConvert.convert<String>(json['status']);
if (status != null) {
uploadAvatarEntity.status = status;
}
final int? code = jsonConvert.convert<int>(json['code']);
if (code != null) {
uploadAvatarEntity.code = code;
}
final String? message = jsonConvert.convert<String>(json['message']);
if (message != null) {
uploadAvatarEntity.message = message;
}
final UploadAvatarData? data =
jsonConvert.convert<UploadAvatarData>(json['data']);
if (data != null) {
uploadAvatarEntity.data = data;
}
final UploadAvatarError? error =
jsonConvert.convert<UploadAvatarError>(json['error']);
if (error != null) {
uploadAvatarEntity.error = error;
}
return uploadAvatarEntity;
}
Map<String, dynamic> $UploadAvatarEntityToJson(UploadAvatarEntity entity) {
final Map<String, dynamic> data = <String, dynamic>{};
data['status'] = entity.status;
data['code'] = entity.code;
data['message'] = entity.message;
data['data'] = entity.data?.toJson();
data['error'] = entity.error?.toJson();
return data;
}
UploadAvatarData $UploadAvatarDataFromJson(Map<String, dynamic> json) {
final UploadAvatarData uploadAvatarData = UploadAvatarData();
final String? avatar = jsonConvert.convert<String>(json['avatar']);
if (avatar != null) {
uploadAvatarData.avatar = avatar;
}
return uploadAvatarData;
}
Map<String, dynamic> $UploadAvatarDataToJson(UploadAvatarData entity) {
final Map<String, dynamic> data = <String, dynamic>{};
data['avatar'] = entity.avatar;
return data;
}
UploadAvatarError $UploadAvatarErrorFromJson(Map<String, dynamic> json) {
final UploadAvatarError uploadAvatarError = UploadAvatarError();
return uploadAvatarError;
}
Map<String, dynamic> $UploadAvatarErrorToJson(UploadAvatarError entity) {
final Map<String, dynamic> data = <String, dynamic>{};
return data;
}
......@@ -4,7 +4,9 @@ class HttpApi {
static const String verify = 'verify';
static const String login = 'login';
static const String uploadVideo = 'upload/video';
static const String uploadImage = 'upload/image';
static const String immersive = 'immersive';
static const String avatar = 'avatar';
static const String user = 'user';
static const String search = 'search/repositories';
static const String subscriptions = 'users/simplezhli/subscriptions';
......
......@@ -215,7 +215,7 @@ class _PoemPublishState extends State<PoemPublish> {
final directory = await getApplicationDocumentsDirectory();
dynamic video = await MultipartFile.fromFile(
directory.path + "/" + widget.data,
filename: "xxx23.png");
filename: "video.mp4");
return video;
}
......