[baozhangchao] 3 年之前
父節點
當前提交
6f0a5b4ffe

+ 2
- 0
android/app/src/profile/AndroidManifest.xml 查看文件

@@ -4,4 +4,6 @@
4 4
          to allow setting breakpoints, to provide hot reload, etc.
5 5
     -->
6 6
     <uses-permission android:name="android.permission.INTERNET"/>
7
+    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
8
+    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
7 9
 </manifest>

+ 12
- 3
lib/main.dart 查看文件

@@ -1,21 +1,24 @@
1
-import 'dart:async';
2 1
 
2
+<<<<<<< HEAD
3 3
 import 'package:farmer_client/models/Store.dart';
4 4
 import 'package:farmer_client/pages/home.dart';
5 5
 import 'package:farmer_client/pages/login/login.dart';
6 6
 import 'package:farmer_client/widgets/CarsCard.dart';
7 7
 import 'package:farmer_client/widgets/OrderInfoCard.dart';
8
+=======
9
+>>>>>>> aab895cc95471d4dfd7cb90d05a35ccceb52c4e0
8 10
 import 'package:flutter/material.dart';
9 11
 import 'package:get/get.dart';
10 12
 import 'package:get_storage/get_storage.dart';
11 13
 import 'package:flutter_screenutil/flutter_screenutil.dart';
12 14
 
15
+import 'models/index.dart';
16
+import 'routes/index.dart';
13 17
 import 'widgets/OrderListCard.dart';
14 18
 
15 19
 
16 20
 void main() async {
17 21
   await GetStorage.init();
18
-  Store().init();
19 22
 
20 23
   runApp(MyApp());
21 24
 }
@@ -34,12 +37,18 @@ class MyApp extends StatelessWidget {
34 37
       splitScreenMode: true,
35 38
       builder: (_) {
36 39
         return GetMaterialApp(
37
-          initialRoute: '/home',
40
+          initialRoute: '/splash',
38 41
           defaultTransition: Transition.native,
42
+<<<<<<< HEAD
39 43
           getPages: [
40 44
             // GetPage(name: '/home', page: () => OrderPage() ),
41 45
             GetPage(name: '/home', page: () => box.hasData('token') ? Home() : MyRouteLogin()),
42 46
           ],
47
+=======
48
+          routingCallback: routingCallback,
49
+          initialBinding: AppBindings(),
50
+          getPages: pages,
51
+>>>>>>> aab895cc95471d4dfd7cb90d05a35ccceb52c4e0
43 52
         );
44 53
       },
45 54
     );

+ 0
- 11
lib/models/Store.dart 查看文件

@@ -1,11 +0,0 @@
1
-
2
-import 'package:farmer_client/models/User.dart';
3
-import 'package:get/get.dart';
4
-
5
-class Store {
6
-  Store();
7
-
8
-  init() {
9
-    Get.put(User(), tag: 'user');
10
-  }
11
-}

+ 0
- 15
lib/models/User.dart 查看文件

@@ -1,15 +0,0 @@
1
-
2
-import 'package:farmer_client/models/entities/person.dart';
3
-import 'package:get/get.dart';
4
-
5
-class User extends GetxController {
6
-  Person? _person;
7
-  Person? get person => _person;
8
-  set person (Person? p) {
9
-    _person = p;
10
-    update();
11
-  }
12
-
13
-  bool get isLogin => _person != null;
14
-
15
-}

+ 47
- 0
lib/models/app.dart 查看文件

@@ -0,0 +1,47 @@
1
+
2
+import 'dart:io';
3
+
4
+import 'package:farmer_client/models/entities/person.dart';
5
+import 'package:get/get.dart';
6
+import 'package:location/location.dart';
7
+import '../services/user.dart';
8
+import '../utils/location.dart';
9
+
10
+class AppController extends GetxController {
11
+  // 有了这句, 可以直接 AppController.t 调用
12
+  static AppController t = Get.find();
13
+
14
+  final user = Person().obs;
15
+  final location = Rxn<LocationData>();
16
+  final testInt = 1.obs;
17
+
18
+  @override
19
+  void onInit() {
20
+    super.onInit();
21
+
22
+    // 尝试获取 location
23
+    requireLocation().then((loc) async {
24
+      var _data = await loc.getLocation();
25
+      location(_data);
26
+
27
+      // 监听位置变化
28
+      loc.onLocationChanged.listen((LocationData currentLocation) {
29
+        location(currentLocation);
30
+      });
31
+    }).catchError((e) {
32
+      print(e);
33
+      Get.defaultDialog(
34
+        title: e.message,
35
+        onConfirm: () => exit(1),
36
+      );
37
+    });
38
+
39
+    // 尝试获取一次人员信息
40
+    getCurrent().then((person) {
41
+      user(person);
42
+    }).catchError((e) {
43
+      print(e);
44
+    });
45
+  }
46
+
47
+}

+ 13
- 0
lib/models/index.dart 查看文件

@@ -0,0 +1,13 @@
1
+
2
+export 'app.dart';
3
+
4
+import 'package:farmer_client/models/app.dart';
5
+import 'package:get/get.dart';
6
+
7
+class AppBindings implements Bindings {
8
+  @override
9
+  void dependencies() {
10
+    Get.put(AppController());
11
+  }
12
+}
13
+

+ 0
- 12
lib/pages/home.dart 查看文件

@@ -1,12 +0,0 @@
1
-
2
-import 'package:farmer_client/models/User.dart';
3
-import 'package:flutter/widgets.dart';
4
-import 'package:get/get.dart';
5
-
6
-class Home extends GetView<User> {
7
-  @override
8
-  Widget build(BuildContext context) {
9
-    return Text("首页示例");
10
-  }
11
-
12
-}

+ 11
- 0
lib/pages/home/index.dart 查看文件

@@ -0,0 +1,11 @@
1
+
2
+import 'package:flutter/material.dart';
3
+
4
+class Home extends StatelessWidget {
5
+  @override
6
+  Widget build(BuildContext context) {
7
+    // controller.person
8
+    return const Scaffold(body: Text("首页"),);
9
+  }
10
+
11
+}

+ 4
- 0
lib/pages/index.dart 查看文件

@@ -0,0 +1,4 @@
1
+
2
+export 'home/index.dart';
3
+export 'splash/splash.dart';
4
+export 'login/login.dart';

+ 0
- 22
lib/pages/launch.dart 查看文件

@@ -1,22 +0,0 @@
1
-
2
-
3
-import 'package:flutter/widgets.dart';
4
-
5
-class Launch extends StatefulWidget {
6
-  @override
7
-  State<StatefulWidget> createState() => LaunchState();
8
-}
9
-
10
-class LaunchState extends State<Launch> {
11
-
12
-  // 默认 3s
13
-  int _countdown = 3;
14
-
15
-  @override
16
-  Widget build(BuildContext context) {
17
-    // TODO: implement build
18
-    throw UnimplementedError();
19
-  }
20
-
21
-}
22
-

+ 27
- 0
lib/pages/login/login.dart 查看文件

@@ -1,13 +1,36 @@
1 1
 import 'dart:async';
2 2
 import 'dart:ffi';
3
+import 'package:farmer_client/models/app.dart';
3 4
 import 'package:fluttertoast/fluttertoast.dart';
4 5
 import 'package:flutter/gestures.dart';
5 6
 import 'package:flutter/material.dart';
6 7
 import 'package:flutter_screenutil/flutter_screenutil.dart';
8
+import 'package:get/get.dart';
7 9
 
8 10
 import '../../services/user.dart';
9 11
 import '../../widgets/Cell.dart';
10 12
 
13
+// class Login extends GetView<User> {
14
+//
15
+//   int _countdown = 60;
16
+//
17
+//   @override
18
+//   Widget build(BuildContext context) {
19
+//     // controller.person
20
+//     return StatefulBuilder(builder: (context, setState) {
21
+//
22
+//       setState(() {
23
+//         _countdown -= 1;
24
+//       });
25
+//
26
+//       return Text("data");
27
+//     });
28
+//   }
29
+//
30
+//
31
+//
32
+// }
33
+
11 34
 class MyRouteLogin extends StatefulWidget {
12 35
   @override
13 36
   State<MyRouteLogin> createState() => _RouteLogin();
@@ -18,6 +41,10 @@ class _RouteLogin extends State<MyRouteLogin> {
18 41
   void initState() {
19 42
     super.initState();
20 43
     //注册协议的手势
44
+
45
+    var location = AppController.t.testInt.value;
46
+    print('--------------');
47
+    print(location);
21 48
   }
22 49
 
23 50
   bool isButtonEnable = true; //按钮状态  是否可点击

+ 17
- 0
lib/pages/splash/splash.dart 查看文件

@@ -0,0 +1,17 @@
1
+
2
+import 'package:farmer_client/pages/splash/widgets/countdown.dart';
3
+import 'package:flutter/widgets.dart';
4
+import 'package:get/get.dart';
5
+
6
+import '../home/index.dart';
7
+
8
+class SplashScreen extends StatelessWidget {
9
+  handleOnFinish () {
10
+    Get.off(Home(), routeName: '/');
11
+  }
12
+
13
+  @override
14
+  Widget build(BuildContext context) {
15
+    return countdown(3, handleOnFinish);
16
+  }
17
+}

+ 45
- 0
lib/pages/splash/widgets/countdown.dart 查看文件

@@ -0,0 +1,45 @@
1
+
2
+import 'dart:async';
3
+
4
+import 'package:farmer_client/utils/timer.dart';
5
+import 'package:flutter/widgets.dart';
6
+import 'package:get/get.dart';
7
+
8
+// Widget countdown(void Function() onFinish) {
9
+//   int _countdown = 3;
10
+//   late StateSetter _update;
11
+//   late Timer _timer;
12
+//   _timer = setInterval((_) {
13
+//     if (_countdown <= 1) {
14
+//       _timer.cancel();
15
+//       onFinish();
16
+//       return;
17
+//     }
18
+//
19
+//     _update((){
20
+//       _countdown -= 1;
21
+//     });
22
+//   }, 1000);
23
+//
24
+//   return StatefulBuilder(builder: (context, setState) {
25
+//     _update = setState;
26
+//     return Text(_countdown.toString());
27
+//   });
28
+// }
29
+
30
+Widget countdown(int sec, void Function() onFinish) {
31
+  var _countdown = Rx<int>(sec);
32
+
33
+  late Timer _timer;
34
+  _timer = setInterval((_) {
35
+    if (_countdown.value <= 1) {
36
+      _timer.cancel();
37
+      onFinish();
38
+      return;
39
+    }
40
+
41
+    _countdown.value -= 1;
42
+  }, 1000);
43
+
44
+  return Obx(() =>Text(_countdown.value.toString()));
45
+}

+ 3
- 0
lib/routes/index.dart 查看文件

@@ -0,0 +1,3 @@
1
+
2
+export 'pages.dart';
3
+export 'middleWares.dart';

+ 16
- 0
lib/routes/middleWares.dart 查看文件

@@ -0,0 +1,16 @@
1
+
2
+import 'package:flutter/scheduler.dart';
3
+import 'package:get/get.dart';
4
+import 'package:get_storage/get_storage.dart';
5
+
6
+void routingCallback (routing) {
7
+  GetStorage box = GetStorage();
8
+  bool isLogin = box.hasData('token');
9
+  bool isSplashScreen = routing?.current == '/splash';
10
+  bool isLoginPage = routing?.current == '/login';
11
+  if (!isLogin && !isSplashScreen && !isLoginPage) {
12
+    // addPostFrameCallback 作用是等当前帧绘制完成之后再加载
13
+    // https://github.com/jonataslaw/getx/issues/262
14
+    SchedulerBinding.instance?.addPostFrameCallback((_) => Get.toNamed('/login'));
15
+  }
16
+}

+ 9
- 0
lib/routes/pages.dart 查看文件

@@ -0,0 +1,9 @@
1
+
2
+import 'package:get/get.dart';
3
+import '../pages/index.dart';
4
+
5
+List<GetPage> pages = [
6
+  GetPage(name: '/', page: () =>  Home()),
7
+  GetPage(name: '/splash', page: () => SplashScreen()),
8
+  GetPage(name: '/login', page: () =>  MyRouteLogin()),
9
+];

+ 5
- 0
lib/services/user.dart 查看文件

@@ -18,10 +18,15 @@ Future getSMSCaptch(String phone) async {
18 18
   });
19 19
 }
20 20
 
21
+<<<<<<< HEAD
21 22
 
22 23
 //登陆
23 24
 Future userLogin(String userName,String password) async {
24 25
   return request('/login', options: Options(method: 'POST'), data: { 'userName': userName,'password':password }, ).catchError((error)=>{ Fluttertoast.showToast(
25 26
   msg: error.error['message']
26 27
   ),});
28
+=======
29
+Future getCurrent() async {
30
+  return request('/person/current');
31
+>>>>>>> aab895cc95471d4dfd7cb90d05a35ccceb52c4e0
27 32
 }

+ 0
- 0
lib/utils/dialog.dart 查看文件


+ 25
- 0
lib/utils/location.dart 查看文件

@@ -0,0 +1,25 @@
1
+import 'package:location/location.dart';
2
+
3
+Future requireLocation() async {
4
+  Location location = Location();
5
+  bool _serviceEnabled;
6
+  PermissionStatus _permissionGranted;
7
+
8
+  _serviceEnabled = await location.serviceEnabled();
9
+  if (!_serviceEnabled) {
10
+    _serviceEnabled = await location.requestService();
11
+    if (!_serviceEnabled) {
12
+      throw Exception("请开启系统定位功能");
13
+    }
14
+  }
15
+
16
+  _permissionGranted = await location.hasPermission();
17
+  if (_permissionGranted == PermissionStatus.denied) {
18
+    _permissionGranted = await location.requestPermission();
19
+    if (_permissionGranted != PermissionStatus.granted) {
20
+      throw Exception("请设置允许当前程序定位功能");
21
+    }
22
+  }
23
+
24
+  return location;
25
+}

+ 4
- 8
lib/utils/timer.dart 查看文件

@@ -6,11 +6,7 @@ Timer setInterval(void Function (Timer) f, int milliseconds) {
6 6
   return Timer.periodic(duration, f);
7 7
 }
8 8
 
9
-//
10
-// Timer setTimeout(void Function () f, int milliseconds) {
11
-//   if
12
-//
13
-//
14
-//   var duration = Duration(milliseconds: milliseconds);
15
-//   return Timer(duration, f);
16
-// }
9
+Timer setTimeout(void Function () f, int milliseconds) {
10
+  var duration = Duration(milliseconds: milliseconds);
11
+  return Timer(duration, f);
12
+}

+ 21
- 0
pubspec.lock 查看文件

@@ -233,6 +233,27 @@ packages:
233 233
       url: "https://pub.dartlang.org"
234 234
     source: hosted
235 235
     version: "1.0.1"
236
+  location:
237
+    dependency: "direct main"
238
+    description:
239
+      name: location
240
+      url: "https://pub.flutter-io.cn"
241
+    source: hosted
242
+    version: "4.3.0"
243
+  location_platform_interface:
244
+    dependency: transitive
245
+    description:
246
+      name: location_platform_interface
247
+      url: "https://pub.flutter-io.cn"
248
+    source: hosted
249
+    version: "2.3.0"
250
+  location_web:
251
+    dependency: transitive
252
+    description:
253
+      name: location_web
254
+      url: "https://pub.flutter-io.cn"
255
+    source: hosted
256
+    version: "3.1.1"
236 257
   logging:
237 258
     dependency: transitive
238 259
     description:

+ 4
- 0
pubspec.yaml 查看文件

@@ -39,7 +39,11 @@ dependencies:
39 39
   dio: ^4.0.6
40 40
   flutter_screenutil: ^5.3.1
41 41
   get_storage: ^2.0.3
42
+<<<<<<< HEAD
42 43
   fluttertoast: ^8.0.9
44
+=======
45
+  location: ^4.3.0
46
+>>>>>>> aab895cc95471d4dfd7cb90d05a35ccceb52c4e0
43 47
 
44 48
 dev_dependencies:
45 49
   flutter_test: