Showing
7 changed files
with
162 additions
and
116 deletions
1 | import 'dart:async'; | 1 | import 'dart:async'; |
2 | 2 | ||
3 | +import 'package:Parlando/account/account_router.dart'; | ||
3 | import 'package:Parlando/events/trans_event.dart'; | 4 | import 'package:Parlando/events/trans_event.dart'; |
4 | import 'package:Parlando/home/models/home_entity.dart'; | 5 | import 'package:Parlando/home/models/home_entity.dart'; |
6 | +import 'package:Parlando/home/provider/home_provider.dart'; | ||
5 | import 'package:Parlando/net/dio_utils.dart'; | 7 | import 'package:Parlando/net/dio_utils.dart'; |
6 | import 'package:Parlando/net/http_api.dart'; | 8 | import 'package:Parlando/net/http_api.dart'; |
7 | import 'package:Parlando/util/toast_utils.dart'; | 9 | import 'package:Parlando/util/toast_utils.dart'; |
10 | +import 'package:animated_radial_menu/animated_radial_menu.dart'; | ||
8 | import 'package:flutter/material.dart'; | 11 | import 'package:flutter/material.dart'; |
9 | import 'package:Parlando/category/category_router.dart'; | 12 | import 'package:Parlando/category/category_router.dart'; |
10 | import 'package:Parlando/poem/poem_router.dart'; | 13 | import 'package:Parlando/poem/poem_router.dart'; |
... | @@ -21,20 +24,22 @@ import 'package:Parlando/tiktok/widgets/tiktok_video_poem.dart'; | ... | @@ -21,20 +24,22 @@ import 'package:Parlando/tiktok/widgets/tiktok_video_poem.dart'; |
21 | import 'package:Parlando/widgets/bars/home_types_bar.dart'; | 24 | import 'package:Parlando/widgets/bars/home_types_bar.dart'; |
22 | import 'package:Parlando/widgets/my_app_bar.dart'; | 25 | import 'package:Parlando/widgets/my_app_bar.dart'; |
23 | import 'package:getwidget/getwidget.dart'; | 26 | import 'package:getwidget/getwidget.dart'; |
27 | +import 'package:provider/provider.dart'; | ||
24 | import 'package:video_player/video_player.dart'; | 28 | import 'package:video_player/video_player.dart'; |
25 | 29 | ||
26 | import 'poem_detail.dart'; | 30 | import 'poem_detail.dart'; |
27 | 31 | ||
28 | import 'package:Parlando/extension/int_extension.dart'; | 32 | import 'package:Parlando/extension/int_extension.dart'; |
33 | +import 'package:flutter_gen/gen_l10n/Parlando_localizations.dart'; | ||
29 | 34 | ||
30 | class PoemPage extends StatefulWidget { | 35 | class PoemPage extends StatefulWidget { |
31 | const PoemPage({Key? key}) : super(key: key); | 36 | const PoemPage({Key? key}) : super(key: key); |
32 | 37 | ||
33 | @override | 38 | @override |
34 | - _PoemPageState createState() => _PoemPageState(); | 39 | + PoemPageState createState() => PoemPageState(); |
35 | } | 40 | } |
36 | 41 | ||
37 | -class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { | 42 | +class PoemPageState extends State<PoemPage> with WidgetsBindingObserver { |
38 | TikTokScaffoldController tkController = TikTokScaffoldController(); | 43 | TikTokScaffoldController tkController = TikTokScaffoldController(); |
39 | final PageController _pageController = PageController(); | 44 | final PageController _pageController = PageController(); |
40 | final TikTokVideoListController _videoListController = | 45 | final TikTokVideoListController _videoListController = |
... | @@ -43,6 +48,9 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { | ... | @@ -43,6 +48,9 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { |
43 | late StreamSubscription bus; | 48 | late StreamSubscription bus; |
44 | bool isLoading = false; | 49 | bool isLoading = false; |
45 | 50 | ||
51 | + String currentPoemId = ''; | ||
52 | + String currentPoemType = ''; | ||
53 | + | ||
46 | @override | 54 | @override |
47 | void didChangeAppLifecycleState(AppLifecycleState state) async { | 55 | void didChangeAppLifecycleState(AppLifecycleState state) async { |
48 | if (state != AppLifecycleState.resumed) { | 56 | if (state != AppLifecycleState.resumed) { |
... | @@ -76,9 +84,13 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { | ... | @@ -76,9 +84,13 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { |
76 | image: '', | 84 | image: '', |
77 | url: data.url!, | 85 | url: data.url!, |
78 | desc: data.content, | 86 | desc: data.content, |
87 | + poemId: '${data.poemId}', | ||
88 | + poemType: '${data.type}', | ||
79 | ), | 89 | ), |
80 | ); | 90 | ); |
81 | } | 91 | } |
92 | + currentPoemId = videoDataList.first.poemId; | ||
93 | + currentPoemType = videoDataList.first.poemType; | ||
82 | _videoListController.init( | 94 | _videoListController.init( |
83 | pageController: _pageController, | 95 | pageController: _pageController, |
84 | initialList: videoDataList | 96 | initialList: videoDataList |
... | @@ -89,6 +101,7 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { | ... | @@ -89,6 +101,7 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { |
89 | ), | 101 | ), |
90 | ) | 102 | ) |
91 | .toList(), | 103 | .toList(), |
104 | + //TODO 增量加载 | ||
92 | videoProvider: (int index, List<VPVideoController> list) async { | 105 | videoProvider: (int index, List<VPVideoController> list) async { |
93 | return videoDataList | 106 | return videoDataList |
94 | .map( | 107 | .map( |
... | @@ -184,6 +197,12 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { | ... | @@ -184,6 +197,12 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { |
184 | page: Stack( | 197 | page: Stack( |
185 | children: <Widget>[ | 198 | children: <Widget>[ |
186 | PageView.builder( | 199 | PageView.builder( |
200 | + onPageChanged: (p) { | ||
201 | + currentPoemId = | ||
202 | + _videoListController.currentPlayer.videoInfo!.poemId; | ||
203 | + currentPoemType = | ||
204 | + _videoListController.currentPlayer.videoInfo!.poemType; | ||
205 | + }, | ||
187 | key: const Key('home'), | 206 | key: const Key('home'), |
188 | physics: const QuickerScrollPhysics(), | 207 | physics: const QuickerScrollPhysics(), |
189 | controller: _pageController, | 208 | controller: _pageController, |
... | @@ -205,7 +224,7 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { | ... | @@ -205,7 +224,7 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { |
205 | Widget poem = TikTokVidePoem( | 224 | Widget poem = TikTokVidePoem( |
206 | title: "每日一言", | 225 | title: "每日一言", |
207 | poem: | 226 | poem: |
208 | - "清晨入古寺,初日照高林。\n曲径通幽处,禅房花木深。\n山光悦鸟性,潭影空人心。\n万籁此都寂,但余钟磬音。\n", | 227 | + "清晨入古寺,初日照高林。\n曲径通幽处,禅房花木深。\n山光悦鸟性,潭影空人心。\n万籁此都寂,但余钟磬音。\n", |
209 | author: "----《题破山寺后禅院》常建", | 228 | author: "----《题破山寺后禅院》常建", |
210 | onShowDetail: () { | 229 | onShowDetail: () { |
211 | tkController.animateToPage(TikTokPagePosition.right); | 230 | tkController.animateToPage(TikTokPagePosition.right); |
... | @@ -247,6 +266,86 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { | ... | @@ -247,6 +266,86 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { |
247 | currentPage ?? Container(), | 266 | currentPage ?? Container(), |
248 | ], | 267 | ], |
249 | ), | 268 | ), |
269 | + floatingActionButton: SizedBox( | ||
270 | + height: 60, | ||
271 | + child: RadialMenu( | ||
272 | + children: [ | ||
273 | + RadialButton( | ||
274 | + icon: const Icon(Icons.video_call_outlined), | ||
275 | + buttonColor: Colors.teal, | ||
276 | + onPress: () { | ||
277 | + String url = | ||
278 | + '${PoemRouter.poemRecordVideoPage}?id=$currentPoemId&type=$currentPoemType'; | ||
279 | + print("===========================" + url); | ||
280 | + eventBus.fire(TransEvent()); | ||
281 | + NavigatorUtils.push( | ||
282 | + context, | ||
283 | + url, | ||
284 | + ); | ||
285 | + }), | ||
286 | + RadialButton( | ||
287 | + icon: const Icon(Icons.mic_none_outlined), | ||
288 | + buttonColor: Colors.green, | ||
289 | + onPress: () { | ||
290 | + eventBus.fire(TransEvent()); | ||
291 | + NavigatorUtils.push( | ||
292 | + context, | ||
293 | + '${PoemRouter.poemRecordAudioPage}?id=$currentPoemId&type=$currentPoemType', | ||
294 | + ); | ||
295 | + }), | ||
296 | + ], | ||
297 | + ), | ||
298 | + ), | ||
299 | + bottomNavigationBar: Consumer<HomeProvider>( | ||
300 | + builder: (_, provider, __) { | ||
301 | + return BottomAppBar( | ||
302 | + color: Colors.grey, | ||
303 | + child: Row( | ||
304 | + mainAxisSize: MainAxisSize.max, | ||
305 | + mainAxisAlignment: MainAxisAlignment.spaceAround, | ||
306 | + children: <Widget>[ | ||
307 | + InkWell( | ||
308 | + onTap: () {}, | ||
309 | + child: Container( | ||
310 | + alignment: Alignment.center, | ||
311 | + height: 36.0, | ||
312 | + child: Text( | ||
313 | + ParlandoLocalizations.of(context) | ||
314 | + .onePoemBottomNavigationBarItemTitle, | ||
315 | + style: const TextStyle( | ||
316 | + color: Colors.white54, | ||
317 | + fontSize: 15.0, | ||
318 | + ), | ||
319 | + ), | ||
320 | + ), | ||
321 | + ), | ||
322 | + InkWell( | ||
323 | + onTap: () { | ||
324 | + eventBus.fire(TransEvent()); | ||
325 | + NavigatorUtils.push( | ||
326 | + context, | ||
327 | + AccountRouter.accountPage, | ||
328 | + ); | ||
329 | + }, | ||
330 | + child: Container( | ||
331 | + alignment: Alignment.center, | ||
332 | + height: 36.0, | ||
333 | + child: Text( | ||
334 | + ParlandoLocalizations.of(context) | ||
335 | + .profileBottomNavigationBarItemTitle, | ||
336 | + style: const TextStyle( | ||
337 | + color: Colors.white54, | ||
338 | + fontSize: 15.0, | ||
339 | + ), | ||
340 | + ), | ||
341 | + ), | ||
342 | + ), | ||
343 | + ]), | ||
344 | + ); | ||
345 | + }, | ||
346 | + ), | ||
347 | + floatingActionButtonLocation: | ||
348 | + FloatingActionButtonLocation.centerDocked, | ||
250 | ); | 349 | ); |
251 | } | 350 | } |
252 | } | 351 | } | ... | ... |
... | @@ -19,8 +19,15 @@ import 'package:path_provider/path_provider.dart'; | ... | @@ -19,8 +19,15 @@ import 'package:path_provider/path_provider.dart'; |
19 | import '../poem_router.dart'; | 19 | import '../poem_router.dart'; |
20 | 20 | ||
21 | class PoemPublish extends StatefulWidget { | 21 | class PoemPublish extends StatefulWidget { |
22 | - const PoemPublish({Key? key, required this.data}) : super(key: key); | 22 | + const PoemPublish({ |
23 | + Key? key, | ||
24 | + required this.data, | ||
25 | + required this.id, | ||
26 | + required this.type, | ||
27 | + }) : super(key: key); | ||
23 | 28 | ||
29 | + final int id; | ||
30 | + final int type; | ||
24 | final String data; | 31 | final String data; |
25 | 32 | ||
26 | @override | 33 | @override |
... | @@ -214,7 +221,7 @@ class _PoemPublishState extends State<PoemPublish> { | ... | @@ -214,7 +221,7 @@ class _PoemPublishState extends State<PoemPublish> { |
214 | Future<dynamic> _getUploadVideo() async { | 221 | Future<dynamic> _getUploadVideo() async { |
215 | final directory = await getApplicationDocumentsDirectory(); | 222 | final directory = await getApplicationDocumentsDirectory(); |
216 | dynamic video = await MultipartFile.fromFile( | 223 | dynamic video = await MultipartFile.fromFile( |
217 | - directory.path + "/" + widget.data, | 224 | + "${directory.path}/${widget.data}", |
218 | filename: "video.mp4"); | 225 | filename: "video.mp4"); |
219 | return video; | 226 | return video; |
220 | } | 227 | } |
... | @@ -239,12 +246,13 @@ class _PoemPublishState extends State<PoemPublish> { | ... | @@ -239,12 +246,13 @@ class _PoemPublishState extends State<PoemPublish> { |
239 | params: formData, | 246 | params: formData, |
240 | onSuccess: (data) { | 247 | onSuccess: (data) { |
241 | String path = data!.data!.relativePath!; | 248 | String path = data!.data!.relativePath!; |
242 | - String videoId = "1"; //TODO 临时用video id | 249 | + String videoId = '${widget.id}'; //TODO 临时用video id |
243 | 250 | ||
244 | Map<String, String> params = <String, String>{ | 251 | Map<String, String> params = <String, String>{ |
245 | - "video_id": videoId, | 252 | + "item_id": videoId, |
246 | - "video_url": path, | 253 | + "item_url": path, |
247 | "content": msg, | 254 | "content": msg, |
255 | + "type": '${widget.type}', | ||
248 | }; | 256 | }; |
249 | DioUtils.instance.asyncRequestNetwork( | 257 | DioUtils.instance.asyncRequestNetwork( |
250 | Method.post, | 258 | Method.post, | ... | ... |
... | @@ -16,13 +16,20 @@ import 'package:Parlando/extension/int_extension.dart'; | ... | @@ -16,13 +16,20 @@ import 'package:Parlando/extension/int_extension.dart'; |
16 | import '../poem_router.dart'; | 16 | import '../poem_router.dart'; |
17 | 17 | ||
18 | class PoemRecordVideoPage extends StatefulWidget { | 18 | class PoemRecordVideoPage extends StatefulWidget { |
19 | - const PoemRecordVideoPage({Key? key}) : super(key: key); | 19 | + final int id; |
20 | + final int type; | ||
21 | + | ||
22 | + const PoemRecordVideoPage({ | ||
23 | + Key? key, | ||
24 | + required this.id, | ||
25 | + required this.type, | ||
26 | + }) : super(key: key); | ||
20 | 27 | ||
21 | @override | 28 | @override |
22 | - _PoemRecordVideoPageState createState() => _PoemRecordVideoPageState(); | 29 | + PoemRecordVideoPageState createState() => PoemRecordVideoPageState(); |
23 | } | 30 | } |
24 | 31 | ||
25 | -class _PoemRecordVideoPageState extends State<PoemRecordVideoPage> | 32 | +class PoemRecordVideoPageState extends State<PoemRecordVideoPage> |
26 | with WidgetsBindingObserver { | 33 | with WidgetsBindingObserver { |
27 | CameraController? controller; | 34 | CameraController? controller; |
28 | VideoPlayerController? videoController; | 35 | VideoPlayerController? videoController; |
... | @@ -255,7 +262,7 @@ class _PoemRecordVideoPageState extends State<PoemRecordVideoPage> | ... | @@ -255,7 +262,7 @@ class _PoemRecordVideoPageState extends State<PoemRecordVideoPage> |
255 | 262 | ||
256 | NavigatorUtils.push( | 263 | NavigatorUtils.push( |
257 | context, | 264 | context, |
258 | - '${PoemRouter.poemVideoPlayer}?url=$currentUnix.$fileFormat', | 265 | + '${PoemRouter.poemVideoPlayer}?url=$currentUnix.$fileFormat&id=${widget.id}&type=${widget.type}', |
259 | ); | 266 | ); |
260 | } catch (e) { | 267 | } catch (e) { |
261 | // print(e); | 268 | // print(e); | ... | ... |
... | @@ -11,11 +11,15 @@ import '../poem_router.dart'; | ... | @@ -11,11 +11,15 @@ import '../poem_router.dart'; |
11 | class PoemVideoPlayer extends StatefulWidget { | 11 | class PoemVideoPlayer extends StatefulWidget { |
12 | final String url; | 12 | final String url; |
13 | final String? title; | 13 | final String? title; |
14 | + final int id; | ||
15 | + final int type; | ||
14 | 16 | ||
15 | const PoemVideoPlayer({ | 17 | const PoemVideoPlayer({ |
16 | Key? key, | 18 | Key? key, |
17 | required this.url, | 19 | required this.url, |
18 | this.title, | 20 | this.title, |
21 | + required this.id, | ||
22 | + required this.type, | ||
19 | }) : super(key: key); | 23 | }) : super(key: key); |
20 | 24 | ||
21 | @override | 25 | @override |
... | @@ -118,18 +122,18 @@ class _PoemVideoPlayerState extends State<PoemVideoPlayer> { | ... | @@ -118,18 +122,18 @@ class _PoemVideoPlayerState extends State<PoemVideoPlayer> { |
118 | right: 20.px, | 122 | right: 20.px, |
119 | child: ElevatedButton( | 123 | child: ElevatedButton( |
120 | onPressed: () { | 124 | onPressed: () { |
121 | - NavigatorUtils.push( | 125 | + NavigatorUtils.push(context, |
122 | - context, '${PoemRouter.poemPublish}?data=' + widget.url, | 126 | + '${PoemRouter.poemPublish}?data=${widget.url}&id=${widget.id}&type=${widget.type}', |
123 | clearStack: true); | 127 | clearStack: true); |
124 | }, | 128 | }, |
125 | - child: Text( | ||
126 | - "下一步", | ||
127 | - style: TextStyle(fontSize: 15.px), | ||
128 | - ), | ||
129 | style: TextButton.styleFrom( | 129 | style: TextButton.styleFrom( |
130 | primary: Colors.white, | 130 | primary: Colors.white, |
131 | backgroundColor: Colors.black54, | 131 | backgroundColor: Colors.black54, |
132 | ), | 132 | ), |
133 | + child: Text( | ||
134 | + "下一步", | ||
135 | + style: TextStyle(fontSize: 15.px), | ||
136 | + ), | ||
133 | ), | 137 | ), |
134 | ), | 138 | ), |
135 | ], | 139 | ], | ... | ... |
... | @@ -62,9 +62,11 @@ class PoemRouter implements IRouterProvider { | ... | @@ -62,9 +62,11 @@ 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 | - return const PoemRecordVideoPage( | 65 | + String? type = params['type']?.first; |
66 | - // poemId: int.parse(id!), | 66 | + return PoemRecordVideoPage( |
67 | - ); | 67 | + id: int.parse(id!), |
68 | + type: int.parse(type!), | ||
69 | + ); | ||
68 | }, | 70 | }, |
69 | ), | 71 | ), |
70 | ); | 72 | ); |
... | @@ -74,8 +76,12 @@ class PoemRouter implements IRouterProvider { | ... | @@ -74,8 +76,12 @@ class PoemRouter implements IRouterProvider { |
74 | handler: Handler( | 76 | handler: Handler( |
75 | handlerFunc: (_, Map<String, List<String>> params) { | 77 | handlerFunc: (_, Map<String, List<String>> params) { |
76 | String? url = params['url']?.first; | 78 | String? url = params['url']?.first; |
79 | + String? id = params['id']?.first; | ||
80 | + String? type = params['type']?.first; | ||
77 | return PoemVideoPlayer( | 81 | return PoemVideoPlayer( |
78 | url: url!, | 82 | url: url!, |
83 | + id: int.parse(id!), | ||
84 | + type: int.parse(type!), | ||
79 | ); | 85 | ); |
80 | }, | 86 | }, |
81 | ), | 87 | ), |
... | @@ -85,8 +91,12 @@ class PoemRouter implements IRouterProvider { | ... | @@ -85,8 +91,12 @@ class PoemRouter implements IRouterProvider { |
85 | handler: Handler( | 91 | handler: Handler( |
86 | handlerFunc: (_, Map<String, List<String>> params) { | 92 | handlerFunc: (_, Map<String, List<String>> params) { |
87 | String? data = params['data']?.first; | 93 | String? data = params['data']?.first; |
94 | + String? id = params['id']?.first; | ||
95 | + String? type = params['type']?.first; | ||
88 | return PoemPublish( | 96 | return PoemPublish( |
89 | data: data!, | 97 | data: data!, |
98 | + id: int.parse(id!), | ||
99 | + type: int.parse(type!), | ||
90 | ); | 100 | ); |
91 | }, | 101 | }, |
92 | ), | 102 | ), | ... | ... |
... | @@ -11,23 +11,17 @@ class UserVideo { | ... | @@ -11,23 +11,17 @@ class UserVideo { |
11 | final String url; | 11 | final String url; |
12 | final String image; | 12 | final String image; |
13 | final String? desc; | 13 | final String? desc; |
14 | + final String poemId; | ||
15 | + final String poemType; | ||
14 | 16 | ||
15 | UserVideo({ | 17 | UserVideo({ |
16 | required this.url, | 18 | required this.url, |
17 | required this.image, | 19 | required this.image, |
18 | this.desc, | 20 | this.desc, |
21 | + required this.poemId, | ||
22 | + required this.poemType, | ||
19 | }); | 23 | }); |
20 | 24 | ||
21 | - static List<UserVideo> fetchVideo() { | ||
22 | - List<UserVideo> list = videoList | ||
23 | - .map((e) => UserVideo( | ||
24 | - image: '', | ||
25 | - url: 'assets/data/$e', | ||
26 | - desc: '清晨入古寺,初日照高林。\n竹径通幽处,禅房花木深。')) | ||
27 | - .toList(); | ||
28 | - return list; | ||
29 | - } | ||
30 | - | ||
31 | @override | 25 | @override |
32 | String toString() { | 26 | String toString() { |
33 | return 'image:$image' '\nvideo:$url'; | 27 | return 'image:$image' '\nvideo:$url'; | ... | ... |
1 | import 'dart:math'; | 1 | import 'dart:math'; |
2 | -import 'package:Parlando/account/account_router.dart'; | ||
3 | -import 'package:Parlando/events/trans_event.dart'; | ||
4 | -import 'package:Parlando/home/provider/home_provider.dart'; | ||
5 | -import 'package:Parlando/poem/poem_router.dart'; | ||
6 | -import 'package:Parlando/routers/fluro_navigator.dart'; | ||
7 | -import 'package:animated_radial_menu/animated_radial_menu.dart'; | ||
8 | import 'package:flutter/material.dart'; | 2 | import 'package:flutter/material.dart'; |
9 | import 'package:flutter/rendering.dart'; | 3 | import 'package:flutter/rendering.dart'; |
10 | import 'package:Parlando/tiktok/style/style.dart'; | 4 | import 'package:Parlando/tiktok/style/style.dart'; |
11 | -import 'package:provider/provider.dart'; | ||
12 | -import 'package:flutter_gen/gen_l10n/Parlando_localizations.dart'; | ||
13 | 5 | ||
14 | const double scrollSpeed = 300; | 6 | const double scrollSpeed = 300; |
15 | 7 | ||
... | @@ -65,7 +57,9 @@ class TikTokScaffold extends StatefulWidget { | ... | @@ -65,7 +57,9 @@ class TikTokScaffold extends StatefulWidget { |
65 | final bool? enableGesture; | 57 | final bool? enableGesture; |
66 | 58 | ||
67 | final Widget? page; | 59 | final Widget? page; |
68 | - | 60 | + final Widget? floatingActionButton; |
61 | + final Widget? bottomNavigationBar; | ||
62 | + final FloatingActionButtonLocation? floatingActionButtonLocation; | ||
69 | final Function()? onPullDownRefresh; | 63 | final Function()? onPullDownRefresh; |
70 | 64 | ||
71 | const TikTokScaffold({ | 65 | const TikTokScaffold({ |
... | @@ -80,6 +74,9 @@ class TikTokScaffold extends StatefulWidget { | ... | @@ -80,6 +74,9 @@ class TikTokScaffold extends StatefulWidget { |
80 | this.enableGesture, | 74 | this.enableGesture, |
81 | this.onPullDownRefresh, | 75 | this.onPullDownRefresh, |
82 | this.controller, | 76 | this.controller, |
77 | + this.floatingActionButton, | ||
78 | + this.bottomNavigationBar, | ||
79 | + this.floatingActionButtonLocation, | ||
83 | }) : super(key: key); | 80 | }) : super(key: key); |
84 | 81 | ||
85 | @override | 82 | @override |
... | @@ -193,82 +190,9 @@ class _TikTokScaffoldState extends State<TikTokScaffold> | ... | @@ -193,82 +190,9 @@ class _TikTokScaffoldState extends State<TikTokScaffold> |
193 | body: body, | 190 | body: body, |
194 | backgroundColor: Colors.black, | 191 | backgroundColor: Colors.black, |
195 | resizeToAvoidBottomInset: false, | 192 | resizeToAvoidBottomInset: false, |
196 | - floatingActionButton: SizedBox( | 193 | + floatingActionButton: widget.floatingActionButton, |
197 | - height: 60, | 194 | + bottomNavigationBar: widget.bottomNavigationBar, |
198 | - child: RadialMenu( | 195 | + floatingActionButtonLocation: widget.floatingActionButtonLocation, |
199 | - children: [ | ||
200 | - RadialButton( | ||
201 | - icon: const Icon(Icons.video_call_outlined), | ||
202 | - buttonColor: Colors.teal, | ||
203 | - onPress: () { | ||
204 | - eventBus.fire(TransEvent()); | ||
205 | - NavigatorUtils.push( | ||
206 | - context, | ||
207 | - '${PoemRouter.poemRecordVideoPage}?data=100', | ||
208 | - ); | ||
209 | - }), | ||
210 | - RadialButton( | ||
211 | - icon: const Icon(Icons.mic_none_outlined), | ||
212 | - buttonColor: Colors.green, | ||
213 | - onPress: () { | ||
214 | - eventBus.fire(TransEvent()); | ||
215 | - NavigatorUtils.push( | ||
216 | - context, | ||
217 | - '${PoemRouter.poemRecordAudioPage}?id=100', | ||
218 | - ); | ||
219 | - }), | ||
220 | - ], | ||
221 | - ), | ||
222 | - ), | ||
223 | - bottomNavigationBar: Consumer<HomeProvider>( | ||
224 | - builder: (_, provider, __) { | ||
225 | - return BottomAppBar( | ||
226 | - color: Colors.grey, | ||
227 | - child: Row( | ||
228 | - mainAxisSize: MainAxisSize.max, | ||
229 | - mainAxisAlignment: MainAxisAlignment.spaceAround, | ||
230 | - children: <Widget>[ | ||
231 | - InkWell( | ||
232 | - onTap: () {}, | ||
233 | - child: Container( | ||
234 | - alignment: Alignment.center, | ||
235 | - height: 36.0, | ||
236 | - child: Text( | ||
237 | - ParlandoLocalizations.of(context) | ||
238 | - .onePoemBottomNavigationBarItemTitle, | ||
239 | - style: const TextStyle( | ||
240 | - color: Colors.white54, | ||
241 | - fontSize: 15.0, | ||
242 | - ), | ||
243 | - ), | ||
244 | - ), | ||
245 | - ), | ||
246 | - InkWell( | ||
247 | - onTap: () { | ||
248 | - eventBus.fire(TransEvent()); | ||
249 | - NavigatorUtils.push( | ||
250 | - context, | ||
251 | - AccountRouter.accountPage, | ||
252 | - ); | ||
253 | - }, | ||
254 | - child: Container( | ||
255 | - alignment: Alignment.center, | ||
256 | - height: 36.0, | ||
257 | - child: Text( | ||
258 | - ParlandoLocalizations.of(context) | ||
259 | - .profileBottomNavigationBarItemTitle, | ||
260 | - style: const TextStyle( | ||
261 | - color: Colors.white54, | ||
262 | - fontSize: 15.0, | ||
263 | - ), | ||
264 | - ), | ||
265 | - ), | ||
266 | - ), | ||
267 | - ]), | ||
268 | - ); | ||
269 | - }, | ||
270 | - ), | ||
271 | - floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, | ||
272 | ), | 196 | ), |
273 | ); | 197 | ); |
274 | return body; | 198 | return body; | ... | ... |
-
Please register or login to post a comment