Yansen 1 년 전
부모
커밋
3ccffd20df

+ 6
- 1
lib/models/app.dart 파일 보기

@@ -49,11 +49,16 @@ class AppController extends GetxController {
49 49
       );
50 50
     });
51 51
 
52
+    var route = Get.routing;
53
+
52 54
     if (box.read('token') != null) {
53 55
       // 尝试获取一次人员信息
54 56
       getCurrent().then((person) {
55
-        user(Person.fromJson(person));
57
+        Person p = Person.fromJson(person);
58
+        user(p);
59
+        box.write("user", p);
56 60
       }).catchError((e) {
61
+        box.remove("token");
57 62
         print(e);
58 63
       });
59 64
     }

+ 29
- 21
lib/pages/agreement/index.dart 파일 보기

@@ -1,6 +1,7 @@
1 1
 import 'package:farmer_client/widgets/layout/BasicPage.dart';
2 2
 import 'package:flutter/material.dart';
3 3
 import 'package:flutter_screenutil/flutter_screenutil.dart';
4
+import 'package:get/get.dart';
4 5
 
5 6
 class Agreement extends BasicPage {
6 7
   @override
@@ -10,27 +11,34 @@ class Agreement extends BasicPage {
10 11
       height: 700.h,
11 12
       color: const Color(0xFFFFFFFF),
12 13
       padding: EdgeInsets.all(15.w),
13
-      child: Column(
14
-        children: [
15
-          Row(
16
-            mainAxisAlignment: MainAxisAlignment.center,
17
-            children: [
18
-              Image(
19
-                  image: const AssetImage('images/icons/decorate.png'),
20
-                  width: 16.5.w),
21
-              Text(
22
-                '用户协议',
23
-                style: TextStyle(
24
-                    fontSize: 20.sp,
25
-                    fontWeight: FontWeight.bold,
26
-                    color: const Color(0xFF222222)),
27
-              ),
28
-              Image(
29
-                  image: const AssetImage('images/icons/decorate.png'),
30
-                  width: 16.5.w),
31
-            ],
32
-          ),
33
-        ],
14
+      child: SingleChildScrollView(
15
+        child: Column(
16
+          children: [
17
+            Row(
18
+              mainAxisAlignment: MainAxisAlignment.center,
19
+              children: [
20
+                Image(
21
+                    image: const AssetImage('images/icons/decorate.png'),
22
+                    width: 16.5.w),
23
+                Text(
24
+                  '用户协议',
25
+                  style: TextStyle(
26
+                      fontSize: 20.sp,
27
+                      fontWeight: FontWeight.bold,
28
+                      color: const Color(0xFF222222)),
29
+                ),
30
+                Image(
31
+                    image: const AssetImage('images/icons/decorate.png'),
32
+                    width: 16.5.w),
33
+              ],
34
+            ),
35
+            Image.network(
36
+              'https://dz-machinery.oss-cn-nanjing.aliyuncs.com/images/privacy_policy.png',
37
+              width: Get.width,
38
+              fit: BoxFit.cover,
39
+            )
40
+          ],
41
+        ),
34 42
       ),
35 43
     );
36 44
   }

+ 2
- 1
lib/pages/home/index.dart 파일 보기

@@ -24,8 +24,9 @@ class Home extends BasicPage {
24 24
   Function? Refresh;
25 25
   List<CardListModel> GetList(value) {
26 26
     List<CardListModel> list = [];
27
-    if (value != null)
27
+    if (value != null) {
28 28
       value.forEach((item) => {list.add(CardListModel.fromJson(item))});
29
+    }
29 30
     return list;
30 31
   }
31 32
 

+ 5
- 3
lib/pages/login/login.dart 파일 보기

@@ -1,10 +1,10 @@
1 1
 import 'dart:async';
2 2
 import 'package:farmer_client/models/app.dart';
3
-import 'package:farmer_client/pages/home/index.dart';
4 3
 import 'package:fluttertoast/fluttertoast.dart';
5 4
 import 'package:flutter/material.dart';
6 5
 import 'package:flutter_screenutil/flutter_screenutil.dart';
7 6
 import 'package:get/get.dart';
7
+import 'package:get_storage/get_storage.dart';
8 8
 
9 9
 import '../../models/entities/person.dart';
10 10
 import '../../services/user.dart';
@@ -40,6 +40,7 @@ class _RouteLogin extends State<MyRouteLogin> {
40 40
   int count = 60; //初始倒计时时间
41 41
   var timer; //倒计时的计时器
42 42
   TextEditingController mController = TextEditingController();
43
+  GetStorage box = GetStorage();
43 44
 
44 45
   //获取验证码
45 46
   void _initTimer() {
@@ -114,12 +115,13 @@ class _RouteLogin extends State<MyRouteLogin> {
114 115
     } else {
115 116
       if (_newValue) {
116 117
         userLogin(handlePhones, handleCodes).then((value) {
118
+          box.write("token", value['token']);
119
+          box.write("tokenTimeout", value['tokenTimeout']);
117 120
           userInfo(Person.fromJson(value['person']));
118
-
119 121
           if (widget.isBack) {
120 122
             Get.back();
121 123
           } else {
122
-            Get.off(Home());
124
+            Get.offNamed("/home");
123 125
           }
124 126
         });
125 127
       } else {

+ 1
- 0
lib/pages/main/widgets/main/index.dart 파일 보기

@@ -25,6 +25,7 @@ class MainPage extends StatelessWidget {
25 25
         onCancel: () => true,
26 26
         onConfirm: () => {
27 27
               box.remove('token'),
28
+              box.remove('tokenTimeout'),
28 29
               Get.offAllNamed('/login'),
29 30
             });
30 31
   }

+ 25
- 50
lib/pages/splash/splash.dart 파일 보기

@@ -1,60 +1,35 @@
1
-import 'package:farmer_client/pages/splash/widgets/countdown.dart';
1
+import 'package:card_swiper/card_swiper.dart';
2 2
 import 'package:get/get.dart';
3
-import 'package:flutter_screenutil/flutter_screenutil.dart';
4 3
 import 'package:flutter/material.dart';
5 4
 import 'package:get_storage/get_storage.dart';
5
+import 'package:farmer_client/utils/tool.dart';
6 6
 
7
-class SplashScreen extends StatefulWidget {
7
+class SplashScreen extends StatelessWidget {
8 8
   const SplashScreen({Key? key}) : super(key: key);
9 9
 
10
-  @override
11
-  State<SplashScreen> createState() => _SplashScreen();
12
-}
13
-
14
-class _SplashScreen extends State<SplashScreen> {
15
-  GetStorage box = GetStorage();
16
-  handleOnFinish() {
17
-    bool isLogin = box.hasData('token');
18
-    if (isLogin) {
19
-      Get.offNamed('/');
20
-    } else {
21
-      Get.offNamed('/login');
22
-    }
23
-  }
24
-
25 10
   @override
26 11
   Widget build(BuildContext context) {
27
-    return Scaffold(
28
-        body: Container(
29
-      decoration: const BoxDecoration(
30
-        image: DecorationImage(
31
-            image: AssetImage("images/splash.png"),
32
-            fit: BoxFit.cover,
33
-            alignment: Alignment.topCenter),
34
-      ),
35
-      child: Stack(
36
-        children: [
37
-          Positioned(
38
-            right: 15.w,
39
-            top: 50.h,
40
-            child: countdown(3, handleOnFinish),
41
-          ),
42
-          Positioned(
43
-            bottom: 0,
44
-            child: Container(
45
-              width: 375.w,
46
-              height: 60.w,
47
-              child: Center(
48
-                child: Image.asset(
49
-                  'images/logo.png',
50
-                  width: 218.w,
51
-                  height: 50.w,
52
-                ),
53
-              ),
54
-            ),
55
-          ),
56
-        ],
57
-      ),
58
-    ));
12
+    GetStorage box = GetStorage();
13
+    var pg = isLogin() ? '/home' : '/login';
14
+    box.write("not-first-load", true);
15
+
16
+    return Scaffold (
17
+        body: Swiper (
18
+          itemBuilder: (BuildContext context,int index){
19
+            var adImg = "https://dz-machinery.oss-cn-nanjing.aliyuncs.com/images/nonghu_launch_image_" + (index + 1).toString() + ".png";
20
+            return Image.network(adImg,fit: BoxFit.fill,);
21
+          },
22
+          loop: false,
23
+          itemCount: 3,
24
+          pagination: const SwiperPagination(),
25
+          // control: SwiperControl(),
26
+          onTap: (index) {
27
+            if (index == 2) {
28
+              Get.offNamed(pg);
29
+            }
30
+            // foo
31
+          },
32
+        )
33
+    );
59 34
   }
60 35
 }

+ 36
- 0
lib/pages/welcome/index.dart 파일 보기

@@ -0,0 +1,36 @@
1
+
2
+import 'package:card_swiper/card_swiper.dart';
3
+import 'package:flutter/material.dart';
4
+import 'package:get/get.dart';
5
+import 'package:get_storage/get_storage.dart';
6
+
7
+class WelcomePage extends StatelessWidget {
8
+  @override
9
+  Widget build(BuildContext context) {
10
+    GetStorage box = GetStorage();
11
+    var isLogin = box.hasData('token');
12
+    var pg = isLogin ? '/home' : '/login';
13
+
14
+    // box.write("not-first-load", true);
15
+
16
+    return Scaffold (
17
+        body: new Swiper (
18
+          itemBuilder: (BuildContext context,int index){
19
+            var adImg = "https://dz-machinery.oss-cn-nanjing.aliyuncs.com/images/nonghu_launch_image_" + (index + 1).toString() + ".png";
20
+            return Image.network(adImg,fit: BoxFit.fill,);
21
+          },
22
+          loop: false,
23
+          itemCount: 3,
24
+          pagination: SwiperPagination(),
25
+          // control: SwiperControl(),
26
+          onTap: (index) {
27
+            if (index == 2) {
28
+              Get.offNamed(pg);
29
+            }
30
+            // foo
31
+          },
32
+        )
33
+    );
34
+  }
35
+  
36
+}

+ 25
- 3
lib/routes/middleWares.dart 파일 보기

@@ -1,16 +1,38 @@
1 1
 import 'package:flutter/scheduler.dart';
2 2
 import 'package:get/get.dart';
3 3
 import 'package:get_storage/get_storage.dart';
4
+import 'package:farmer_client/utils/tool.dart';
5
+
6
+var whiteList = [
7
+  '/',
8
+  '/splash',
9
+  '/login',
10
+  '/agreement',
11
+];
4 12
 
5 13
 void routingCallback(routing) {
6
-  // GetStorage box = GetStorage();
14
+  print("---------routingCallback---------");
15
+  print(routing?.current);
16
+  print(whiteList.contains(routing?.current));
17
+
18
+  if (!isLogin()) {
19
+    if (!whiteList.contains(routing?.current)) {
20
+      print('----will be to login page----->');
21
+
22
+      // addPostFrameCallback 作用是等当前帧绘制完成之后再加载
23
+      // https://github.com/jonataslaw/getx/issues/262
24
+      SchedulerBinding.instance?.addPostFrameCallback((_) => Get.offNamed('/login'));
25
+    }
26
+  }
27
+
28
+
7 29
   // bool isLogin = box.hasData('token');
8 30
   // bool isSplashScreen = routing?.current == '/splash';
9 31
   // bool isLoginPage = routing?.current == '/login';
10 32
   // bool isAgreementPage = routing?.current == '/agreement';
11 33
   // if (!isLogin && !isSplashScreen && !isLoginPage&&!isAgreementPage) {
12
-  //   // addPostFrameCallback 作用是等当前帧绘制完成之后再加载
13
-  //   // https://github.com/jonataslaw/getx/issues/262
34
+    // addPostFrameCallback 作用是等当前帧绘制完成之后再加载
35
+    // https://github.com/jonataslaw/getx/issues/262
14 36
   //   SchedulerBinding.instance?.addPostFrameCallback((_) => Get.offNamed('/login'));
15 37
   // }
16 38
 }

+ 10
- 2
lib/routes/pages.dart 파일 보기

@@ -1,5 +1,6 @@
1 1
 import 'package:get/get.dart';
2 2
 import 'package:get_storage/get_storage.dart';
3
+import 'package:farmer_client/utils/tool.dart';
3 4
 import '../pages/index.dart';
4 5
 
5 6
 List<GetPage> pages = [
@@ -7,13 +8,19 @@ List<GetPage> pages = [
7 8
       name: '/',
8 9
       page: () {
9 10
         GetStorage box = GetStorage();
10
-        return box.hasData('token') ? Home() : MyRouteLogin();
11
+        var isFirstLoad = !box.hasData("not-first-load");
12
+
13
+        print("------isFirstLoad------");
14
+        print(isFirstLoad);
15
+
16
+        return  isFirstLoad ? const SplashScreen() : ( isLogin() ? Home() : MyRouteLogin() );
11 17
       }),
18
+  GetPage(name: '/home', page: () => Home()),
12 19
   GetPage(name: '/main', page: () => Main()),
13 20
   GetPage(name: '/order', page: () => OrderPage()),
14 21
   GetPage(name: '/infomation', page: () => Infomation()),
15 22
   GetPage(name: '/ArticleInfo', page: () => ArticleInfo()), //资讯详情
16
-  // GetPage(name: '/splash', page: () => SplashScreen()), // SplashScreen
23
+  GetPage(name: '/splash', page: () => SplashScreen()), // SplashScreen
17 24
   GetPage(name: '/login', page: () => MyRouteLogin()),
18 25
   GetPage(name: '/addressList', page: () => AddressList()),
19 26
   GetPage(name: '/addAddress', page: () => AddAddress()),
@@ -26,4 +33,5 @@ List<GetPage> pages = [
26 33
   GetPage(name: '/orderConfirmation', page: () => OrderConfirmation()),
27 34
   GetPage(name: '/orderPageInfo', page: () => OrderPageInfo()),
28 35
   GetPage(name: '/searchPage', page: () => SearchPage()),
36
+  // GetPage(name: '/welcome', page: () => WelcomePage()),
29 37
 ];

+ 17
- 0
lib/utils/tool.dart 파일 보기

@@ -0,0 +1,17 @@
1
+
2
+import 'package:get_storage/get_storage.dart';
3
+
4
+bool isLogin() {
5
+  GetStorage box = GetStorage();
6
+
7
+  print('----tokenTimeout----->');
8
+  print(box.read("tokenTimeout"));
9
+
10
+  if (!box.hasData("tokenTimeout")) {
11
+    return false;
12
+  }
13
+
14
+  DateTime expireTime = DateTime.parse(box.read("tokenTimeout"));
15
+  DateTime lastDate = DateTime.now().subtract(const Duration(minutes: 5));
16
+  return expireTime.isAfter(lastDate);
17
+}

+ 4
- 4
lib/widgets/CarsCard.dart 파일 보기

@@ -34,7 +34,7 @@ class _CarsCardPage extends State<CarsCard> {
34 34
 
35 35
   @override
36 36
   Widget build(BuildContext context) {
37
-    print(widget.item);
37
+    // print(widget.item);
38 38
 
39 39
     return Container(
40 40
       margin: EdgeInsets.fromLTRB(0, 20, 0, 20),
@@ -53,7 +53,7 @@ class _CarsCardPage extends State<CarsCard> {
53 53
               });
54 54
             },
55 55
             child: Image.network(
56
-              widget.item.thumb.toString(),
56
+              widget.item.thumb ?? 'https://dz-machinery.oss-cn-nanjing.aliyuncs.com/images/no_image.png',
57 57
               width: 345.w,
58 58
               height: 230.h,
59 59
               fit: BoxFit.cover,
@@ -69,7 +69,7 @@ class _CarsCardPage extends State<CarsCard> {
69 69
                 Container(
70 70
                   width: 210.w,
71 71
                   child: Text(
72
-                    widget.item.name.toString(),
72
+                    widget.item.name ?? '',
73 73
                     softWrap: true,
74 74
                     textAlign: TextAlign.left,
75 75
                     overflow: TextOverflow.ellipsis,
@@ -95,7 +95,7 @@ class _CarsCardPage extends State<CarsCard> {
95 95
                     child: RichText(
96 96
                       text: TextSpan(children: <InlineSpan>[
97 97
                         TextSpan(
98
-                            text: (widget.item.price! / 100).toString(),
98
+                            text: ((widget.item.price ?? 0) / 100).toString(),
99 99
                             style: TextStyle(
100 100
                               fontSize: 22,
101 101
                               fontWeight: FontWeight.bold,

+ 1
- 1
lib/widgets/layout/barList.dart 파일 보기

@@ -6,7 +6,7 @@ import 'bottomBar/item.dart';
6 6
 final BarList = <BarItem>[
7 7
   BarItem(
8 8
     label: '首页',
9
-    page: '/',
9
+    page: '/home',
10 10
     normal: Item(
11 11
         color: const Color(0xFF323232),
12 12
         fontSize: 15.sp,

+ 7
- 0
pubspec.lock 파일 보기

@@ -71,6 +71,13 @@ packages:
71 71
       url: "https://pub.flutter-io.cn"
72 72
     source: hosted
73 73
     version: "1.0.0"
74
+  card_swiper:
75
+    dependency: "direct main"
76
+    description:
77
+      name: card_swiper
78
+      url: "https://pub.flutter-io.cn"
79
+    source: hosted
80
+    version: "3.0.1"
74 81
   carousel_slider:
75 82
     dependency: "direct main"
76 83
     description:

+ 1
- 0
pubspec.yaml 파일 보기

@@ -54,6 +54,7 @@ dependencies:
54 54
   flutter_easyrefresh: ^2.2.1 #下拉刷新上拉加载
55 55
   fluwx: ^3.9.0 #微信支付
56 56
   tobias: ^2.4.0 #支付宝支付
57
+  card_swiper: ^3.0.1
57 58
 
58 59
 #  flutter_bmflocation: ^3.1.0+1
59 60