Showing
12 changed files
with
277 additions
and
26 deletions
... | @@ -280,7 +280,7 @@ class AccountPageState extends State<AccountPage> { | ... | @@ -280,7 +280,7 @@ class AccountPageState extends State<AccountPage> { |
280 | bottomNavigationBar: Consumer( | 280 | bottomNavigationBar: Consumer( |
281 | builder: (_, provider, __) { | 281 | builder: (_, provider, __) { |
282 | return BottomAppBar( | 282 | return BottomAppBar( |
283 | - color: Colors.grey, | 283 | + color: Colors.black54, |
284 | child: Row( | 284 | child: Row( |
285 | mainAxisSize: MainAxisSize.max, | 285 | mainAxisSize: MainAxisSize.max, |
286 | mainAxisAlignment: MainAxisAlignment.spaceAround, | 286 | mainAxisAlignment: MainAxisAlignment.spaceAround, | ... | ... |
... | @@ -18,6 +18,7 @@ import 'package:Parlando/membership/models/order_entity.dart'; | ... | @@ -18,6 +18,7 @@ import 'package:Parlando/membership/models/order_entity.dart'; |
18 | import 'package:Parlando/membership/models/pay_entity.dart'; | 18 | import 'package:Parlando/membership/models/pay_entity.dart'; |
19 | import 'package:Parlando/models/upload_entity.dart'; | 19 | import 'package:Parlando/models/upload_entity.dart'; |
20 | import 'package:Parlando/poem/models/lang_sort_entity.dart'; | 20 | import 'package:Parlando/poem/models/lang_sort_entity.dart'; |
21 | +import 'package:Parlando/poem/models/poem_entity.dart'; | ||
21 | import 'package:Parlando/poem/models/search_entity.dart'; | 22 | import 'package:Parlando/poem/models/search_entity.dart'; |
22 | import 'package:Parlando/timeline/models/friend_entity.dart'; | 23 | import 'package:Parlando/timeline/models/friend_entity.dart'; |
23 | 24 | ||
... | @@ -76,6 +77,9 @@ class JsonConvert { | ... | @@ -76,6 +77,9 @@ class JsonConvert { |
76 | (UploadData).toString(): UploadData.fromJson, | 77 | (UploadData).toString(): UploadData.fromJson, |
77 | (UploadError).toString(): UploadError.fromJson, | 78 | (UploadError).toString(): UploadError.fromJson, |
78 | (LangSortEntity).toString(): LangSortEntity.fromJson, | 79 | (LangSortEntity).toString(): LangSortEntity.fromJson, |
80 | + (PoemEntity).toString(): PoemEntity.fromJson, | ||
81 | + (PoemData).toString(): PoemData.fromJson, | ||
82 | + (PoemError).toString(): PoemError.fromJson, | ||
79 | (SearchEntity).toString(): SearchEntity.fromJson, | 83 | (SearchEntity).toString(): SearchEntity.fromJson, |
80 | (SearchItems).toString(): SearchItems.fromJson, | 84 | (SearchItems).toString(): SearchItems.fromJson, |
81 | (SearchItemsOwner).toString(): SearchItemsOwner.fromJson, | 85 | (SearchItemsOwner).toString(): SearchItemsOwner.fromJson, |
... | @@ -424,6 +428,21 @@ class JsonConvert { | ... | @@ -424,6 +428,21 @@ class JsonConvert { |
424 | (Map<String, dynamic> e) => LangSortEntity.fromJson(e)) | 428 | (Map<String, dynamic> e) => LangSortEntity.fromJson(e)) |
425 | .toList() as M; | 429 | .toList() as M; |
426 | } | 430 | } |
431 | + if (<PoemEntity>[] is M) { | ||
432 | + return data | ||
433 | + .map<PoemEntity>((Map<String, dynamic> e) => PoemEntity.fromJson(e)) | ||
434 | + .toList() as M; | ||
435 | + } | ||
436 | + if (<PoemData>[] is M) { | ||
437 | + return data | ||
438 | + .map<PoemData>((Map<String, dynamic> e) => PoemData.fromJson(e)) | ||
439 | + .toList() as M; | ||
440 | + } | ||
441 | + if (<PoemError>[] is M) { | ||
442 | + return data | ||
443 | + .map<PoemError>((Map<String, dynamic> e) => PoemError.fromJson(e)) | ||
444 | + .toList() as M; | ||
445 | + } | ||
427 | if (<SearchEntity>[] is M) { | 446 | if (<SearchEntity>[] is M) { |
428 | return data | 447 | return data |
429 | .map<SearchEntity>( | 448 | .map<SearchEntity>( | ... | ... |
lib/generated/json/poem_entity.g.dart
0 → 100644
1 | +import 'package:Parlando/generated/json/base/json_convert_content.dart'; | ||
2 | +import 'package:Parlando/poem/models/poem_entity.dart'; | ||
3 | + | ||
4 | +PoemEntity $PoemEntityFromJson(Map<String, dynamic> json) { | ||
5 | + final PoemEntity poemEntity = PoemEntity(); | ||
6 | + final String? status = jsonConvert.convert<String>(json['status']); | ||
7 | + if (status != null) { | ||
8 | + poemEntity.status = status; | ||
9 | + } | ||
10 | + final int? code = jsonConvert.convert<int>(json['code']); | ||
11 | + if (code != null) { | ||
12 | + poemEntity.code = code; | ||
13 | + } | ||
14 | + final String? message = jsonConvert.convert<String>(json['message']); | ||
15 | + if (message != null) { | ||
16 | + poemEntity.message = message; | ||
17 | + } | ||
18 | + final PoemData? data = jsonConvert.convert<PoemData>(json['data']); | ||
19 | + if (data != null) { | ||
20 | + poemEntity.data = data; | ||
21 | + } | ||
22 | + final PoemError? error = jsonConvert.convert<PoemError>(json['error']); | ||
23 | + if (error != null) { | ||
24 | + poemEntity.error = error; | ||
25 | + } | ||
26 | + return poemEntity; | ||
27 | +} | ||
28 | + | ||
29 | +Map<String, dynamic> $PoemEntityToJson(PoemEntity entity) { | ||
30 | + final Map<String, dynamic> data = <String, dynamic>{}; | ||
31 | + data['status'] = entity.status; | ||
32 | + data['code'] = entity.code; | ||
33 | + data['message'] = entity.message; | ||
34 | + data['data'] = entity.data?.toJson(); | ||
35 | + data['error'] = entity.error?.toJson(); | ||
36 | + return data; | ||
37 | +} | ||
38 | + | ||
39 | +PoemData $PoemDataFromJson(Map<String, dynamic> json) { | ||
40 | + final PoemData poemData = PoemData(); | ||
41 | + final int? id = jsonConvert.convert<int>(json['id']); | ||
42 | + if (id != null) { | ||
43 | + poemData.id = id; | ||
44 | + } | ||
45 | + final String? title = jsonConvert.convert<String>(json['title']); | ||
46 | + if (title != null) { | ||
47 | + poemData.title = title; | ||
48 | + } | ||
49 | + final String? author = jsonConvert.convert<String>(json['author']); | ||
50 | + if (author != null) { | ||
51 | + poemData.author = author; | ||
52 | + } | ||
53 | + final String? content = jsonConvert.convert<String>(json['content']); | ||
54 | + if (content != null) { | ||
55 | + poemData.content = content; | ||
56 | + } | ||
57 | + final String? annotate = jsonConvert.convert<String>(json['annotate']); | ||
58 | + if (annotate != null) { | ||
59 | + poemData.annotate = annotate; | ||
60 | + } | ||
61 | + final dynamic? spelling = jsonConvert.convert<dynamic>(json['spelling']); | ||
62 | + if (spelling != null) { | ||
63 | + poemData.spelling = spelling; | ||
64 | + } | ||
65 | + final dynamic? en = jsonConvert.convert<dynamic>(json['en']); | ||
66 | + if (en != null) { | ||
67 | + poemData.en = en; | ||
68 | + } | ||
69 | + final int? state = jsonConvert.convert<int>(json['state']); | ||
70 | + if (state != null) { | ||
71 | + poemData.state = state; | ||
72 | + } | ||
73 | + final String? createdAt = jsonConvert.convert<String>(json['created_at']); | ||
74 | + if (createdAt != null) { | ||
75 | + poemData.createdAt = createdAt; | ||
76 | + } | ||
77 | + final String? updatedAt = jsonConvert.convert<String>(json['updated_at']); | ||
78 | + if (updatedAt != null) { | ||
79 | + poemData.updatedAt = updatedAt; | ||
80 | + } | ||
81 | + return poemData; | ||
82 | +} | ||
83 | + | ||
84 | +Map<String, dynamic> $PoemDataToJson(PoemData entity) { | ||
85 | + final Map<String, dynamic> data = <String, dynamic>{}; | ||
86 | + data['id'] = entity.id; | ||
87 | + data['title'] = entity.title; | ||
88 | + data['author'] = entity.author; | ||
89 | + data['content'] = entity.content; | ||
90 | + data['annotate'] = entity.annotate; | ||
91 | + data['spelling'] = entity.spelling; | ||
92 | + data['en'] = entity.en; | ||
93 | + data['state'] = entity.state; | ||
94 | + data['created_at'] = entity.createdAt; | ||
95 | + data['updated_at'] = entity.updatedAt; | ||
96 | + return data; | ||
97 | +} | ||
98 | + | ||
99 | +PoemError $PoemErrorFromJson(Map<String, dynamic> json) { | ||
100 | + final PoemError poemError = PoemError(); | ||
101 | + return poemError; | ||
102 | +} | ||
103 | + | ||
104 | +Map<String, dynamic> $PoemErrorToJson(PoemError entity) { | ||
105 | + final Map<String, dynamic> data = <String, dynamic>{}; | ||
106 | + return data; | ||
107 | +} |
... | @@ -10,7 +10,7 @@ import 'error_handle.dart'; | ... | @@ -10,7 +10,7 @@ import 'error_handle.dart'; |
10 | /// 默认dio配置 | 10 | /// 默认dio配置 |
11 | int _connectTimeout = 15000; | 11 | int _connectTimeout = 15000; |
12 | int _receiveTimeout = 15000; | 12 | int _receiveTimeout = 15000; |
13 | -int _sendTimeout = 10000; | 13 | +int _sendTimeout = 100000; |
14 | String _baseUrl = ''; | 14 | String _baseUrl = ''; |
15 | List<Interceptor> _interceptors = []; | 15 | List<Interceptor> _interceptors = []; |
16 | 16 | ... | ... |
... | @@ -17,6 +17,7 @@ class HttpApi { | ... | @@ -17,6 +17,7 @@ class HttpApi { |
17 | static const String collect = '/collect'; | 17 | static const String collect = '/collect'; |
18 | static const String order = '/order'; | 18 | static const String order = '/order'; |
19 | static const String pay = '/pay'; | 19 | static const String pay = '/pay'; |
20 | + static const String poem = '/poem'; | ||
20 | static const String search = 'search/repositories'; | 21 | static const String search = 'search/repositories'; |
21 | static const String subscriptions = 'users/simplezhli/subscriptions'; | 22 | static const String subscriptions = 'users/simplezhli/subscriptions'; |
22 | static const String upload = 'uuc/upload-inco'; | 23 | static const String upload = 'uuc/upload-inco'; | ... | ... |
... | @@ -281,7 +281,7 @@ class VideoSlidesState extends State<VideoSlides> { | ... | @@ -281,7 +281,7 @@ class VideoSlidesState extends State<VideoSlides> { |
281 | onPress: () { | 281 | onPress: () { |
282 | eventBus.fire(TransEvent()); | 282 | eventBus.fire(TransEvent()); |
283 | String url = | 283 | String url = |
284 | - '${PoemRouter.poemRecordVideoPage}?id=${widget.videoId}&type=${widget.poemType}'; | 284 | + '${PoemRouter.poemRecordVideoPage}?id=${widget.videoId}&poem=${widget.poemId}&type=${widget.poemType}'; |
285 | NavigatorUtils.push( | 285 | NavigatorUtils.push( |
286 | context, | 286 | context, |
287 | url, | 287 | url, |
... | @@ -294,7 +294,7 @@ class VideoSlidesState extends State<VideoSlides> { | ... | @@ -294,7 +294,7 @@ class VideoSlidesState extends State<VideoSlides> { |
294 | eventBus.fire(TransEvent()); | 294 | eventBus.fire(TransEvent()); |
295 | NavigatorUtils.push( | 295 | NavigatorUtils.push( |
296 | context, | 296 | context, |
297 | - '${PoemRouter.poemRecordAudioPage}?id=${widget.videoId}&type=${widget.poemType}', | 297 | + '${PoemRouter.poemRecordAudioPage}?id=${widget.videoId}&poem=${widget.poemId}&type=${widget.poemType}', |
298 | ); | 298 | ); |
299 | }), | 299 | }), |
300 | ], | 300 | ], | ... | ... |
lib/poem/models/poem_entity.dart
0 → 100644
1 | +import 'package:Parlando/generated/json/base/json_field.dart'; | ||
2 | +import 'package:Parlando/generated/json/poem_entity.g.dart'; | ||
3 | +import 'dart:convert'; | ||
4 | + | ||
5 | +@JsonSerializable() | ||
6 | +class PoemEntity { | ||
7 | + String? status; | ||
8 | + int? code; | ||
9 | + String? message; | ||
10 | + PoemData? data; | ||
11 | + PoemError? error; | ||
12 | + | ||
13 | + PoemEntity(); | ||
14 | + | ||
15 | + factory PoemEntity.fromJson(Map<String, dynamic> json) => | ||
16 | + $PoemEntityFromJson(json); | ||
17 | + | ||
18 | + Map<String, dynamic> toJson() => $PoemEntityToJson(this); | ||
19 | + | ||
20 | + @override | ||
21 | + String toString() { | ||
22 | + return jsonEncode(this); | ||
23 | + } | ||
24 | +} | ||
25 | + | ||
26 | +@JsonSerializable() | ||
27 | +class PoemData { | ||
28 | + int? id; | ||
29 | + String? title; | ||
30 | + String? author; | ||
31 | + String? content; | ||
32 | + String? annotate; | ||
33 | + dynamic spelling; | ||
34 | + dynamic en; | ||
35 | + int? state; | ||
36 | + @JSONField(name: "created_at") | ||
37 | + String? createdAt; | ||
38 | + @JSONField(name: "updated_at") | ||
39 | + String? updatedAt; | ||
40 | + | ||
41 | + PoemData(); | ||
42 | + | ||
43 | + factory PoemData.fromJson(Map<String, dynamic> json) => | ||
44 | + $PoemDataFromJson(json); | ||
45 | + | ||
46 | + Map<String, dynamic> toJson() => $PoemDataToJson(this); | ||
47 | + | ||
48 | + @override | ||
49 | + String toString() { | ||
50 | + return jsonEncode(this); | ||
51 | + } | ||
52 | +} | ||
53 | + | ||
54 | +@JsonSerializable() | ||
55 | +class PoemError { | ||
56 | + PoemError(); | ||
57 | + | ||
58 | + factory PoemError.fromJson(Map<String, dynamic> json) => | ||
59 | + $PoemErrorFromJson(json); | ||
60 | + | ||
61 | + Map<String, dynamic> toJson() => $PoemErrorToJson(this); | ||
62 | + | ||
63 | + @override | ||
64 | + String toString() { | ||
65 | + return jsonEncode(this); | ||
66 | + } | ||
67 | +} |
... | @@ -94,7 +94,7 @@ class _PoemCompletePageState extends State<PoemCompletePage> { | ... | @@ -94,7 +94,7 @@ class _PoemCompletePageState extends State<PoemCompletePage> { |
94 | } | 94 | } |
95 | 95 | ||
96 | Future<bool> _isExit() async { | 96 | Future<bool> _isExit() async { |
97 | - NavigatorUtils.push(context, Routes.home, clearStack: true); | 97 | + NavigatorUtils.push(context, Routes.navBarPage, clearStack: true); |
98 | return Future.value(false); | 98 | return Future.value(false); |
99 | } | 99 | } |
100 | } | 100 | } | ... | ... |
... | @@ -31,14 +31,16 @@ class PoemPublish extends StatefulWidget { | ... | @@ -31,14 +31,16 @@ class PoemPublish extends StatefulWidget { |
31 | final String data; | 31 | final String data; |
32 | 32 | ||
33 | @override | 33 | @override |
34 | - _PoemPublishState createState() => _PoemPublishState(); | 34 | + PoemPublishState createState() => PoemPublishState(); |
35 | } | 35 | } |
36 | 36 | ||
37 | -class _PoemPublishState extends State<PoemPublish> { | 37 | +class PoemPublishState extends State<PoemPublish> { |
38 | bool isPublishing = false; | 38 | bool isPublishing = false; |
39 | String _langSortName = "普通话"; | 39 | String _langSortName = "普通话"; |
40 | int _langSortId = 1; //TODO 传入服务器的口音ID | 40 | int _langSortId = 1; //TODO 传入服务器的口音ID |
41 | String _address = '我在此地'; | 41 | String _address = '我在此地'; |
42 | + String _longitude = ""; | ||
43 | + String _latitude = ""; | ||
42 | final LangSortProvider _provider = LangSortProvider(); | 44 | final LangSortProvider _provider = LangSortProvider(); |
43 | 45 | ||
44 | final TextEditingController _msgController = TextEditingController(); | 46 | final TextEditingController _msgController = TextEditingController(); |
... | @@ -106,6 +108,8 @@ class _PoemPublishState extends State<PoemPublish> { | ... | @@ -106,6 +108,8 @@ class _PoemPublishState extends State<PoemPublish> { |
106 | context, PoemRouter.addressSelectPage, (result) { | 108 | context, PoemRouter.addressSelectPage, (result) { |
107 | setState(() { | 109 | setState(() { |
108 | final PoiSearch model = result as PoiSearch; | 110 | final PoiSearch model = result as PoiSearch; |
111 | + _longitude = model.longitude!; | ||
112 | + _latitude = model.latitude!; | ||
109 | _address = | 113 | _address = |
110 | '${model.provinceName!} ${model.cityName!} ${model.adName!} ${model.title!}'; | 114 | '${model.provinceName!} ${model.cityName!} ${model.adName!} ${model.title!}'; |
111 | }); | 115 | }); |
... | @@ -246,13 +250,16 @@ class _PoemPublishState extends State<PoemPublish> { | ... | @@ -246,13 +250,16 @@ class _PoemPublishState extends State<PoemPublish> { |
246 | params: formData, | 250 | params: formData, |
247 | onSuccess: (data) { | 251 | onSuccess: (data) { |
248 | String path = data!.data!.relativePath!; | 252 | String path = data!.data!.relativePath!; |
249 | - String videoId = '${widget.id}'; //TODO 临时用video id | 253 | + String videoId = '${widget.id}'; |
250 | 254 | ||
251 | Map<String, String> params = <String, String>{ | 255 | Map<String, String> params = <String, String>{ |
252 | "item_id": videoId, | 256 | "item_id": videoId, |
253 | "item_url": path, | 257 | "item_url": path, |
254 | "content": msg, | 258 | "content": msg, |
255 | "type": '${widget.type}', | 259 | "type": '${widget.type}', |
260 | + "longitude": _longitude, | ||
261 | + "latitude": _latitude, | ||
262 | + "location": _address, | ||
256 | }; | 263 | }; |
257 | DioUtils.instance.asyncRequestNetwork( | 264 | DioUtils.instance.asyncRequestNetwork( |
258 | Method.post, | 265 | Method.post, |
... | @@ -273,6 +280,7 @@ class _PoemPublishState extends State<PoemPublish> { | ... | @@ -273,6 +280,7 @@ class _PoemPublishState extends State<PoemPublish> { |
273 | ); | 280 | ); |
274 | }, | 281 | }, |
275 | onError: (code, msg) { | 282 | onError: (code, msg) { |
283 | + Toast.show(msg.toString()); | ||
276 | isPublishing = false; | 284 | isPublishing = false; |
277 | setState(() {}); | 285 | setState(() {}); |
278 | }, | 286 | }, |
... | @@ -301,7 +309,8 @@ class _PoemPublishState extends State<PoemPublish> { | ... | @@ -301,7 +309,8 @@ class _PoemPublishState extends State<PoemPublish> { |
301 | TextButton( | 309 | TextButton( |
302 | child: const Text("残忍放弃"), | 310 | child: const Text("残忍放弃"), |
303 | onPressed: () { | 311 | onPressed: () { |
304 | - NavigatorUtils.push(context, Routes.home, clearStack: true); | 312 | + NavigatorUtils.push(context, Routes.navBarPage, |
313 | + clearStack: true); | ||
305 | }, | 314 | }, |
306 | ), | 315 | ), |
307 | ], | 316 | ], | ... | ... |
1 | import 'dart:async'; | 1 | import 'dart:async'; |
2 | import 'dart:io'; | 2 | import 'dart:io'; |
3 | 3 | ||
4 | +import 'package:Parlando/net/dio_utils.dart'; | ||
5 | +import 'package:Parlando/net/http_api.dart'; | ||
6 | +import 'package:Parlando/poem/models/poem_entity.dart'; | ||
4 | import 'package:camera/camera.dart'; | 7 | import 'package:camera/camera.dart'; |
5 | import 'package:flutter/material.dart'; | 8 | import 'package:flutter/material.dart'; |
6 | import 'package:flutter/services.dart'; | 9 | import 'package:flutter/services.dart'; |
... | @@ -18,12 +21,14 @@ import '../poem_router.dart'; | ... | @@ -18,12 +21,14 @@ import '../poem_router.dart'; |
18 | 21 | ||
19 | class PoemRecordVideoPage extends StatefulWidget { | 22 | class PoemRecordVideoPage extends StatefulWidget { |
20 | final int id; | 23 | final int id; |
24 | + final int poemId; | ||
21 | final int type; | 25 | final int type; |
22 | 26 | ||
23 | const PoemRecordVideoPage({ | 27 | const PoemRecordVideoPage({ |
24 | Key? key, | 28 | Key? key, |
25 | required this.id, | 29 | required this.id, |
26 | required this.type, | 30 | required this.type, |
31 | + required this.poemId, | ||
27 | }) : super(key: key); | 32 | }) : super(key: key); |
28 | 33 | ||
29 | @override | 34 | @override |
... | @@ -36,7 +41,7 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> | ... | @@ -36,7 +41,7 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> |
36 | VideoPlayerController? videoController; | 41 | VideoPlayerController? videoController; |
37 | 42 | ||
38 | File? _videoFile; // 保存的视频文件位置,用于上传视频的时候用! | 43 | File? _videoFile; // 保存的视频文件位置,用于上传视频的时候用! |
39 | - | 44 | + PoemData? _poem; |
40 | final bool _isVideoCameraSelected = true; | 45 | final bool _isVideoCameraSelected = true; |
41 | bool _isCameraInitialized = false; | 46 | bool _isCameraInitialized = false; |
42 | bool _isRearCameraSelected = true; | 47 | bool _isRearCameraSelected = true; |
... | @@ -69,9 +74,11 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> | ... | @@ -69,9 +74,11 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> |
69 | } | 74 | } |
70 | }); | 75 | }); |
71 | 76 | ||
77 | + fetchPoemDetail(); | ||
78 | + | ||
72 | _timer = PausableTimer( | 79 | _timer = PausableTimer( |
73 | const Duration(milliseconds: 100), | 80 | const Duration(milliseconds: 100), |
74 | - () { | 81 | + () { |
75 | currentTimer += 100; | 82 | currentTimer += 100; |
76 | _timer | 83 | _timer |
77 | ..reset() | 84 | ..reset() |
... | @@ -85,6 +92,19 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> | ... | @@ -85,6 +92,19 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> |
85 | super.initState(); | 92 | super.initState(); |
86 | } | 93 | } |
87 | 94 | ||
95 | + Future<void> fetchPoemDetail() async { | ||
96 | + DioUtils.instance.asyncRequestNetwork<PoemEntity>( | ||
97 | + Method.get, | ||
98 | + "${HttpApi.poem}/${widget.poemId}", | ||
99 | + params: [], | ||
100 | + onSuccess: (data) { | ||
101 | + _poem = data!.data!; | ||
102 | + setState(() {}); | ||
103 | + }, | ||
104 | + onError: (code, msg) {}, | ||
105 | + ); | ||
106 | + } | ||
107 | + | ||
88 | Future<List<CameraDescription>?> initCameras() async { | 108 | Future<List<CameraDescription>?> initCameras() async { |
89 | try { | 109 | try { |
90 | WidgetsFlutterBinding.ensureInitialized(); | 110 | WidgetsFlutterBinding.ensureInitialized(); |
... | @@ -262,16 +282,19 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> | ... | @@ -262,16 +282,19 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> |
262 | ); | 282 | ); |
263 | // TODO why pause!直接使用cancel()会出现问题,暂时这么解决 | 283 | // TODO why pause!直接使用cancel()会出现问题,暂时这么解决 |
264 | _timer.pause(); | 284 | _timer.pause(); |
265 | - | 285 | + _gotoNext(currentUnix, fileFormat); |
266 | - NavigatorUtils.push( | ||
267 | - context, | ||
268 | - '${PoemRouter.poemVideoPlayer}?url=$currentUnix.$fileFormat&id=${widget.id}&type=${widget.type}', | ||
269 | - ); | ||
270 | } catch (e) { | 286 | } catch (e) { |
271 | // print(e); | 287 | // print(e); |
272 | } | 288 | } |
273 | } | 289 | } |
274 | 290 | ||
291 | + void _gotoNext(int currentUnix, String fileFormat) { | ||
292 | + NavigatorUtils.push( | ||
293 | + context, | ||
294 | + '${PoemRouter.poemVideoPlayer}?url=$currentUnix.$fileFormat&id=${widget.id}&poemId=${widget.poemId}&type=${widget.type}', | ||
295 | + ); | ||
296 | + } | ||
297 | + | ||
275 | @override | 298 | @override |
276 | Widget build(BuildContext context) { | 299 | Widget build(BuildContext context) { |
277 | return SafeArea( | 300 | return SafeArea( |
... | @@ -290,7 +313,7 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> | ... | @@ -290,7 +313,7 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> |
290 | crossAxisAlignment: CrossAxisAlignment.start, | 313 | crossAxisAlignment: CrossAxisAlignment.start, |
291 | children: [ | 314 | children: [ |
292 | Text( | 315 | Text( |
293 | - "题破山寺后禅院", | 316 | + _poem != null ? _poem!.title.toString() : "", |
294 | style: TextStyle( | 317 | style: TextStyle( |
295 | color: Colors.white, | 318 | color: Colors.white, |
296 | fontSize: 28.px, | 319 | fontSize: 28.px, |
... | @@ -298,7 +321,7 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> | ... | @@ -298,7 +321,7 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> |
298 | ), | 321 | ), |
299 | Gaps.vGap10, | 322 | Gaps.vGap10, |
300 | Text( | 323 | Text( |
301 | - "常建", | 324 | + _poem != null ? _poem!.author.toString() : "", |
302 | style: TextStyle( | 325 | style: TextStyle( |
303 | color: Colors.white, | 326 | color: Colors.white, |
304 | fontSize: 15.px, | 327 | fontSize: 15.px, |
... | @@ -306,7 +329,7 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> | ... | @@ -306,7 +329,7 @@ class PoemRecordVideoPageState extends State<PoemRecordVideoPage> |
306 | ), | 329 | ), |
307 | Gaps.vGap5, | 330 | Gaps.vGap5, |
308 | Text( | 331 | Text( |
309 | - "清晨入古寺,\n初日照高林。\n曲径通幽处,\n禅房花木深。\n山光悦鸟性,\n潭影空人心。\n万籁此都寂,\n但余钟磬音。\n", | 332 | + _poem != null ? _poem!.content.toString() : "", |
310 | style: TextStyle( | 333 | style: TextStyle( |
311 | color: Colors.white, | 334 | color: Colors.white, |
312 | fontFamily: "ZCOOLXiaoWei", | 335 | fontFamily: "ZCOOLXiaoWei", | ... | ... |
... | @@ -6,6 +6,9 @@ import 'package:Parlando/widgets/my_app_bar.dart'; | ... | @@ -6,6 +6,9 @@ import 'package:Parlando/widgets/my_app_bar.dart'; |
6 | import 'package:Parlando/extension/int_extension.dart'; | 6 | import 'package:Parlando/extension/int_extension.dart'; |
7 | import 'package:path_provider/path_provider.dart'; | 7 | import 'package:path_provider/path_provider.dart'; |
8 | 8 | ||
9 | +import '../../net/dio_utils.dart'; | ||
10 | +import '../../net/http_api.dart'; | ||
11 | +import '../models/poem_entity.dart'; | ||
9 | import '../poem_router.dart'; | 12 | import '../poem_router.dart'; |
10 | 13 | ||
11 | class PoemVideoPlayer extends StatefulWidget { | 14 | class PoemVideoPlayer extends StatefulWidget { |
... | @@ -13,6 +16,7 @@ class PoemVideoPlayer extends StatefulWidget { | ... | @@ -13,6 +16,7 @@ class PoemVideoPlayer extends StatefulWidget { |
13 | final String? title; | 16 | final String? title; |
14 | final int id; | 17 | final int id; |
15 | final int type; | 18 | final int type; |
19 | + final int poemId; | ||
16 | 20 | ||
17 | const PoemVideoPlayer({ | 21 | const PoemVideoPlayer({ |
18 | Key? key, | 22 | Key? key, |
... | @@ -20,16 +24,18 @@ class PoemVideoPlayer extends StatefulWidget { | ... | @@ -20,16 +24,18 @@ class PoemVideoPlayer extends StatefulWidget { |
20 | this.title, | 24 | this.title, |
21 | required this.id, | 25 | required this.id, |
22 | required this.type, | 26 | required this.type, |
27 | + required this.poemId, | ||
23 | }) : super(key: key); | 28 | }) : super(key: key); |
24 | 29 | ||
25 | @override | 30 | @override |
26 | - _PoemVideoPlayerState createState() => _PoemVideoPlayerState(); | 31 | + PoemVideoPlayerState createState() => PoemVideoPlayerState(); |
27 | } | 32 | } |
28 | 33 | ||
29 | -class _PoemVideoPlayerState extends State<PoemVideoPlayer> { | 34 | +class PoemVideoPlayerState extends State<PoemVideoPlayer> { |
30 | final FijkPlayer player = FijkPlayer(); | 35 | final FijkPlayer player = FijkPlayer(); |
36 | + PoemData? _poem; | ||
31 | 37 | ||
32 | - _PoemVideoPlayerState(); | 38 | + PoemVideoPlayerState(); |
33 | 39 | ||
34 | Future<String> _getDir() async { | 40 | Future<String> _getDir() async { |
35 | final directory = await getApplicationDocumentsDirectory(); | 41 | final directory = await getApplicationDocumentsDirectory(); |
... | @@ -40,13 +46,28 @@ class _PoemVideoPlayerState extends State<PoemVideoPlayer> { | ... | @@ -40,13 +46,28 @@ class _PoemVideoPlayerState extends State<PoemVideoPlayer> { |
40 | void initState() { | 46 | void initState() { |
41 | super.initState(); | 47 | super.initState(); |
42 | _getDir().then((value) { | 48 | _getDir().then((value) { |
43 | - String path = "$value/" + widget.url; | 49 | + String path = "$value/${widget.url}"; |
44 | player.setDataSource( | 50 | player.setDataSource( |
45 | path, | 51 | path, |
46 | autoPlay: true, | 52 | autoPlay: true, |
47 | ); | 53 | ); |
48 | player.setLoop(0); | 54 | player.setLoop(0); |
49 | }); | 55 | }); |
56 | + | ||
57 | + fetchPoemDetail(); | ||
58 | + } | ||
59 | + | ||
60 | + Future<void> fetchPoemDetail() async { | ||
61 | + DioUtils.instance.asyncRequestNetwork<PoemEntity>( | ||
62 | + Method.get, | ||
63 | + "${HttpApi.poem}/${widget.poemId}", | ||
64 | + params: [], | ||
65 | + onSuccess: (data) { | ||
66 | + _poem = data!.data!; | ||
67 | + setState(() {}); | ||
68 | + }, | ||
69 | + onError: (code, msg) {}, | ||
70 | + ); | ||
50 | } | 71 | } |
51 | 72 | ||
52 | @override | 73 | @override |
... | @@ -76,7 +97,7 @@ class _PoemVideoPlayerState extends State<PoemVideoPlayer> { | ... | @@ -76,7 +97,7 @@ class _PoemVideoPlayerState extends State<PoemVideoPlayer> { |
76 | crossAxisAlignment: CrossAxisAlignment.start, | 97 | crossAxisAlignment: CrossAxisAlignment.start, |
77 | children: [ | 98 | children: [ |
78 | Text( | 99 | Text( |
79 | - "题破山寺后禅院", | 100 | + _poem != null ? _poem!.title.toString() : "", |
80 | style: TextStyle( | 101 | style: TextStyle( |
81 | color: Colors.white, | 102 | color: Colors.white, |
82 | fontSize: 28.px, | 103 | fontSize: 28.px, |
... | @@ -84,7 +105,7 @@ class _PoemVideoPlayerState extends State<PoemVideoPlayer> { | ... | @@ -84,7 +105,7 @@ class _PoemVideoPlayerState extends State<PoemVideoPlayer> { |
84 | ), | 105 | ), |
85 | Gaps.vGap10, | 106 | Gaps.vGap10, |
86 | Text( | 107 | Text( |
87 | - "常建", | 108 | + _poem != null ? _poem!.author.toString() : "", |
88 | style: TextStyle( | 109 | style: TextStyle( |
89 | color: Colors.white, | 110 | color: Colors.white, |
90 | fontSize: 15.px, | 111 | fontSize: 15.px, |
... | @@ -92,7 +113,7 @@ class _PoemVideoPlayerState extends State<PoemVideoPlayer> { | ... | @@ -92,7 +113,7 @@ class _PoemVideoPlayerState extends State<PoemVideoPlayer> { |
92 | ), | 113 | ), |
93 | Gaps.vGap5, | 114 | Gaps.vGap5, |
94 | Text( | 115 | Text( |
95 | - "清晨入古寺,\n初日照高林。\n曲径通幽处,\n禅房花木深。\n山光悦鸟性,\n潭影空人心。\n万籁此都寂,\n但余钟磬音。\n", | 116 | + _poem != null ? _poem!.content.toString() : "", |
96 | style: TextStyle( | 117 | style: TextStyle( |
97 | color: Colors.white, | 118 | color: Colors.white, |
98 | fontFamily: "ZCOOLXiaoWei", | 119 | fontFamily: "ZCOOLXiaoWei", | ... | ... |
... | @@ -62,10 +62,12 @@ class PoemRouter implements IRouterProvider { | ... | @@ -62,10 +62,12 @@ class PoemRouter implements IRouterProvider { |
62 | handler: Handler( | 62 | handler: Handler( |
63 | handlerFunc: (_, Map<String, List<String>> params) { | 63 | handlerFunc: (_, Map<String, List<String>> params) { |
64 | String? id = params['id']?.first; | 64 | String? id = params['id']?.first; |
65 | + int? poem = int.parse(params['poem']!.first); | ||
65 | String? type = params['type']?.first; | 66 | String? type = params['type']?.first; |
66 | return PoemRecordVideoPage( | 67 | return PoemRecordVideoPage( |
67 | id: int.parse(id!), | 68 | id: int.parse(id!), |
68 | type: int.parse(type!), | 69 | type: int.parse(type!), |
70 | + poemId: poem, | ||
69 | ); | 71 | ); |
70 | }, | 72 | }, |
71 | ), | 73 | ), |
... | @@ -78,10 +80,12 @@ class PoemRouter implements IRouterProvider { | ... | @@ -78,10 +80,12 @@ class PoemRouter implements IRouterProvider { |
78 | String? url = params['url']?.first; | 80 | String? url = params['url']?.first; |
79 | String? id = params['id']?.first; | 81 | String? id = params['id']?.first; |
80 | String? type = params['type']?.first; | 82 | String? type = params['type']?.first; |
83 | + int? poem = int.parse(params['poemId']!.first); | ||
81 | return PoemVideoPlayer( | 84 | return PoemVideoPlayer( |
82 | url: url!, | 85 | url: url!, |
83 | id: int.parse(id!), | 86 | id: int.parse(id!), |
84 | type: int.parse(type!), | 87 | type: int.parse(type!), |
88 | + poemId: poem, | ||
85 | ); | 89 | ); |
86 | }, | 90 | }, |
87 | ), | 91 | ), | ... | ... |
-
Please register or login to post a comment