2.加入群聊点加入无反应,按钮没变色,实际已经加入 3.卸载重装后原本添加过得好友,又显示在申请列表上 网络延迟下解锁红包照片两次出错master
@@ -857,7 +857,7 @@ | |||||
"has_get": "Đã nhận", | "has_get": "Đã nhận", | ||||
"no_gift": "Hiện tại không có phần quà nào", | "no_gift": "Hiện tại không có phần quà nào", | ||||
"sent_gift": "Quà tặng", | "sent_gift": "Quà tặng", | ||||
"fill_tips": "Khi bạn điền thông tin thành công sẽ nhận được /s1H tề, không thể sửa đổi sau khi liên kết.", | |||||
"fill_tips": "Khi bạn nhập mã mời thành công sẽ nhận được /s1H coin, nhưng không thể sửa đổi sau khi liên kết.", | |||||
"bind_code": "Liên kết mã mời", | "bind_code": "Liên kết mã mời", | ||||
"invide_code": "Mã mời", | "invide_code": "Mã mời", | ||||
"confirm_delete": "Xác nhận xóa", | "confirm_delete": "Xác nhận xóa", | ||||
@@ -13,7 +13,6 @@ import 'package:chat/chat/redbag_widget.dart'; | |||||
import 'package:chat/chat/upload_item.dart'; | import 'package:chat/chat/upload_item.dart'; | ||||
import 'package:chat/chat/video_view.dart'; | import 'package:chat/chat/video_view.dart'; | ||||
import 'package:chat/data/UserData.dart'; | import 'package:chat/data/UserData.dart'; | ||||
import 'package:chat/data/chat_data_mgr.dart'; | |||||
import 'package:chat/data/constants.dart'; | import 'package:chat/data/constants.dart'; | ||||
import 'package:chat/generated/i18n.dart'; | import 'package:chat/generated/i18n.dart'; | ||||
import 'package:chat/models/ChatMsg.dart'; | import 'package:chat/models/ChatMsg.dart'; | ||||
@@ -36,7 +35,6 @@ import 'package:chat/utils/sql_util.dart'; | |||||
import 'package:chat/utils/upload_util.dart'; | import 'package:chat/utils/upload_util.dart'; | ||||
import 'package:chat/utils/video_anim.dart'; | import 'package:chat/utils/video_anim.dart'; | ||||
import 'package:chat/utils/wpop/w_popup_menu.dart'; | import 'package:chat/utils/wpop/w_popup_menu.dart'; | ||||
import 'package:dio/dio.dart'; | |||||
import 'package:flutter/services.dart'; | import 'package:flutter/services.dart'; | ||||
import 'package:flutter/cupertino.dart'; | import 'package:flutter/cupertino.dart'; | ||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
@@ -34,7 +34,6 @@ import 'package:chat/utils/screen.dart'; | |||||
import 'package:chat/utils/sound_util.dart'; | import 'package:chat/utils/sound_util.dart'; | ||||
import 'package:chat/utils/upload_util.dart'; | import 'package:chat/utils/upload_util.dart'; | ||||
import 'package:chat/utils/video_anim.dart'; | import 'package:chat/utils/video_anim.dart'; | ||||
import 'package:dio/dio.dart'; | |||||
import 'package:flutter/cupertino.dart'; | import 'package:flutter/cupertino.dart'; | ||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||
@@ -1,5 +1,4 @@ | |||||
import 'package:chat/models/ChatMsg.dart'; | import 'package:chat/models/ChatMsg.dart'; | ||||
import 'package:chat/proto/chat.pbserver.dart'; | |||||
import 'package:chat/utils/MessageMgr.dart'; | import 'package:chat/utils/MessageMgr.dart'; | ||||
import 'package:chat/utils/msgHandler.dart'; | import 'package:chat/utils/msgHandler.dart'; | ||||
import 'package:chat/utils/upload_util.dart'; | import 'package:chat/utils/upload_util.dart'; | ||||
@@ -4,7 +4,6 @@ import 'package:chat/utils/MessageMgr.dart'; | |||||
import 'package:chat/utils/screen.dart'; | import 'package:chat/utils/screen.dart'; | ||||
import 'package:chat/utils/sql_util.dart'; | import 'package:chat/utils/sql_util.dart'; | ||||
import 'package:chat/utils/upload_util.dart'; | import 'package:chat/utils/upload_util.dart'; | ||||
import 'package:dio/dio.dart'; | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:percent_indicator/percent_indicator.dart'; | import 'package:percent_indicator/percent_indicator.dart'; | ||||
@@ -4,6 +4,8 @@ import 'dart:convert'; | |||||
import 'package:amap_location/amap_location.dart'; | import 'package:amap_location/amap_location.dart'; | ||||
import 'package:chat/data/constants.dart'; | import 'package:chat/data/constants.dart'; | ||||
import 'package:chat/utils/HttpUtil.dart'; | import 'package:chat/utils/HttpUtil.dart'; | ||||
import 'package:chat/utils/LoadingDialog.dart'; | |||||
import 'package:chat/utils/upload_util.dart'; | |||||
import 'package:crclib/crclib.dart'; | import 'package:crclib/crclib.dart'; | ||||
import 'package:shared_preferences/shared_preferences.dart'; | import 'package:shared_preferences/shared_preferences.dart'; | ||||
import 'package:vibration/vibration.dart'; | import 'package:vibration/vibration.dart'; | ||||
@@ -252,4 +254,17 @@ class UserData { | |||||
}); | }); | ||||
} | } | ||||
} | } | ||||
Future getLoaclVideoPath(String url) async { | |||||
var key = Constants.LocalCertifiedvideo + basicInfo.userId.toString(); | |||||
SharedPreferences spf = await SharedPreferences.getInstance(); | |||||
var path = spf.get(key); | |||||
if (path == null) { | |||||
LoadingManage().showLoading(); | |||||
path = await UploadUtil() | |||||
.downloadCertifiedvideo(url, () => LoadingManage().closeLoading()); | |||||
spf.setString(key, path); | |||||
} | |||||
return path; | |||||
} | |||||
} | } |
@@ -287,6 +287,8 @@ class Constants { | |||||
static const GroupAlterKey = 'GroupAlterKey'; //群@ | static const GroupAlterKey = 'GroupAlterKey'; //群@ | ||||
static const LocalCertifiedvideo = 'LocalCertifiedvideo'; //本地认证视频 | |||||
/// currentGoodsId+'@'+receipt+'@'+purchaseToken | /// currentGoodsId+'@'+receipt+'@'+purchaseToken | ||||
static final vipIcon = Image.asset( | static final vipIcon = Image.asset( | ||||
@@ -5137,9 +5137,9 @@ class _I18n_vi_VN extends I18n { | |||||
/// "Quà tặng" | /// "Quà tặng" | ||||
@override | @override | ||||
String get sent_gift => "Quà tặng"; | String get sent_gift => "Quà tặng"; | ||||
/// "Khi bạn điền thông tin thành công sẽ nhận được /s1H tề, không thể sửa đổi sau khi liên kết." | |||||
/// "Khi bạn nhập mã mời thành công sẽ nhận được /s1H coin, nhưng không thể sửa đổi sau khi liên kết." | |||||
@override | @override | ||||
String get fill_tips => "Khi bạn điền thông tin thành công sẽ nhận được /s1H tề, không thể sửa đổi sau khi liên kết."; | |||||
String get fill_tips => "Khi bạn nhập mã mời thành công sẽ nhận được /s1H coin, nhưng không thể sửa đổi sau khi liên kết."; | |||||
/// "Liên kết mã mời" | /// "Liên kết mã mời" | ||||
@override | @override | ||||
String get bind_code => "Liên kết mã mời"; | String get bind_code => "Liên kết mã mời"; | ||||
@@ -4,6 +4,7 @@ import 'package:chat/data/constants.dart'; | |||||
import 'package:chat/generated/i18n.dart'; | import 'package:chat/generated/i18n.dart'; | ||||
import 'package:chat/utils/CustomUI.dart'; | import 'package:chat/utils/CustomUI.dart'; | ||||
import 'package:chat/utils/LoadingDialog.dart'; | import 'package:chat/utils/LoadingDialog.dart'; | ||||
import 'package:chat/utils/sp_utils.dart'; | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:image_picker/image_picker.dart'; | import 'package:image_picker/image_picker.dart'; | ||||
@@ -68,7 +69,8 @@ class _VerificationCenterPageState extends State<VerificationCenterPage> { | |||||
if (state == 0 || state == 1) { | if (state == 0 || state == 1) { | ||||
isPostVideo = true; | isPostVideo = true; | ||||
videoUrl = resData['data']['AttestationValue']; | videoUrl = resData['data']['AttestationValue']; | ||||
_controller = VideoPlayerController.network(videoUrl) | |||||
var path = await UserData().getLoaclVideoPath(videoUrl); | |||||
_controller = VideoPlayerController.file(new File(path)) | |||||
..initialize().then((_) { | ..initialize().then((_) { | ||||
setState(() { | setState(() { | ||||
isLoadingVideoFinish = true; | isLoadingVideoFinish = true; | ||||
@@ -338,9 +340,14 @@ class _VerificationCenterPageState extends State<VerificationCenterPage> { | |||||
isShowLoading: true); | isShowLoading: true); | ||||
var resData = res.data; | var resData = res.data; | ||||
if (resData['code'] == 0) { | if (resData['code'] == 0) { | ||||
SPUtils.saveString( | |||||
Constants.LocalCertifiedvideo + | |||||
UserData().basicInfo.userId.toString(), | |||||
videoFile.path); | |||||
showToast(I18n.of(context).success); | showToast(I18n.of(context).success); | ||||
videoUrl = resData['msg']; | videoUrl = resData['msg']; | ||||
isPostVideo = true; | isPostVideo = true; | ||||
isLoadingVideoFinish = true; | |||||
_controller = VideoPlayerController.file(videoFile) | _controller = VideoPlayerController.file(videoFile) | ||||
..initialize().then((_) { | ..initialize().then((_) { | ||||
// Ensure the first frame is shown after the video is initialized, even before the play button has been pressed. | // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed. | ||||
@@ -1,3 +1,6 @@ | |||||
import 'dart:io'; | |||||
import 'package:chat/data/UserData.dart'; | |||||
import 'package:chat/data/constants.dart'; | import 'package:chat/data/constants.dart'; | ||||
import 'package:chat/generated/i18n.dart'; | import 'package:chat/generated/i18n.dart'; | ||||
import 'package:chat/utils/CustomUI.dart'; | import 'package:chat/utils/CustomUI.dart'; | ||||
@@ -8,7 +11,6 @@ import 'package:dio/dio.dart'; | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:flutter/services.dart'; | import 'package:flutter/services.dart'; | ||||
import 'package:flutter_ijkplayer/flutter_ijkplayer.dart'; | import 'package:flutter_ijkplayer/flutter_ijkplayer.dart'; | ||||
import 'package:video_player/video_player.dart'; | |||||
class VideoPage extends StatefulWidget { | class VideoPage extends StatefulWidget { | ||||
final userId; | final userId; | ||||
@@ -18,7 +20,6 @@ class VideoPage extends StatefulWidget { | |||||
} | } | ||||
class _VideoPageState extends State<VideoPage> { | class _VideoPageState extends State<VideoPage> { | ||||
VideoPlayerController _controller; | |||||
bool isShowPlayButton = true; | bool isShowPlayButton = true; | ||||
bool isLoadingFish = false; | bool isLoadingFish = false; | ||||
@@ -35,7 +36,7 @@ class _VideoPageState extends State<VideoPage> { | |||||
@override | @override | ||||
void dispose() { | void dispose() { | ||||
SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values); | SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values); | ||||
_controller.dispose(); | |||||
controller.dispose(); | |||||
super.dispose(); | super.dispose(); | ||||
} | } | ||||
@@ -52,26 +53,15 @@ class _VideoPageState extends State<VideoPage> { | |||||
if (resData['code'] == 0) { | if (resData['code'] == 0) { | ||||
var videoUrl = resData['data']['AttestationValue']; | var videoUrl = resData['data']['AttestationValue']; | ||||
if (videoUrl != '' && videoUrl != null) { | if (videoUrl != '' && videoUrl != null) { | ||||
// _controller = VideoPlayerController.network(videoUrl) | |||||
// ..initialize().then((_) { | |||||
// isLoadingFish = true; | |||||
// setState(() {}); | |||||
// }); | |||||
// _controller.addListener(() { | |||||
// if (_controller.value.position >= _controller.value.duration) { | |||||
// isShowPlayButton = true; | |||||
// setState(() {}); | |||||
// } | |||||
// }); | |||||
isLoadingFish = true; | isLoadingFish = true; | ||||
var filePath = await UserData().getLoaclVideoPath(videoUrl); | |||||
controller.setFileDataSource(File(filePath), autoPlay: false); | |||||
setState(() {}); | setState(() {}); | ||||
WidgetsBinding.instance.addPostFrameCallback((_) { | |||||
controller.setNetworkDataSource(videoUrl, autoPlay: false); | |||||
}); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
Widget appBar = new AppBar( | Widget appBar = new AppBar( | ||||
@@ -111,47 +101,5 @@ class _VideoPageState extends State<VideoPage> { | |||||
}, | }, | ||||
mediaController: controller, | mediaController: controller, | ||||
); | ); | ||||
// Widget stack = Stack( | |||||
// alignment: Alignment.center, | |||||
// children: <Widget>[ | |||||
// | |||||
// Container( | |||||
// width: Screen.width, | |||||
// child: _controller != null && _controller.value.initialized | |||||
// ? AspectRatio( | |||||
// aspectRatio: _controller.value.aspectRatio, | |||||
// child: VideoPlayer(_controller), | |||||
// ) | |||||
// : Container(), | |||||
// ), | |||||
// InkWell( | |||||
// highlightColor: Colors.transparent, | |||||
// radius: 0, | |||||
// onTap: () { | |||||
// setState(() { | |||||
// if (!_controller.value.isPlaying) { | |||||
// _controller.seekTo(Duration()); | |||||
// _controller.play(); | |||||
// isShowPlayButton = false; | |||||
// setState(() {}); | |||||
// } | |||||
// }); | |||||
// }, | |||||
// child: Container( | |||||
// height: MediaQuery.of(context).size.height, | |||||
// color: Colors.black.withOpacity( | |||||
// _controller != null && _controller.value.isPlaying ? 0 : 0.5), | |||||
// padding: EdgeInsets.only(bottom: 20), | |||||
// alignment: Alignment.center, | |||||
// child: Image.asset( | |||||
// 'assets/images/bofang.png', | |||||
// width: | |||||
// _controller != null && _controller.value.isPlaying ? 0 : 70, | |||||
// ), | |||||
// )) | |||||
// ], | |||||
// ); | |||||
// return stack; | |||||
} | } | ||||
} | } |
@@ -13,7 +13,6 @@ import 'package:dio/dio.dart'; | |||||
import 'package:cached_network_image/cached_network_image.dart'; | import 'package:cached_network_image/cached_network_image.dart'; | ||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:flutter/services.dart'; | import 'package:flutter/services.dart'; | ||||
import 'package:oktoast/oktoast.dart'; | |||||
import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||
import 'package:chat/models/friends_info.dart'; | import 'package:chat/models/friends_info.dart'; | ||||
import 'ProfilePage.dart'; | import 'ProfilePage.dart'; | ||||
@@ -131,7 +131,7 @@ class _PicSwiperState extends State<PicSwiper> | |||||
}; | }; | ||||
data['sign'] = TokenMgr().getSign(data); | data['sign'] = TokenMgr().getSign(data); | ||||
data['price'] = price; | data['price'] = price; | ||||
Response res = await HttpUtil().post('user/browse/photo', data: data); | |||||
Response res = await HttpUtil().post('user/browse/photo', data: data,isShowLoading: true); | |||||
Map resData = res.data; | Map resData = res.data; | ||||
print(resData); | print(resData); | ||||
if (resData['code'] == 0) { | if (resData['code'] == 0) { | ||||
@@ -114,7 +114,7 @@ class UploadUtil { | |||||
return cancelMap[fileId]; | return cancelMap[fileId]; | ||||
} | } | ||||
cancelSendMsg(MsgModel msgModel){ | |||||
cancelSendMsg(MsgModel msgModel) { | |||||
var token = cancelMap[msgModel.extraFile]; | var token = cancelMap[msgModel.extraFile]; | ||||
if (token != null) { | if (token != null) { | ||||
token.cancel('用户取消'); | token.cancel('用户取消'); | ||||
@@ -265,6 +265,24 @@ class UploadUtil { | |||||
} | } | ||||
} | } | ||||
//下载认证视频 | |||||
Future downloadCertifiedvideo(String url, downloadSuccess) async { | |||||
Response response; | |||||
var path = await FileCacheMgr().genFilePath(url); | |||||
try { | |||||
response = await dio.download(url, path); | |||||
if (response.statusCode == 200) { | |||||
if (downloadSuccess != null) downloadSuccess(); | |||||
return path; | |||||
} else { | |||||
showToast(I18n.of(Constants.getCurrentContext()).server_error_tips); | |||||
return null; | |||||
} | |||||
} catch (e) { | |||||
showToast(I18n.of(Constants.getCurrentContext()).server_error_tips); | |||||
} | |||||
} | |||||
//机器人翻译,type 1文字,2语音 | //机器人翻译,type 1文字,2语音 | ||||
Future<String> commitTranslateSource( | Future<String> commitTranslateSource( | ||||
int type, int sourceLang, int toLang, dynamic content) async { | int type, int sourceLang, int toLang, dynamic content) async { | ||||
@@ -1,7 +1,7 @@ | |||||
name: chat | name: chat | ||||
description: A new Flutter project. | description: A new Flutter project. | ||||
#修改版本号后get-clean | #修改版本号后get-clean | ||||
version: 1.1.0+15 | |||||
version: 1.1.3+17 | |||||
environment: | environment: | ||||
sdk: ">=2.1.0 <3.0.0" | sdk: ">=2.1.0 <3.0.0" | ||||