reason

重构首页

......@@ -3,7 +3,7 @@
// ignore_for_file: prefer_single_quotes
// This file is automatically generated. DO NOT EDIT, all your changes would be lost.
import 'package:flutter/material.dart';
import 'package:flutter/material.dart' show debugPrint;
import 'package:Parlando/account/models/my_videos_entity.dart';
import 'package:Parlando/account/models/upload_avatar_entity.dart';
import 'package:Parlando/account/models/user_entity.dart';
......@@ -22,7 +22,6 @@ import 'package:Parlando/poem/models/search_entity.dart';
import 'package:Parlando/timeline/models/friend_entity.dart';
JsonConvert jsonConvert = JsonConvert();
typedef JsonConvertFunction<T> = T Function(Map<String, dynamic> json);
class JsonConvert {
......
......@@ -75,22 +75,30 @@ HomeData $HomeDataFromJson(Map<String, dynamic> json) {
if (bgm != null) {
homeData.bgm = bgm;
}
final String? praise = jsonConvert.convert<String>(json['praise']);
final int? praise = jsonConvert.convert<int>(json['praise']);
if (praise != null) {
homeData.praise = praise;
}
final String? view = jsonConvert.convert<String>(json['view']);
final int? view = jsonConvert.convert<int>(json['view']);
if (view != null) {
homeData.view = view;
}
final String? collect = jsonConvert.convert<String>(json['collect']);
final int? collect = jsonConvert.convert<int>(json['collect']);
if (collect != null) {
homeData.collect = collect;
}
final String? share = jsonConvert.convert<String>(json['share']);
final int? share = jsonConvert.convert<int>(json['share']);
if (share != null) {
homeData.share = share;
}
final bool? isPraise = jsonConvert.convert<bool>(json['is_praise']);
if (isPraise != null) {
homeData.isPraise = isPraise;
}
final bool? isCollect = jsonConvert.convert<bool>(json['is_collect']);
if (isCollect != null) {
homeData.isCollect = isCollect;
}
return homeData;
}
......@@ -109,6 +117,8 @@ Map<String, dynamic> $HomeDataToJson(HomeData entity) {
data['view'] = entity.view;
data['collect'] = entity.collect;
data['share'] = entity.share;
data['is_praise'] = entity.isPraise;
data['is_collect'] = entity.isCollect;
return data;
}
......
......@@ -217,4 +217,4 @@ MembershipError $MembershipErrorFromJson(Map<String, dynamic> json) {
Map<String, dynamic> $MembershipErrorToJson(MembershipError entity) {
final Map<String, dynamic> data = <String, dynamic>{};
return data;
}
}
\ No newline at end of file
......
......@@ -59,4 +59,4 @@ OrderError $OrderErrorFromJson(Map<String, dynamic> json) {
Map<String, dynamic> $OrderErrorToJson(OrderError entity) {
final Map<String, dynamic> data = <String, dynamic>{};
return data;
}
}
\ No newline at end of file
......
......@@ -203,4 +203,4 @@ PayError $PayErrorFromJson(Map<String, dynamic> json) {
Map<String, dynamic> $PayErrorToJson(PayError entity) {
final Map<String, dynamic> data = <String, dynamic>{};
return data;
}
}
\ No newline at end of file
......
......@@ -64,7 +64,6 @@ class HomeState extends State<Home> with WidgetsBindingObserver {
//设置pageView 滑动监听
_controller.addListener(() {
if (_controller.position.pixels == _controller.position.maxScrollExtent) {
print('滑动到了最底部');
_getMore();
}
});
......@@ -111,9 +110,12 @@ class HomeState extends State<Home> with WidgetsBindingObserver {
videos.clear();
for (HomeData data in data!.data!) {
videos.add(VideoSlides(
videoId: data.id!,
poemId: data.poemId!,
poemType: data.type!,
url: data.url!,
isCollect: data.isCollect!,
isPraise: data.isPraise!,
));
}
setState(() {});
......@@ -140,9 +142,12 @@ class HomeState extends State<Home> with WidgetsBindingObserver {
for (HomeData data in data!.data!) {
videos.add(VideoSlides(
videoId: data.id!,
poemId: data.poemId!,
poemType: data.type!,
url: data.url!,
isCollect: data.isCollect!,
isPraise: data.isPraise!,
));
}
setState(() {});
......
import 'dart:convert';
import 'package:Parlando/generated/json/base/json_field.dart';
import 'package:Parlando/generated/json/home_entity.g.dart';
import 'dart:convert';
@JsonSerializable()
class HomeEntity {
......@@ -37,10 +37,14 @@ class HomeData {
@JSONField(name: "temp_id")
int? tempId;
String? bgm;
String? praise;
String? view;
String? collect;
String? share;
int? praise;
int? view;
int? collect;
int? share;
@JSONField(name: "is_praise")
bool? isPraise;
@JSONField(name: "is_collect")
bool? isCollect;
HomeData();
......
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:getwidget/getwidget.dart';
import 'package:path_provider/path_provider.dart';
import 'package:share_plus/share_plus.dart';
import '../../net/dio_utils.dart';
import '../../net/http_api.dart';
import '../theme/tik_video_player.dart';
class VideoSlides extends StatefulWidget {
......@@ -11,7 +15,9 @@ class VideoSlides extends StatefulWidget {
required this.url,
this.isPraise = false,
this.isCollect = false,
required this.videoId,
}) : super(key: key);
final int videoId;
final int poemId;
final int poemType;
final String url;
......@@ -24,6 +30,15 @@ class VideoSlides extends StatefulWidget {
class VideoSlidesState extends State<VideoSlides> {
bool isSharing = false;
bool isPraise = false;
bool isCollect = false;
@override
void initState() {
super.initState();
isPraise = widget.isPraise;
isCollect = widget.isCollect;
}
@override
Widget build(BuildContext context) {
......@@ -78,7 +93,7 @@ class VideoSlidesState extends State<VideoSlides> {
children: [
Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(0, 10, 0, 0),
const EdgeInsetsDirectional.fromSTEB(0, 10, 0, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
......@@ -90,17 +105,35 @@ class VideoSlidesState extends State<VideoSlides> {
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
0, 20, 0, 0),
child: Container(
width: 40,
height: 40,
decoration: const BoxDecoration(
color: Color(0x69EEEEEE),
shape: BoxShape.circle,
),
child: const Icon(
Icons.favorite_rounded,
color: Colors.white,
size: 20,
child: InkWell(
onTap: () {
isPraise =
isPraise == false ? true : false;
setState(() {});
String url =
'${HttpApi.praise}/${widget.videoId}';
DioUtils.instance.asyncRequestNetwork(
Method.post,
url,
params: [],
onSuccess: (data) {},
onError: (code, msg) {},
);
},
child: Container(
width: 40,
height: 40,
decoration: const BoxDecoration(
color: Color(0x69EEEEEE),
shape: BoxShape.circle,
),
child: Icon(
Icons.favorite_rounded,
color: isPraise
? Colors.red
: Colors.white,
size: 20,
),
),
),
),
......@@ -111,7 +144,7 @@ class VideoSlidesState extends State<VideoSlides> {
),
Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(0, 10, 0, 0),
const EdgeInsetsDirectional.fromSTEB(0, 10, 0, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
......@@ -124,7 +157,20 @@ class VideoSlidesState extends State<VideoSlides> {
padding: const EdgeInsetsDirectional.fromSTEB(
0, 20, 0, 0),
child: InkWell(
onTap: () async {},
onTap: () async {
isCollect =
isCollect == false ? true : false;
setState(() {});
String url =
'${HttpApi.collect}/${widget.videoId}';
DioUtils.instance.asyncRequestNetwork(
Method.post,
url,
params: [],
onSuccess: (data) {},
onError: (code, msg) {},
);
},
child: Container(
width: 40,
height: 40,
......@@ -132,9 +178,11 @@ class VideoSlidesState extends State<VideoSlides> {
color: Color(0x69EEEEEE),
shape: BoxShape.circle,
),
child: const Icon(
child: Icon(
Icons.star,
color: Colors.white,
color: isCollect
? Colors.red
: Colors.white,
size: 20,
),
),
......@@ -147,7 +195,7 @@ class VideoSlidesState extends State<VideoSlides> {
),
Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(0, 10, 0, 0),
const EdgeInsetsDirectional.fromSTEB(0, 10, 0, 0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
......@@ -163,11 +211,10 @@ class VideoSlidesState extends State<VideoSlides> {
onTap: () async {
isSharing = true;
setState(() {});
Future.delayed(const Duration(seconds: 3),
() async {
setState(() => isSharing = false);
await Share.share('一言以世界 临境不蹉跎');
});
await downVideo(widget.url);
isSharing = false;
await Share.shareFiles([tempVideoPath],
text: '一言以世界 临境不蹉跎');
},
child: Container(
width: 40,
......@@ -177,9 +224,10 @@ class VideoSlidesState extends State<VideoSlides> {
shape: BoxShape.circle,
),
child: isSharing
? const GFLoader(
type: GFLoaderType.ios,
)
? GFProgressBar(
percentage: currentProgress,
backgroundColor: Colors.black26,
progressBarColor: GFColors.DANGER)
: const Icon(
Icons.share_rounded,
color: Colors.white,
......@@ -203,4 +251,28 @@ class VideoSlidesState extends State<VideoSlides> {
],
);
}
Future<String> getPhoneLocalPath() async {
final directory = Theme.of(context).platform == TargetPlatform.android
? await getExternalStorageDirectory()
: await getApplicationDocumentsDirectory();
return directory!.path;
}
double currentProgress = 0.0;
String tempVideoPath = "";
Future<void> downVideo(String url) async {
String savePath = await getPhoneLocalPath();
String appName = "my_parlando.mp4";
Dio dio = Dio();
tempVideoPath = "$savePath$appName";
Response response = await dio.download(url, tempVideoPath,
onReceiveProgress: (received, total) {
if (total != -1) {
currentProgress = received / total;
setState(() {});
}
});
}
}
......