张延森 преди 3 години
родител
ревизия
286f63708f
променени са 5 файла, в които са добавени 152 реда и са изтрити 34 реда
  1. 11
    0
      lib/main.dart
  2. 8
    0
      lib/services/user.dart
  3. 45
    34
      lib/utils/Request.dart
  4. 0
    0
      lib/widgets/Cell.dart
  5. 88
    0
      lib/widgets/GradientButton.dart

+ 11
- 0
lib/main.dart Целия файл

@@ -1,5 +1,7 @@
1 1
 
2 2
 import 'package:farmer_client/models/Store.dart';
3
+import 'package:farmer_client/services/user.dart';
4
+import 'package:farmer_client/widgets/GradientButton.dart';
3 5
 import 'package:flutter/material.dart';
4 6
 import 'package:get/get.dart';
5 7
 
@@ -66,6 +68,10 @@ class _MyHomePageState extends State<MyHomePage> {
66 68
     });
67 69
   }
68 70
 
71
+  onTap() {
72
+    getSMSCaptch("17714208769");
73
+  }
74
+
69 75
   @override
70 76
   Widget build(BuildContext context) {
71 77
 
@@ -110,6 +116,11 @@ class _MyHomePageState extends State<MyHomePage> {
110 116
               '$_counter',
111 117
               style: Theme.of(context).textTheme.headline4,
112 118
             ),
119
+            GradientButton(
120
+              colors: const [Colors.orange, Colors.red],
121
+              child: const Text("Submit"),
122
+              onPressed: onTap,
123
+            ),
113 124
           ],
114 125
         ),
115 126
       ),

+ 8
- 0
lib/services/user.dart Целия файл

@@ -0,0 +1,8 @@
1
+
2
+import 'package:dio/dio.dart';
3
+import 'package:farmer_client/utils/Request.dart';
4
+import 'package:flutter/foundation.dart';
5
+
6
+Future getSMSCaptch(String phone) async {
7
+  return request('/sms-captcha', options: Options(method: 'POST'), queryParameters: { 'phone': phone });
8
+}

+ 45
- 34
lib/utils/Request.dart Целия файл

@@ -1,7 +1,8 @@
1
-
2 1
 import 'dart:convert';
3 2
 
4 3
 import 'package:dio/dio.dart';
4
+import 'package:flutter/foundation.dart';
5
+import 'package:get/get.dart';
5 6
 
6 7
 class Response {
7 8
   late int code;
@@ -14,56 +15,66 @@ class Response {
14 15
     this.data,
15 16
   });
16 17
 
17
-  factory Response.fromJson(dynamic str) => Response.fromMap(jsonDecode(str) as Map<String, dynamic>);
18
+  factory Response.fromJson(dynamic str) =>
19
+      Response.fromMap(jsonDecode(str) as Map<String, dynamic>);
18 20
 
19 21
   factory Response.fromMap(Map<String, dynamic> resp) => Response(
20
-    code: resp['code'],
21
-    message: resp['message'],
22
-    data: resp['data'],
23
-  );
22
+        code: resp['code'],
23
+        message: resp['message'],
24
+        data: resp['data'],
25
+      );
24 26
 }
25 27
 
28
+final client = GetPlatform.isAndroid ? 'android' : 'ios';
29
+
26 30
 Dio createRequest() {
27 31
   var options = BaseOptions(
28
-    baseUrl: 'https://www.xx.com/api',
32
+    baseUrl: 'https://machine.njyunzhi.com/api/' + client + '/farmer',
29 33
     connectTimeout: 5000,
30 34
     receiveTimeout: 3000,
31 35
   );
32 36
 
33 37
   var dio = Dio(options);
34
-  dio.interceptors.add(InterceptorsWrapper(
35
-      onRequest:(options, handler){
36
-        // Do something before request is sent
37
-        return handler.next(options); //continue
38
-        // If you want to resolve the request with some custom data,
39
-        // you can resolve a `Response` object eg: `handler.resolve(response)`.
40
-        // If you want to reject the request with a error message,
41
-        // you can reject a `DioError` object eg: `handler.reject(dioError)`
42
-      },
43
-      onResponse:(response,handler) {
44
-        Response resp = Response.fromJson(response.data['data']);
45
-        if (resp.code == 1000) {
46
-          response.data = resp.data;
47
-          return handler.next(response);
48
-        } else {
49
-          return handler.reject(response.data);
50
-        }
51
-      },
52
-      onError: (DioError e, handler) {
53
-        // Do something with response error
54
-        return  handler.next(e);//continue
55
-        // If you want to resolve the request with some custom data,
56
-        // you can resolve a `Response` object eg: `handler.resolve(response)`.
57
-      }
58
-  ));
38
+  dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {
39
+    // Do something before request is sent
40
+    return handler.next(options); //continue
41
+    // If you want to resolve the request with some custom data,
42
+    // you can resolve a `Response` object eg: `handler.resolve(response)`.
43
+    // If you want to reject the request with a error message,
44
+    // you can reject a `DioError` object eg: `handler.reject(dioError)`
45
+  }, onResponse: (response, handler) {
46
+    var resp = response.data as Map<String, dynamic>;
47
+    if (resp['code'] == 1000) {
48
+      response.data = resp['data'];
49
+      return handler.next(response);
50
+    } else {
51
+      return handler.reject(response.data);
52
+    }
53
+  }, onError: (DioError e, handler) {
54
+    // Do something with response error
55
+    return handler.next(e); //continue
56
+    // If you want to resolve the request with some custom data,
57
+    // you can resolve a `Response` object eg: `handler.resolve(response)`.
58
+  }));
59 59
 
60 60
   return dio;
61 61
 }
62 62
 
63 63
 var instance = createRequest();
64 64
 
65
-Future request (RequestOptions options) async {
66
-  var resp = await instance.fetch(options);
65
+Future request(String path,
66
+    {data,
67
+    Map<String, dynamic>? queryParameters,
68
+    CancelToken? cancelToken,
69
+    Options? options,
70
+    ProgressCallback? onSendProgress,
71
+    ProgressCallback? onReceiveProgress}) async {
72
+
73
+  var resp = await instance.request(path,
74
+      data: data,
75
+      queryParameters: queryParameters,
76
+      cancelToken: cancelToken,
77
+      options: options);
67 78
 
68 79
   if (resp.data.runtimeType == String) {
69 80
     String dt = resp.data as String;

+ 0
- 0
lib/widgets/Cell.dart Целия файл


+ 88
- 0
lib/widgets/GradientButton.dart Целия файл

@@ -0,0 +1,88 @@
1
+
2
+
3
+import 'package:flutter/material.dart';
4
+import 'package:flutter/widgets.dart';
5
+
6
+class GradientButton extends StatelessWidget {
7
+  const GradientButton({
8
+    Key? key,
9
+    this.colors,
10
+    this.linearStart,
11
+    this.linearEnd,
12
+    required this.onPressed,
13
+    required this.child,
14
+    this.padding,
15
+    this.borderRadius = const BorderRadius.all(Radius.circular(2)),
16
+    this.textColor,
17
+    this.splashColor,
18
+    this.disabledColor,
19
+    this.disabledTextColor,
20
+    this.onHighlightChanged,
21
+  }) : super(key: key);
22
+
23
+  // 渐变色数组
24
+  final List<Color>? colors;
25
+  final Color? textColor;
26
+  final Color? splashColor;
27
+  final Color? disabledTextColor;
28
+  final Color? disabledColor;
29
+  final EdgeInsetsGeometry? padding;
30
+  final Alignment? linearStart;
31
+  final Alignment? linearEnd;
32
+
33
+  final Widget child;
34
+  final BorderRadius? borderRadius;
35
+
36
+  final GestureTapCallback? onPressed;
37
+  final ValueChanged<bool>? onHighlightChanged;
38
+
39
+  @override
40
+  Widget build(BuildContext context) {
41
+    ThemeData theme = Theme.of(context);
42
+    //确保colors数组不空
43
+    List<Color> _colors =
44
+        colors ?? [theme.primaryColor, theme.primaryColorDark];
45
+    final radius = borderRadius;
46
+    bool disabled = onPressed == null;
47
+
48
+    return DecoratedBox(
49
+      decoration: BoxDecoration(
50
+        gradient: disabled ? null : LinearGradient(begin: linearStart??Alignment.topCenter, end: linearEnd??Alignment.bottomCenter, colors: _colors),
51
+        color: disabled ? disabledColor ?? theme.disabledColor : null,
52
+        borderRadius: radius,
53
+      ),
54
+      child: Material(
55
+        type: MaterialType.transparency,
56
+        borderRadius: radius,
57
+        clipBehavior: Clip.hardEdge,
58
+        child: ConstrainedBox(
59
+          constraints: const BoxConstraints(minWidth: 88.0, minHeight: 36.0),
60
+          child: InkWell(
61
+            splashColor: splashColor ?? _colors.last,
62
+            highlightColor: Colors.transparent,
63
+            onHighlightChanged: onHighlightChanged,
64
+            onTap: onPressed,
65
+            child: Padding(
66
+              padding: padding ?? theme.buttonTheme.padding,
67
+              child: DefaultTextStyle(
68
+                style: const TextStyle(fontWeight: FontWeight.bold),
69
+                child: Center(
70
+                  child: DefaultTextStyle(
71
+                    style: theme.textTheme.button!.copyWith(
72
+                      color: disabled
73
+                          ? disabledTextColor ?? Colors.black38
74
+                          : textColor ?? Colors.white,
75
+                    ),
76
+                    child: child,
77
+                  ),
78
+                  widthFactor: 1,
79
+                  heightFactor: 1,
80
+                ),
81
+              ),
82
+            ),
83
+          ),
84
+        ),
85
+      ),
86
+    );
87
+  }
88
+}