welcome.dart 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'dart:math';
  4. import 'package:audioplayers/audioplayers.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:js/js.dart';
  7. import 'package:js/js_util.dart';
  8. import 'package:link/view/component/link_btn.dart';
  9. import 'package:link/view/component/top_container.dart';
  10. import 'package:get/get.dart';
  11. import '../constants.dart';
  12. import '../utils/api.dart';
  13. import '../utils/global.dart';
  14. import '../utils/http_utils.dart';
  15. import '../utils/size_fit.dart';
  16. import '../utils/storage.dart';
  17. import '../utils/util.dart';
  18. import 'dart:js' as js;
  19. import 'dart:html';
  20. import 'package:share_plus_web/share_plus_web.dart';
  21. class WelcomePage extends StatefulWidget {
  22. const WelcomePage({Key? key}) : super(key: key);
  23. @override
  24. State<WelcomePage> createState() => _WelcomePageState();
  25. }
  26. class _WelcomePageState extends State<WelcomePage>
  27. with SingleTickerProviderStateMixin {
  28. late AnimationController controller;
  29. late Animation animation;
  30. AudioPlayer audioPlayer = AudioPlayer();
  31. bool isPause = true;
  32. Timer? timer;
  33. var user;
  34. @override
  35. void initState() {
  36. controller = AnimationController(
  37. vsync: this, duration: const Duration(milliseconds: 2400));
  38. animation = Tween(begin: 0.0, end: 2 * pi).animate(controller);
  39. controller.addListener(() {
  40. setState(() {});
  41. });
  42. recommends();
  43. checkToken();
  44. // controller.repeat();
  45. // playMusic();
  46. super.initState();
  47. }
  48. // Future checkToken() async {
  49. // var json = StorageUtil().getJSON('tempLink');
  50. // if (json != null) {
  51. // Get.toNamed('/add_link',
  52. // parameters: {'social': jsonEncode(json['social']), 'add_more': '1'});
  53. // }
  54. // }
  55. Future checkToken() async {
  56. if (Global().token.isNotEmpty) {
  57. var data =
  58. await HttpUtils.get(Api.token, params: {'token': Global().token});
  59. if (data['success'] == false) {
  60. // Get.toNamed('/login');
  61. return;
  62. }
  63. }
  64. var jsonUserStep0 = StorageUtil().getJSON('tempUser0');
  65. if (jsonUserStep0 != null) {
  66. Get.toNamed('/edit_nick_info');
  67. return;
  68. }
  69. var jsonUserStep1 = StorageUtil().getJSON('tempUser1');
  70. if (jsonUserStep1 != null) {
  71. Get.toNamed('/edit_base_info');
  72. return;
  73. }
  74. var jsonLink0 = StorageUtil().getJSON('tempGuideLink0');
  75. if (jsonLink0 != null) {
  76. Get.toNamed('/begin_add_first_link');
  77. return;
  78. }
  79. var jsonLink1 = StorageUtil().getJSON('tempGuideLink1');
  80. if (jsonLink1 != null) {
  81. Get.toNamed('/add_link',
  82. parameters: {'social': jsonEncode(jsonLink1['social'])});
  83. return;
  84. }
  85. var json = StorageUtil().getJSON('tempLink');
  86. if (json != null) {
  87. Get.toNamed('/add_link',
  88. parameters: {'social': jsonEncode(json['social']), 'add_more': '1'});
  89. return;
  90. }
  91. if (Global().token.isNotEmpty) {
  92. Get.offAllNamed('/');
  93. }
  94. }
  95. @override
  96. void dispose() {
  97. controller.dispose();
  98. timer!.cancel();
  99. super.dispose();
  100. }
  101. Future recommends() async {
  102. var data = await HttpUtils.get(Api.recommend);
  103. if (data is List) {
  104. setState(() {
  105. user = data[0];
  106. });
  107. int i = 0;
  108. timer = Timer.periodic(const Duration(seconds: 3), (e) {
  109. i++;
  110. if (i >= data.length) {
  111. i = 0;
  112. }
  113. setState(() {
  114. user = data[i];
  115. });
  116. });
  117. }
  118. print(data.toString());
  119. }
  120. playMusic() async {
  121. await audioPlayer.play(
  122. UrlSource('https://api.fast.dev.liveplus.fun/static/music/test.mp3'));
  123. }
  124. pauseMusic() async {
  125. await audioPlayer.pause();
  126. }
  127. tapPlayBtn() {
  128. setState(() {
  129. isPause = !isPause;
  130. if (isPause) {
  131. controller.stop();
  132. pauseMusic();
  133. } else {
  134. controller.repeat();
  135. playMusic();
  136. }
  137. });
  138. }
  139. shareContent() {
  140. js.context.callMethod('shareSys', ['']);
  141. }
  142. topBg() {
  143. return Positioned(
  144. left: 0,
  145. top: 0,
  146. right: 0,
  147. child: Image.asset(
  148. 'assets/images/welcome_top.png',
  149. width: 375.px,
  150. height: 200.px,
  151. ));
  152. }
  153. content() {
  154. return Column(
  155. crossAxisAlignment: CrossAxisAlignment.center,
  156. children: [
  157. SizedBox(
  158. height: 80.px,
  159. ),
  160. Image.asset(
  161. 'assets/images/logo.png',
  162. width: 280.px,
  163. height: 108.px,
  164. ),
  165. Container(
  166. alignment: Alignment.topLeft,
  167. margin: EdgeInsets.only(
  168. top: 30.px, bottom: 30.px, left: 23.px, right: 23.px),
  169. height: 128.px,
  170. child: Stack(
  171. children: [
  172. Positioned(
  173. top: 22.px,
  174. child: Container(
  175. width: 84.px,
  176. height: 84.px,
  177. decoration: BoxDecoration(
  178. borderRadius: BorderRadius.circular(42.px),
  179. image: (user == null || user['avatar'] == null)
  180. ? null
  181. : DecorationImage(
  182. image: NetworkImage(user['avatar']),
  183. fit: BoxFit.cover)
  184. // color: Colors.pink,
  185. ),
  186. ),
  187. ),
  188. Positioned(
  189. right: 0,
  190. child: Container(
  191. width: 270.px,
  192. height: 128.px,
  193. padding: EdgeInsets.only(left: 60.px, top: 24.px),
  194. alignment: Alignment.topLeft,
  195. decoration: const BoxDecoration(
  196. image: DecorationImage(
  197. image: AssetImage(
  198. 'assets/images/welcome_social_bg.png'),
  199. fit: BoxFit.fill)),
  200. child: user == null
  201. ? Container()
  202. : Column(
  203. mainAxisAlignment: MainAxisAlignment.start,
  204. crossAxisAlignment: CrossAxisAlignment.start,
  205. children: [
  206. Text.rich(TextSpan(children: [
  207. TextSpan(
  208. text: '我是',
  209. style: TextStyle(
  210. color: Colors.white,
  211. fontSize: 20.px,
  212. fontWeight: FontWeight.bold)),
  213. TextSpan(
  214. text: user['nickname'],
  215. style: TextStyle(
  216. color: kThemeColor,
  217. fontSize: 20.px,
  218. fontWeight: FontWeight.bold))
  219. ])),
  220. SizedBox(
  221. height: 4.px,
  222. ),
  223. Text(
  224. '来自${user['country']}·${user['city']},快来看看我的主页',
  225. style: TextStyle(
  226. color: Colors.white, fontSize: 12.px),
  227. ),
  228. SizedBox(
  229. height: 8.px,
  230. ),
  231. Row(
  232. children: [
  233. if (user != null && user['socials'] != null)
  234. ...List<Widget>.generate(
  235. user['socials'].length, (index) {
  236. return Container(
  237. width: 24.px,
  238. height: 24.px,
  239. decoration: BoxDecoration(
  240. borderRadius:
  241. BorderRadius.circular(6.px),
  242. image: user['socials'][index]
  243. ['logo'] !=
  244. null
  245. ? DecorationImage(
  246. fit: BoxFit.cover,
  247. image: NetworkImage(
  248. user['socials'][index]
  249. ['logo']),
  250. )
  251. : const DecorationImage(
  252. image: AssetImage(
  253. 'assets/images/1.png'),
  254. fit: BoxFit.cover)),
  255. margin: EdgeInsets.only(right: 12.px),
  256. );
  257. }),
  258. // Image.asset(
  259. // 'assets/images/tiktok.png',
  260. // width: 24.px,
  261. // height: 24.px,
  262. // ),
  263. // SizedBox(
  264. // width: 12.px,
  265. // ),
  266. // Image.asset(
  267. // 'assets/images/tiktok.png',
  268. // width: 24.px,
  269. // height: 24.px,
  270. // ),
  271. // SizedBox(
  272. // width: 12.px,
  273. // ),
  274. // Image.asset(
  275. // 'assets/images/tiktok.png',
  276. // width: 24.px,
  277. // height: 24.px,
  278. // ),
  279. // SizedBox(
  280. // width: 12.px,
  281. // ),
  282. // Image.asset(
  283. // 'assets/images/tiktok.png',
  284. // width: 24.px,
  285. // height: 24.px,
  286. // ),
  287. // SizedBox(
  288. // width: 12.px,
  289. // ),
  290. ],
  291. )
  292. ],
  293. ),
  294. ))
  295. ],
  296. ),
  297. ),
  298. LinkButton(
  299. title: '注册',
  300. disable: false,
  301. isBlack: false,
  302. callback: () {
  303. Get.toNamed('/invite_code');
  304. }),
  305. SizedBox(
  306. height: 36.px,
  307. ),
  308. LinkButton(
  309. title: '登录',
  310. disable: false,
  311. isBlack: true,
  312. callback: () {
  313. Get.toNamed('/login');
  314. }),
  315. SizedBox(height: 50.px),
  316. // Expanded(child: Container()),
  317. Text(
  318. '2022 © LINKBaeBae 链接吧,宝贝!',
  319. style: TextStyle(color: const Color(0xFF444447), fontSize: 10.px),
  320. ),
  321. SizedBox(
  322. height: 44.px,
  323. )
  324. ],
  325. );
  326. }
  327. playContent() {
  328. return Positioned(
  329. right: 20.px,
  330. top: 20.px,
  331. child: GestureDetector(
  332. onTap: () {
  333. tapPlayBtn();
  334. },
  335. child: Stack(children: [
  336. Transform.rotate(
  337. angle: animation.value,
  338. child: Image.asset(
  339. 'assets/images/music.png',
  340. width: 28.px,
  341. height: 28.px,
  342. )),
  343. Opacity(
  344. opacity: isPause ? 1 : 0,
  345. child: Image.asset(
  346. 'assets/images/music_pause.png',
  347. width: 28.px,
  348. height: 28.px,
  349. ),
  350. )
  351. ]),
  352. ));
  353. }
  354. copyright() {
  355. return Positioned(
  356. left: 0,
  357. right: 0,
  358. bottom: 44.px,
  359. child: Text(
  360. '2022 © LINKBaeBae 链接吧,宝贝!',
  361. textAlign: TextAlign.center,
  362. style: TextStyle(color: const Color(0x80000000), fontSize: 10.px),
  363. ));
  364. }
  365. @override
  366. Widget build(BuildContext context) {
  367. Util().setPageTitle('welcome');
  368. SizeFit.initialize(context);
  369. return Material(
  370. color: kBgColor,
  371. child: TopContainer(
  372. child: SizedBox(
  373. height: MediaQuery.of(context).size.height,
  374. width: 375.px,
  375. child: SingleChildScrollView(
  376. child: Stack(
  377. children: [topBg(), content(), playContent()],
  378. )),
  379. ),
  380. // Stack(
  381. // children: [topBg(), content(), playContent(), copyright()],
  382. // )
  383. ),
  384. );
  385. }
  386. }