Browse Source

fix error

liuyuqi-dellpc 9 months ago
parent
commit
05a4a2b3c3

+ 3 - 3
android/app/build.gradle

@@ -25,7 +25,7 @@ apply plugin: 'com.android.application'
 apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
 
 android {
-    compileSdkVersion 31
+    compileSdkVersion 33
     signingConfigs {
         release {
             storeFile file("../sign/release.jks")
@@ -41,8 +41,8 @@ android {
 
     defaultConfig {
         applicationId "me.yoqi.flutter.tracker"
-        minSdkVersion 19
-        targetSdkVersion 31
+        minSdkVersion 21
+        targetSdkVersion 33
         versionCode flutterVersionCode.toInteger()
         versionName flutterVersionName
     }

+ 1 - 0
android/app/src/main/AndroidManifest.xml

@@ -27,6 +27,7 @@
         android:networkSecurityConfig="@xml/network_security_config">
         <activity
             android:name=".MainActivity"
+            android:exported="true"
             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
             android:hardwareAccelerated="true"
             android:launchMode="singleTop"

+ 0 - 12
lib/dio/local_api.dart

@@ -1,12 +0,0 @@
-import 'package:flutter_tracker/dio/api.dart';
-import 'package:flutter_tracker/model/user_model.dart';
-
-/// Description:
-/// Time       : 2021年12月03日 Friday
-/// Author     : liuyuqi.gov@msncn
-class LocalApi extends Api {
-  @override
-  Future<UserModel> login(String username, String password) {
-    return null;
-  }
-}

+ 5 - 3
lib/dio/login_dao.dart

@@ -10,7 +10,8 @@ import 'package:flutter_tracker/model/user_model.dart';
 class LoginDao {
   static Map<String, dynamic> params = <String, dynamic>{};
 
-  static Future<LoginEntity> login(String username, String password) async {
+  /// login
+  static Future<LoginEntity?> login(String username, String password) async {
     params.addAll({"username": username, "password": password});
     try {
       Response response = await Dio().post(Api.loginUrl, data: params);
@@ -20,13 +21,14 @@ class LoginDao {
     }
   }
 
+  /// logout
   static Future<MessageModel> logout(String token) async {
     params.addAll({"token": token});
     try {
       Response response = await Dio().post(Api.logoutUrl, data: params);
       return MessageModel.fromJson(response.data);
     } catch (e) {
-      return null;
+      return MessageModel.fromJson({"success": false, "msg": "网络错误"});
     }
   }
 
@@ -37,7 +39,7 @@ class LoginDao {
       if (response.data["success"] == true) {}
       return MessageModel.fromJson(response.data);
     } catch (e) {
-      return null;
+      return MessageModel.fromJson({"success": false, "msg": "网络错误"});
     }
   }
 

+ 0 - 12
lib/dio/remote_api.dart

@@ -1,12 +0,0 @@
-import 'package:flutter_tracker/model/user_model.dart';
-
-import 'api.dart';
-
-/// Description:
-/// Time       : 2021年12月03日 Friday
-/// Author     : liuyuqi.gov@msncn
-class RemoteApi extends Api {
-  Future<UserModel> login(String username, String password) {
-    return null;
-  }
-}

+ 2 - 2
lib/dio/track_dao.dart

@@ -17,7 +17,7 @@ class TrackDao {
         .then((response) {
       return SubmitModel.fromJson(response.data);
     });
-    return null;
+    return SubmitModel.fromJson({"success": false, "msg": "网络错误"});
   }
 
   static Future<SubmitModel> uploadTrack(
@@ -34,6 +34,6 @@ class TrackDao {
         .then((response) {
       return SubmitModel.fromJson(response.data);
     });
-    return null;
+    return SubmitModel.fromJson({"success": false, "msg": "网络错误"});
   }
 }

+ 2 - 2
lib/index_page.dart

@@ -7,7 +7,7 @@ import 'package:flutter_tracker/pages/tabs/track_page.dart';
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class IndexPage extends StatefulWidget {
-  const IndexPage({Key key}) : super(key: key);
+  const IndexPage({Key? key}) : super(key: key);
 
   @override
   _IndexPageState createState() => _IndexPageState();
@@ -23,7 +23,7 @@ class _IndexPageState extends State<IndexPage> {
     const TrackPage(),
     MinePage(),
   ];
-  Widget currentPage;
+  late Widget currentPage;
 
   @override
   void initState() {

+ 3 - 9
lib/main.dart

@@ -2,21 +2,15 @@ import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:flutter_tracker/pages/welcome_page.dart';
 import 'package:flutter_tracker/routes/routes.dart';
-import 'package:shared_preferences/shared_preferences.dart';
-
+import 'package:flutter_tracker/utils/sp_util.dart';
 import 'index_page.dart';
-import 'model/config.dart';
 
 /// Description:
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 void main() async {
   WidgetsFlutterBinding.ensureInitialized();
-  Config.initConfig();
-  SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
-  bool isLogin = sharedPreferences.getBool("isLogin");
-  isLogin ??= false;
-
+  bool isLogin = await SpUtil.get("isLogin", false);
   runApp(MyApp(
     isLogin: isLogin,
   ));
@@ -25,7 +19,7 @@ void main() async {
 class MyApp extends StatelessWidget {
   bool isLogin = false;
 
-  MyApp({Key key, this.isLogin}) : super(key: key);
+  MyApp({Key? key, required this.isLogin}) : super(key: key);
 
   // This widget is the root of your application.
   @override

+ 6 - 4
lib/model/base_model.dart

@@ -2,13 +2,15 @@
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class BaseModel<T> {
-  String msg;
-  bool success;
-  T data;
+  String msg = "";
+  bool success = false;
+  T? data;
+
+  BaseModel({ this.msg="网络异常",  this.success=false,  this.data});
 
   BaseModel.fromJson(Map<String, dynamic> json) {
     msg = json["msg"];
     success = json["success"];
     data = json["data"];
   }
-}
+}

+ 1 - 15
lib/model/config.dart

@@ -1,26 +1,12 @@
 import 'package:flutter/material.dart';
-import 'package:flutter_tracker/dio/api.dart';
-import 'package:flutter_tracker/dio/remote_api.dart';
 import 'package:shared_preferences/shared_preferences.dart';
 
 /// Description:
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class Config {
-  static SharedPreferences pref;
+  static Future<SharedPreferences> pref = SharedPreferences.getInstance();
   static bool isLogin = false;
-
-  // 通过这个来控制全局环境变量
-  static Api apiClient;
-
-  static initConfig() async {
-    if (pref == null) {
-      pref = await SharedPreferences.getInstance();
-    }
-    if (apiClient == null) {
-      apiClient = RemoteApi();
-    }
-  }
 }
 
 class ThemeColor {

+ 1 - 3
lib/model/entity_factory.dart

@@ -5,14 +5,12 @@ import 'package:flutter_tracker/model/user_model.dart';
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class EntityFactory {
-  static T geneerateObj<T>(dynamic json) {
+  static T? geneerateObj<T>(dynamic json) {
     switch (T.toString()) {
       case "UserModel":
         return UserModel.fromJson(json) as T;
-        break;
       case "SubmitModel":
         return SubmitModel.fromJson(json) as T;
-        break;
       default:
         return null;
     }

+ 7 - 4
lib/model/login_entity.dart

@@ -1,11 +1,14 @@
+import 'package:flutter_tracker/model/base_model.dart';
 import 'package:flutter_tracker/model/message_model.dart';
 
 /// Description:
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
-class LoginEntity {
-  String token;
-  MessageModel msgModel;
+class LoginEntity extends BaseModel {
+  String token = "";
+  MessageModel msgModel = MessageModel(msg: "网络异常", success: false);
+
+  LoginEntity({required this.token, required this.msgModel});
 
   LoginEntity.fromJson(Map<String, dynamic> json) {
     msgModel = MessageModel.fromJson(json);
@@ -13,4 +16,4 @@ class LoginEntity {
       token = json["data"]["token"];
     }
   }
-}
+}

+ 5 - 3
lib/model/message_model.dart

@@ -2,9 +2,11 @@
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class MessageModel<T> {
-  String msg;
-  bool success;
-  T data;
+  String msg = "";
+  bool success = false;
+  T? data;
+
+  MessageModel({this.msg = "", this.success = false, this.data});
 
   MessageModel.fromJson(Map<String, dynamic> json) {
     msg = json["msg"];

+ 12 - 12
lib/model/submit_model.dart

@@ -4,20 +4,20 @@ import 'package:flutter_tracker/utils/time_util.dart';
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class SubmitModel {
-  int userid;
-  DateTime time;
-  String address;
-  String telphone;
-  int health;
-  String pic;
+  int userid = 0;
+  DateTime time = DateTime(0);
+  String address = "";
+  String telphone = "";
+  int health = 0;
+  String pic = "";
 
   SubmitModel(
-      {this.userid,
-      this.time,
-      this.address,
-      this.telphone,
-      this.health,
-      this.pic});
+      {required this.userid,
+      required this.time,
+      required this.address,
+      required this.telphone,
+      required this.health,
+      required this.pic});
 
   SubmitModel.fromJson(Map<String, dynamic> json) {
     userid = int.parse(json['userid']);

+ 20 - 20
lib/model/user_model.dart

@@ -4,26 +4,26 @@ import 'package:flutter_tracker/model/message_model.dart';
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class UserModel {
-  String id; // 用户id
-  String username; //用户名
-  String pwd; // 密码
-  String deviceid;
-  String updateTime;
-  String nickname;
-  int sex; // 性别:1男2女
-  String avatar; // 头像
-  int type; //类型:2商家,1顾客
+  String id = ""; // 用户id
+  String username = ""; //用户名
+  String pwd = ""; // 密码
+  String deviceid = "";
+  String updateTime = "";
+  String nickname = "";
+  int sex = 1; // 性别:1男2女
+  String avatar = ""; // 头像
+  int type = 1; //类型:2商家,1顾客
 
   UserModel(
-      {this.id,
-      this.username,
-      this.nickname,
-      this.deviceid,
-      this.updateTime,
-      this.pwd,
-      this.sex,
-      this.avatar,
-      this.type});
+      {this.id = "",
+      this.username = "",
+      this.nickname = "",
+      required this.deviceid,
+      this.updateTime = "",
+      this.pwd = "",
+      this.sex = 1,
+      this.avatar = "",
+      this.type = 1});
 
   UserModel.fromJson(Map<String, dynamic> json) {
     avatar = json["avatar"];
@@ -31,8 +31,8 @@ class UserModel {
 }
 
 class UserEntity {
-  UserModel user;
-  MessageModel msg;
+  late UserModel user;
+  late MessageModel msg;
 
   UserEntity(this.user, this.msg);
 

+ 1 - 1
lib/pages/about_page.dart

@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class AboutPage extends StatefulWidget {
-  const AboutPage({Key key}) : super(key: key);
+  const AboutPage({Key? key}) : super(key: key);
 
   @override
   _AboutPageState createState() => _AboutPageState();

+ 1 - 1
lib/pages/bluetooth_off_page.dart

@@ -4,7 +4,7 @@ import 'package:flutter_blue/flutter_blue.dart';
 class BluetoothOffPage extends StatelessWidget {
   final BluetoothState state;
 
-  BluetoothOffPage({Key key, BluetoothState this.state}) : super(key: key);
+ BluetoothOffPage({Key? key, required BluetoothState this.state}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {

+ 1 - 1
lib/pages/help_page.dart

@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class HelpPage extends StatefulWidget {
-  const HelpPage({Key key}) : super(key: key);
+  const HelpPage({Key? key}) : super(key: key);
 
   @override
   _HelpPageState createState() => _HelpPageState();

+ 23 - 17
lib/pages/login/login_page.dart

@@ -9,7 +9,7 @@ import 'package:shared_preferences/shared_preferences.dart';
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class LoginPage extends StatefulWidget {
-  const LoginPage({Key key}) : super(key: key);
+  const LoginPage({Key? key}) : super(key: key);
 
   @override
   _LoginPageState createState() => _LoginPageState();
@@ -20,8 +20,8 @@ class _LoginPageState extends State<LoginPage> {
   final TextEditingController _passwordController = TextEditingController();
   final _formKey = GlobalKey<FormState>();
 
-  String _username;
-  String _password;
+  String? _username = "";
+  String? _password = "";
 
   @override
   void initState() {
@@ -47,7 +47,7 @@ class _LoginPageState extends State<LoginPage> {
                       hintText: '请输入用户名',
                       icon: Icon(Icons.person)),
                   validator: (value) {
-                    if (value.isEmpty) {
+                    if (value == null || value.isEmpty) {
                       return '用户名不能为空';
                     }
                     return null;
@@ -58,13 +58,13 @@ class _LoginPageState extends State<LoginPage> {
                 ),
                 TextFormField(
                   controller: _passwordController,
-                  decoration: InputDecoration(
+                  decoration: const InputDecoration(
                       labelText: '密码',
                       hintText: '请输入密码',
                       icon: Icon(Icons.lock)),
                   obscureText: true,
                   validator: (value) {
-                    if (value.isEmpty) {
+                    if (value == null || value.isEmpty) {
                       return '密码不能为空';
                     }
                     return null;
@@ -78,10 +78,14 @@ class _LoginPageState extends State<LoginPage> {
                   child: Row(
                     children: [
                       Expanded(
-                        child: RaisedButton(
-                          padding: EdgeInsets.all(15),
-                          color: Colors.green,
-                          textColor: Colors.white,
+                        child: ElevatedButton(
+                          style: ButtonStyle(
+                            padding:
+                                MaterialStateProperty.all(EdgeInsets.all(15)),
+                            iconColor: MaterialStateProperty.all(Colors.green),
+                            foregroundColor:
+                                MaterialStateProperty.all(Colors.white),
+                          ),
                           child: Text('登录'),
                           onPressed: () {
                             login();
@@ -99,8 +103,8 @@ class _LoginPageState extends State<LoginPage> {
 
   void loadData() async {
     SharedPreferences prefs = await SharedPreferences.getInstance();
-    String username = prefs.getString('username');
-    String password = prefs.getString('password');
+    String? username = prefs.getString('username');
+    String? password = prefs.getString('password');
     if (username != null && password != null) {
       _usernameController.text = username;
       _passwordController.text = password;
@@ -110,12 +114,14 @@ class _LoginPageState extends State<LoginPage> {
   void login() async {
     SharedPreferences prefs = await SharedPreferences.getInstance();
 
-    if (_formKey.currentState.validate()) {
-      _formKey.currentState.save();
-      LoginEntity loginEntity = await LoginDao.login(_username, _password);
+    if (_formKey.currentState!.validate() &&
+        _username != null &&
+        _password != null) {
+      _formKey.currentState!.save();
+      LoginEntity loginEntity = await LoginDao.login(_username!, _password!);
       if (loginEntity.msgModel.success) {
-        prefs.setString('username', _username);
-        prefs.setString('password', _password);
+        prefs.setString('username', _username!);
+        prefs.setString('password', _password!);
         prefs.setBool('isLogin', true);
         Navigator.of(context).pushNamed(Routes.indexPage);
       }

+ 14 - 8
lib/pages/login/register_page.dart

@@ -8,7 +8,7 @@ import 'package:flutter_tracker/utils/app_util.dart';
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class RegisterPage extends StatefulWidget {
-  const RegisterPage({Key key}) : super(key: key);
+  const RegisterPage({Key? key}) : super(key: key);
 
   @override
   _RegisterPageState createState() => _RegisterPageState();
@@ -45,7 +45,7 @@ class _RegisterPageState extends State<RegisterPage> {
                     icon: Icon(Icons.person)),
                 // 校验用户名
                 validator: (v) {
-                  return v.trim().isNotEmpty ? null : "用户名不能为空";
+                  return v!.trim().isNotEmpty ? null : "用户名不能为空";
                 },
                 onChanged: (inputStr) {
                   _userName = inputStr;
@@ -60,7 +60,7 @@ class _RegisterPageState extends State<RegisterPage> {
                   obscureText: true,
                   //校验密码
                   validator: (v) {
-                    return v.trim().length > 5 ? null : "密码不能少于6位";
+                    return v!.trim().length > 5 ? null : "密码不能少于6位";
                   }),
               TextFormField(
                 controller: _controllerRepwd,
@@ -71,7 +71,7 @@ class _RegisterPageState extends State<RegisterPage> {
                 obscureText: true,
                 //校验密码
                 validator: (v) {
-                  return v.trim().length > 5 ? null : "密码不能少于6位";
+                  return v!.trim().length > 5 ? null : "密码不能少于6位";
                 },
                 onChanged: (inputStr) {
                   _pwd = inputStr;
@@ -83,11 +83,17 @@ class _RegisterPageState extends State<RegisterPage> {
                 child: Row(
                   children: <Widget>[
                     Expanded(
-                      child: RaisedButton(
-                        padding: EdgeInsets.all(15.0),
+                      child: ElevatedButton(
                         child: Text("注册"),
-                        color: Theme.of(context).primaryColor,
-                        textColor: Colors.white,
+                        style: ButtonStyle(
+                          padding: MaterialStateProperty.all(
+                            EdgeInsets.all(15.0),
+                          ),
+                          iconColor: MaterialStateProperty.all(
+                              Theme.of(context).primaryColor),
+                          foregroundColor:
+                              MaterialStateProperty.all(Colors.white),
+                        ),
                         onPressed: () {
                           register();
                         },

+ 1 - 1
lib/pages/settings_page.dart

@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class SettingsPage extends StatefulWidget {
-  const SettingsPage({Key key}) : super(key: key);
+  const SettingsPage({Key? key}) : super(key: key);
 
   @override
   _SettingsPageState createState() => _SettingsPageState();

+ 6 - 6
lib/pages/submit_page.dart

@@ -12,7 +12,7 @@ import 'package:shared_preferences/shared_preferences.dart';
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class SubmitPage extends StatefulWidget {
-  const SubmitPage({Key key}) : super(key: key);
+  const SubmitPage({Key? key}) : super(key: key);
 
   @override
   _SubmitPageState createState() => _SubmitPageState();
@@ -29,7 +29,7 @@ class _SubmitPageState extends State<SubmitPage> {
   String _addresds = "";
   bool _heathStatus = false;
 
-  String _filePath;
+  late String _filePath;
 
   Size get _size => MediaQuery.of(context).size;
 
@@ -53,7 +53,7 @@ class _SubmitPageState extends State<SubmitPage> {
                     icon: Icon(Icons.person)),
                 // 校验用户名
                 validator: (v) {
-                  return v.trim().length > 0 ? null : "姓名不能为空";
+                  return v!.trim().isNotEmpty ? null : "姓名不能为空";
                 },
                 onChanged: (inputStr) {
                   _userName = inputStr;
@@ -66,7 +66,7 @@ class _SubmitPageState extends State<SubmitPage> {
                     hintText: "联系电话",
                     icon: Icon(Icons.phone)),
                 validator: (v) {
-                  return v.trim().length > 11 ? null : "手机号错误";
+                  return v!.trim().length > 11 ? null : "手机号错误";
                 },
                 onChanged: (inputStr) {
                   _tel = inputStr;
@@ -79,7 +79,7 @@ class _SubmitPageState extends State<SubmitPage> {
                     hintText: "请输入家庭住址",
                     icon: Icon(Icons.house)),
                 validator: (v) {
-                  return v.trim().length > 0 ? null : "请输入地址";
+                  return v!.trim().length > 0 ? null : "请输入地址";
                 },
                 onChanged: (inputStr) {
                   _addresds = inputStr;
@@ -200,7 +200,7 @@ class _SubmitPageState extends State<SubmitPage> {
 
   void submitInfo() async {
     SharedPreferences prefs = await SharedPreferences.getInstance();
-    String token = prefs.getString("token");
+    String token = prefs.getString("token") ?? "";
     var uploadTrack =
         TrackDao.uploadTrack(token, _tel, _addresds, _heathStatus);
   }

+ 2 - 2
lib/pages/tabs/home_page.dart

@@ -7,7 +7,7 @@ import 'package:webview_flutter/webview_flutter.dart';
 class HomePage extends StatefulWidget {
   String url;
 
-  HomePage({Key key, this.url}) : super(key: key);
+  HomePage({Key? key, required this.url}) : super(key: key);
 
   @override
   _HomePageState createState() => _HomePageState();
@@ -20,7 +20,7 @@ class _HomePageState extends State<HomePage> {
   Widget build(BuildContext context) {
     return Stack(
       children: <Widget>[
-        WebView(
+        Webview(
           initialUrl: widget.url,
           javascriptMode: JavascriptMode.unrestricted,
           onWebViewCreated: (WebViewController web) {

+ 9 - 6
lib/pages/tabs/mine_page.dart

@@ -10,7 +10,7 @@ import 'package:shared_preferences/shared_preferences.dart';
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class MinePage extends StatefulWidget {
-  const MinePage({Key key}) : super(key: key);
+  const MinePage({Key? key}) : super(key: key);
 
   @override
   _MinePageState createState() => _MinePageState();
@@ -219,21 +219,24 @@ class _MinePageState extends State<MinePage> {
           width: 200,
           height: 200,
         );
-        break;
       case 2:
         return Image.asset(
           "assets/images/yellow.jpg",
           width: 200,
           height: 200,
         );
-        break;
       case 3:
         return Image.asset(
           "assets/images/red.jpg",
           width: 200,
           height: 200,
         );
-        break;
+      default:
+        return Image.asset(
+          "assets/images/green.jpg",
+          width: 200,
+          height: 200,
+        );
     }
   }
 
@@ -244,13 +247,13 @@ class _MinePageState extends State<MinePage> {
 
   void getUserInfo(String token) async {
     var sharedPreferences = await SharedPreferences.getInstance();
-    String token = sharedPreferences.getString("token");
+    String token = sharedPreferences.getString("token") ?? "";
     await LoginDao.getUserInfo(token);
   }
 
   void logout() async {
     var sharedPreferences = await SharedPreferences.getInstance();
-    String token = sharedPreferences.getString("token");
+    String token = sharedPreferences.getString("token") ?? "";
     try {
       MessageModel messageModel = await LoginDao.logout(token);
       if (messageModel != null) {

+ 22 - 16
lib/pages/tabs/track_page.dart

@@ -6,12 +6,11 @@ import 'package:flutter_tracker/pages/bluetooth_off_page.dart';
 import 'package:flutter_tracker/utils/app_util.dart';
 import 'package:flutter_tracker/views/contact_card.dart';
 
-
 /// Description:
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class TrackPage extends StatefulWidget {
-  const TrackPage({Key key}) : super(key: key);
+  const TrackPage({Key? key}) : super(key: key);
 
   @override
   _TrackPageState createState() => _TrackPageState();
@@ -36,7 +35,7 @@ class _TrackPageState extends State<TrackPage> {
           if (state == BluetoothState.on) {
             return buildContent();
           }
-          return BluetoothOffPage(state: state);
+          return BluetoothOffPage(state: state!);
         });
   }
 
@@ -126,16 +125,18 @@ class _TrackPageState extends State<TrackPage> {
         stream: flutterBlue.isScanning,
         initialData: false,
         builder: (context, snapshot) {
-          if (snapshot.data) {
+          if (snapshot.data!) {
             return Padding(
               padding: EdgeInsets.only(bottom: 200.0),
-              child: RaisedButton(
-                shape: RoundedRectangleBorder(
-                    borderRadius: BorderRadius.circular(20.0)),
-                elevation: 5.0,
-                color: Colors.red,
+              child: ElevatedButton(
+                style: ButtonStyle(
+                  shape: MaterialStateProperty.all(RoundedRectangleBorder(
+                      borderRadius: BorderRadius.circular(20.0))),
+                  elevation: MaterialStateProperty.all(5.0),
+                  iconColor: MaterialStateProperty.all(Colors.red),
+                ),
                 onPressed: () async {
-                  startTrack(snapshot.data);
+                  startTrack(snapshot.data!);
                 },
                 child: const Text(
                   '停止追踪',
@@ -150,13 +151,18 @@ class _TrackPageState extends State<TrackPage> {
           } else {
             return Padding(
               padding: EdgeInsets.only(bottom: 200.0),
-              child: RaisedButton(
-                shape: RoundedRectangleBorder(
-                    borderRadius: BorderRadius.circular(20.0)),
-                elevation: 5.0,
-                color: Colors.deepPurple[400],
+              child: ElevatedButton(
+                style: ButtonStyle(
+                  shape: MaterialStateProperty.all(
+                    RoundedRectangleBorder(
+                      borderRadius: BorderRadius.circular(20.0),
+                    ),
+                  ),
+                  elevation: MaterialStateProperty.all(5.0),
+                  iconColor: MaterialStateProperty.all(Colors.deepPurple[400]),
+                ),
                 onPressed: () async {
-                  startTrack(snapshot.data);
+                  startTrack(snapshot.data!);
                 },
                 child: const Text(
                   '开始追踪',

+ 1 - 1
lib/pages/welcome_page.dart

@@ -8,7 +8,7 @@ import 'package:flutter_tracker/utils/app_util.dart';
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class WelComePage extends StatefulWidget {
-  const WelComePage({Key key}) : super(key: key);
+  const WelComePage({Key? key}) : super(key: key);
 
   @override
   _WelComePageState createState() => _WelComePageState();

+ 82 - 3
lib/utils/sp_util.dart

@@ -1,3 +1,82 @@
-class SpUtil{
-  
-}
+import 'dart:convert';
+
+import 'package:shared_preferences/shared_preferences.dart';
+
+class SpUtil {
+  static Future<SharedPreferences> sharedPreferences =
+      SharedPreferences.getInstance();
+
+  static Future<T> get<T>(String key, T defaultValue) {
+    return sharedPreferences.then((s) {
+      if (s.get(key) == null) {
+        return defaultValue;
+      } else {
+        if (defaultValue is int) {
+          return s.getInt(key) as T;
+        }
+        if (defaultValue is double) {
+          return s.getDouble(key) as T;
+        }
+        if (defaultValue is String) {
+          return s.getString(key) as T;
+        }
+        if (defaultValue is List<String>) {
+          return s.getStringList(key) as T;
+        }
+        if (defaultValue is List<Map>) {
+          List<String>? dataList = s.getStringList(key);
+          return dataList?.map((value) {
+            return json.decode(value);
+          }).toList() as T;
+        }
+        if (defaultValue is bool) {
+          return s.getBool(key) as T;
+        }
+        return s.get(key) as T;
+      }
+    });
+  }
+
+  static Future<bool> save<T>(String key, T value) async {
+    return sharedPreferences.then((s) {
+      if (value == null) {
+        return s.remove(key);
+      } else {
+        if (value is int) {
+          return s.setInt(key, value);
+        }
+        if (value is double) {
+          return s.setDouble(key, value);
+        }
+        if (value is String) {
+          return s.setString(key, value);
+        }
+        if (value is List<String>) {
+          return s.setStringList(key, value);
+        }
+        if (value is List<Map>) {
+          List<String> dataList = value.map((value) {
+            return json.encode(value);
+          }).toList();
+          return s.setStringList(key, dataList);
+        }
+        if (value is bool) {
+          return s.setBool(key, value);
+        }
+      }
+      return false;
+    });
+  }
+
+  static Future<bool> remove(String key) {
+    return sharedPreferences.then((s) {
+      return s.remove(key);
+    });
+  }
+
+  static Future<bool> clear() {
+    return sharedPreferences.then((s) {
+      return s.clear();
+    });
+  }
+}

+ 2 - 3
lib/utils/time_util.dart

@@ -2,10 +2,9 @@
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 class TimeUtil {
+  
+  /// json转DateTime
   static DateTime getDateTime(json) {
-    if (json == null) {
-      return null;
-    }
     return DateTime.parse(json);
   }
 }

+ 4 - 4
lib/views/bottom_sheet_text.dart

@@ -5,8 +5,8 @@ import 'package:flutter/material.dart';
 /// Author     : liuyuqi.gov@msncn
 class BottomSheetText extends StatelessWidget {
   const BottomSheetText({
-    this.question,
-    this.result,
+    required this.question,
+    required this.result,
   });
 
   final String question;
@@ -20,13 +20,13 @@ class BottomSheetText extends StatelessWidget {
         children: <TextSpan>[
           TextSpan(
               text: '$question: ',
-              style: TextStyle(
+              style: const TextStyle(
                 fontWeight: FontWeight.bold,
                 fontSize: 22.0,
               )),
           TextSpan(
             text: '$result',
-            style: TextStyle(
+            style: const TextStyle(
               fontSize: 20.0,
             ),
           ),

+ 3 - 3
lib/views/contact_card.dart

@@ -7,10 +7,10 @@ import 'bottom_sheet_text.dart';
 /// Author     : liuyuqi.gov@msncn
 class ContactCard extends StatelessWidget {
   ContactCard(
-      {this.imagePath,
-      this.infection,
+      {required this.imagePath,
+      required this.infection,
       this.username = "",
-      this.updateTime,
+      required this.updateTime,
       this.deviceid = ""});
 
   final String imagePath;

+ 290 - 117
pubspec.lock

@@ -5,100 +5,146 @@ packages:
     dependency: transitive
     description:
       name: async
-      url: "https://pub.dartlang.org"
+      sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.8.2"
+    version: "2.10.0"
   boolean_selector:
     dependency: transitive
     description:
       name: boolean_selector
-      url: "https://pub.dartlang.org"
+      sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.1.0"
+    version: "2.1.1"
   characters:
     dependency: transitive
     description:
       name: characters
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "1.2.0"
-  charcode:
-    dependency: transitive
-    description:
-      name: charcode
-      url: "https://pub.dartlang.org"
+      sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.3.1"
+    version: "1.2.1"
   clock:
     dependency: transitive
     description:
       name: clock
-      url: "https://pub.dartlang.org"
+      sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.1.0"
+    version: "1.1.1"
   collection:
     dependency: transitive
     description:
       name: collection
-      url: "https://pub.dartlang.org"
+      sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.15.0"
+    version: "1.17.0"
   convert:
     dependency: transitive
     description:
       name: convert
-      url: "https://pub.dartlang.org"
+      sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "3.1.1"
+  cross_file:
+    dependency: transitive
+    description:
+      name: cross_file
+      sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "3.0.1"
+    version: "0.3.3+4"
   cupertino_icons:
     dependency: "direct main"
     description:
       name: cupertino_icons
-      url: "https://pub.dartlang.org"
+      sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.0.4"
+    version: "1.0.5"
   dio:
     dependency: "direct main"
     description:
       name: dio
-      url: "https://pub.dartlang.org"
+      sha256: a9d76e72985d7087eb7c5e7903224ae52b337131518d127c554b9405936752b8
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "4.0.6"
+    version: "5.2.1+1"
   fake_async:
     dependency: transitive
     description:
       name: fake_async
-      url: "https://pub.dartlang.org"
+      sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.2.0"
+    version: "1.3.1"
   ffi:
     dependency: transitive
     description:
       name: ffi
-      url: "https://pub.dartlang.org"
+      sha256: ed5337a5660c506388a9f012be0288fb38b49020ce2b45fe1f8b8323fe429f99
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.1.2"
+    version: "2.0.2"
   file:
     dependency: transitive
     description:
       name: file
-      url: "https://pub.dartlang.org"
+      sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "6.1.2"
+    version: "6.1.4"
   file_picker:
     dependency: "direct main"
     description:
       name: file_picker
-      url: "https://pub.dartlang.org"
+      sha256: "9d6e95ec73abbd31ec54d0e0df8a961017e165aba1395e462e5b31ea0c165daf"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.1.7"
+    version: "5.3.1"
+  file_selector_linux:
+    dependency: transitive
+    description:
+      name: file_selector_linux
+      sha256: "770eb1ab057b5ae4326d1c24cc57710758b9a46026349d021d6311bd27580046"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "0.9.2"
+  file_selector_macos:
+    dependency: transitive
+    description:
+      name: file_selector_macos
+      sha256: "4ada532862917bf16e3adb3891fe3a5917a58bae03293e497082203a80909412"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "0.9.3+1"
+  file_selector_platform_interface:
+    dependency: transitive
+    description:
+      name: file_selector_platform_interface
+      sha256: "412705a646a0ae90f33f37acfae6a0f7cbc02222d6cd34e479421c3e74d3853c"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "2.6.0"
+  file_selector_windows:
+    dependency: transitive
+    description:
+      name: file_selector_windows
+      sha256: "1372760c6b389842b77156203308940558a2817360154084368608413835fc26"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "0.9.3"
   fixnum:
     dependency: transitive
     description:
       name: fixnum
-      url: "https://pub.dartlang.org"
+      sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.0.0"
+    version: "1.1.0"
   flutter:
     dependency: "direct main"
     description: flutter
@@ -108,30 +154,34 @@ packages:
     dependency: "direct main"
     description:
       name: flutter_blue
-      url: "https://pub.dartlang.org"
+      sha256: f7f76b9b80455b0375693ec96c276fadb01e94d8441fa1740a64980cd1aeda5c
+      url: "https://pub.flutter-io.cn"
     source: hosted
     version: "0.8.0"
   flutter_lints:
     dependency: "direct dev"
     description:
       name: flutter_lints
-      url: "https://pub.dartlang.org"
+      sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493
+      url: "https://pub.flutter-io.cn"
     source: hosted
     version: "1.0.4"
   flutter_plugin_android_lifecycle:
     dependency: transitive
     description:
       name: flutter_plugin_android_lifecycle
-      url: "https://pub.dartlang.org"
+      sha256: "950e77c2bbe1692bc0874fc7fb491b96a4dc340457f4ea1641443d0a6c1ea360"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.0.11"
+    version: "2.0.15"
   flutter_screenutil:
     dependency: "direct main"
     description:
       name: flutter_screenutil
-      url: "https://pub.dartlang.org"
+      sha256: "0a122936b450324cbdfd51be0819cc6fcebb093eb65585e9cd92263f7a1a8a39"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "5.3.1"
+    version: "5.7.0"
   flutter_test:
     dependency: "direct dev"
     description: flutter
@@ -146,170 +196,258 @@ packages:
     dependency: "direct main"
     description:
       name: fluttertoast
-      url: "https://pub.dartlang.org"
+      sha256: "474f7d506230897a3cd28c965ec21c5328ae5605fc9c400cd330e9e9d6ac175c"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "8.2.2"
+  http:
+    dependency: transitive
+    description:
+      name: http
+      sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "8.0.9"
+    version: "0.13.6"
   http_parser:
     dependency: transitive
     description:
       name: http_parser
-      url: "https://pub.dartlang.org"
+      sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "4.0.0"
+    version: "4.0.2"
   image_picker:
     dependency: "direct main"
     description:
       name: image_picker
-      url: "https://pub.dartlang.org"
+      sha256: b6951e25b795d053a6ba03af5f710069c99349de9341af95155d52665cb4607c
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "0.8.9"
+  image_picker_android:
+    dependency: transitive
+    description:
+      name: image_picker_android
+      sha256: d2bab152deb2547ea6f53d82ebca9b7e77386bb706e5789e815d37e08ea475bb
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.6.6+5"
+    version: "0.8.7+3"
+  image_picker_for_web:
+    dependency: transitive
+    description:
+      name: image_picker_for_web
+      sha256: "869fe8a64771b7afbc99fc433a5f7be2fea4d1cb3d7c11a48b6b579eb9c797f0"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "2.2.0"
+  image_picker_ios:
+    dependency: transitive
+    description:
+      name: image_picker_ios
+      sha256: b3e2f21feb28b24dd73a35d7ad6e83f568337c70afab5eabac876e23803f264b
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "0.8.8"
+  image_picker_linux:
+    dependency: transitive
+    description:
+      name: image_picker_linux
+      sha256: "02cbc21fe1706b97942b575966e5fbbeaac535e76deef70d3a242e4afb857831"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "0.2.1"
+  image_picker_macos:
+    dependency: transitive
+    description:
+      name: image_picker_macos
+      sha256: cee2aa86c56780c13af2c77b5f2f72973464db204569e1ba2dd744459a065af4
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "0.2.1"
   image_picker_platform_interface:
     dependency: transitive
     description:
       name: image_picker_platform_interface
-      url: "https://pub.dartlang.org"
+      sha256: "7c7b96bb9413a9c28229e717e6fd1e3edd1cc5569c1778fcca060ecf729b65ee"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.0.0"
+    version: "2.8.0"
+  image_picker_windows:
+    dependency: transitive
+    description:
+      name: image_picker_windows
+      sha256: c3066601ea42113922232c7b7b3330a2d86f029f685bba99d82c30e799914952
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "0.2.1"
   js:
     dependency: transitive
     description:
       name: js
-      url: "https://pub.dartlang.org"
+      sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.6.3"
+    version: "0.6.5"
   lints:
     dependency: transitive
     description:
       name: lints
-      url: "https://pub.dartlang.org"
+      sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c
+      url: "https://pub.flutter-io.cn"
     source: hosted
     version: "1.0.1"
   matcher:
     dependency: transitive
     description:
       name: matcher
-      url: "https://pub.dartlang.org"
+      sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.12.11"
+    version: "0.12.13"
   material_color_utilities:
     dependency: transitive
     description:
       name: material_color_utilities
-      url: "https://pub.dartlang.org"
+      sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.1.3"
+    version: "0.2.0"
   meta:
     dependency: transitive
     description:
       name: meta
-      url: "https://pub.dartlang.org"
+      sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "1.8.0"
+  mime:
+    dependency: transitive
+    description:
+      name: mime
+      sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.7.0"
+    version: "1.0.4"
   path:
     dependency: transitive
     description:
       name: path
-      url: "https://pub.dartlang.org"
+      sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.8.0"
+    version: "1.8.2"
   path_provider_linux:
     dependency: transitive
     description:
       name: path_provider_linux
-      url: "https://pub.dartlang.org"
+      sha256: ffbb8cc9ed2c9ec0e4b7a541e56fd79b138e8f47d2fb86815f15358a349b3b57
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.1.5"
+    version: "2.1.11"
   path_provider_platform_interface:
     dependency: transitive
     description:
       name: path_provider_platform_interface
-      url: "https://pub.dartlang.org"
+      sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.0.0"
+    version: "2.0.6"
   path_provider_windows:
     dependency: transitive
     description:
       name: path_provider_windows
-      url: "https://pub.dartlang.org"
+      sha256: "1cb68ba4cd3a795033de62ba1b7b4564dace301f952de6bfb3cd91b202b6ee96"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.0.5"
+    version: "2.1.7"
   platform:
     dependency: transitive
     description:
       name: platform
-      url: "https://pub.dartlang.org"
+      sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
+      url: "https://pub.flutter-io.cn"
     source: hosted
     version: "3.1.0"
   plugin_platform_interface:
     dependency: transitive
     description:
       name: plugin_platform_interface
-      url: "https://pub.dartlang.org"
+      sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.0.3"
-  process:
-    dependency: transitive
-    description:
-      name: process
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "4.2.3"
+    version: "2.1.4"
   protobuf:
     dependency: transitive
     description:
       name: protobuf
-      url: "https://pub.dartlang.org"
+      sha256: "01dd9bd0fa02548bf2ceee13545d4a0ec6046459d847b6b061d8a27237108a08"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.0.1"
+    version: "2.1.0"
   rxdart:
     dependency: transitive
     description:
       name: rxdart
-      url: "https://pub.dartlang.org"
+      sha256: "2ef8b4e91cb3b55d155e0e34eeae0ac7107974e451495c955ac04ddee8cc21fd"
+      url: "https://pub.flutter-io.cn"
     source: hosted
     version: "0.26.0"
   shared_preferences:
     dependency: "direct main"
     description:
       name: shared_preferences
-      url: "https://pub.dartlang.org"
+      sha256: "0344316c947ffeb3a529eac929e1978fcd37c26be4e8468628bac399365a3ca1"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.0.7"
-  shared_preferences_linux:
+    version: "2.2.0"
+  shared_preferences_android:
     dependency: transitive
     description:
-      name: shared_preferences_linux
-      url: "https://pub.dartlang.org"
+      name: shared_preferences_android
+      sha256: fe8401ec5b6dcd739a0fe9588802069e608c3fdbfd3c3c93e546cf2f90438076
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.0.4"
-  shared_preferences_macos:
+    version: "2.2.0"
+  shared_preferences_foundation:
     dependency: transitive
     description:
-      name: shared_preferences_macos
-      url: "https://pub.dartlang.org"
+      name: shared_preferences_foundation
+      sha256: f39696b83e844923b642ce9dd4bd31736c17e697f6731a5adf445b1274cf3cd4
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.0.2"
+    version: "2.3.2"
+  shared_preferences_linux:
+    dependency: transitive
+    description:
+      name: shared_preferences_linux
+      sha256: "71d6806d1449b0a9d4e85e0c7a917771e672a3d5dc61149cc9fac871115018e1"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "2.3.0"
   shared_preferences_platform_interface:
     dependency: transitive
     description:
       name: shared_preferences_platform_interface
-      url: "https://pub.dartlang.org"
+      sha256: "23b052f17a25b90ff2b61aad4cc962154da76fb62848a9ce088efe30d7c50ab1"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.0.0"
+    version: "2.3.0"
   shared_preferences_web:
     dependency: transitive
     description:
       name: shared_preferences_web
-      url: "https://pub.dartlang.org"
+      sha256: "7347b194fb0bbeb4058e6a4e87ee70350b6b2b90f8ac5f8bd5b3a01548f6d33a"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.0.3"
+    version: "2.2.0"
   shared_preferences_windows:
     dependency: transitive
     description:
       name: shared_preferences_windows
-      url: "https://pub.dartlang.org"
+      sha256: f95e6a43162bce43c9c3405f3eb6f39e5b5d11f65fab19196cf8225e2777624d
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.0.4"
+    version: "2.3.0"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -319,79 +457,114 @@ packages:
     dependency: transitive
     description:
       name: source_span
-      url: "https://pub.dartlang.org"
+      sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.8.1"
+    version: "1.9.1"
   stack_trace:
     dependency: transitive
     description:
       name: stack_trace
-      url: "https://pub.dartlang.org"
+      sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.10.0"
+    version: "1.11.0"
   stream_channel:
     dependency: transitive
     description:
       name: stream_channel
-      url: "https://pub.dartlang.org"
+      sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.1.0"
+    version: "2.1.1"
   string_scanner:
     dependency: transitive
     description:
       name: string_scanner
-      url: "https://pub.dartlang.org"
+      sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.1.0"
+    version: "1.2.0"
   term_glyph:
     dependency: transitive
     description:
       name: term_glyph
-      url: "https://pub.dartlang.org"
+      sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.2.0"
+    version: "1.2.1"
   test_api:
     dependency: transitive
     description:
       name: test_api
-      url: "https://pub.dartlang.org"
+      sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.4.8"
+    version: "0.4.16"
   typed_data:
     dependency: transitive
     description:
       name: typed_data
-      url: "https://pub.dartlang.org"
+      sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.3.0"
+    version: "1.3.2"
   vector_math:
     dependency: transitive
     description:
       name: vector_math
-      url: "https://pub.dartlang.org"
+      sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.1.1"
+    version: "2.1.4"
   webview_flutter:
     dependency: "direct main"
     description:
       name: webview_flutter
-      url: "https://pub.dartlang.org"
+      sha256: "789d52bd789373cc1e100fb634af2127e86c99cf9abde09499743270c5de8d00"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.3.24"
+    version: "4.2.2"
+  webview_flutter_android:
+    dependency: transitive
+    description:
+      name: webview_flutter_android
+      sha256: "27ad6a99c4b2d5e1ffd2b993a10f738b6b4979f139b4d64c34ac511595fcd748"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "3.9.0"
+  webview_flutter_platform_interface:
+    dependency: transitive
+    description:
+      name: webview_flutter_platform_interface
+      sha256: "564ef378cafc1a0e29f1d76ce175ef517a0a6115875dff7b43fccbef2b0aeb30"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "2.4.0"
+  webview_flutter_wkwebview:
+    dependency: transitive
+    description:
+      name: webview_flutter_wkwebview
+      sha256: "369fdf6160944a7db660ff15fa048c2bd681b09557907beaef1f95e8557d21dc"
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "3.7.0"
   win32:
     dependency: transitive
     description:
       name: win32
-      url: "https://pub.dartlang.org"
+      sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c"
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.2.10"
+    version: "4.1.4"
   xdg_directories:
     dependency: transitive
     description:
       name: xdg_directories
-      url: "https://pub.dartlang.org"
+      sha256: e0b1147eec179d3911f1f19b59206448f78195ca1d20514134e10641b7d7fbff
+      url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.2.0+1"
+    version: "1.0.1"
 sdks:
-  dart: ">=2.14.0 <3.0.0"
-  flutter: ">=2.0.0"
+  dart: ">=2.19.0 <3.0.0"
+  flutter: ">=3.3.0"

+ 9 - 9
pubspec.yaml

@@ -1,22 +1,22 @@
 name: flutter_tracker
 description: 追踪者app.
 publish_to: 'none' # Remove this line if you wish to publish to pub.dev
-version: 1.0.0+1
+version: 1.1.1+1
 environment:
   sdk: ">=2.17.6 <3.0.0"
 
 dependencies:
   flutter:
     sdk: flutter
-  cupertino_icons: ^1.0.3
-  dio: ^4.0.0
-  shared_preferences: ^2.0.7
-  fluttertoast: ^8.0.8
-  flutter_screenutil: ^5.0.0+2
-  image_picker: ^0.6.3+4
-  file_picker: ^2.1.7
+  cupertino_icons: ^1.0.5
+  dio: ^5.1.2
+  shared_preferences: ^2.1.2
+  fluttertoast: ^8.2.2
+  flutter_screenutil: ^5.5.4
+  image_picker: ^0.8.9
+  file_picker: ^5.3.1
   flutter_blue: ^0.8.0
-  webview_flutter: ^0.3.24
+  webview_flutter: ^4.2.2
   
 dev_dependencies:
   flutter_test:

+ 5 - 2
test/widget_test.dart

@@ -9,13 +9,16 @@ import 'package:flutter/material.dart';
 import 'package:flutter_test/flutter_test.dart';
 
 import 'package:flutter_tracker/main.dart';
-/// Description: 
+
+/// Description:
 /// Time       : 2021年12月03日 Friday
 /// Author     : liuyuqi.gov@msncn
 void main() {
   testWidgets('Counter increments smoke test', (WidgetTester tester) async {
     // Build our app and trigger a frame.
-    await tester.pumpWidget(MyApp());
+    await tester.pumpWidget(MyApp(
+      isLogin: false,
+    ));
 
     // Verify that our counter starts at 0.
     expect(find.text('0'), findsOneWidget);