From c7ccf28e9f8fd70282bf904c1173ebe9b3e630f3 Mon Sep 17 00:00:00 2001 From: cxc Date: Thu, 30 Jun 2022 17:01:04 +0800 Subject: [PATCH] sqllite database save magnetic declination data --- assets/magnetic_declination.db | Bin 0 -> 192512 bytes lib/components/region_selector.dart | 100 ++------------------------ lib/main.dart | 52 +++++++------- lib/net/dio_utils.dart | 29 ++++---- lib/pages/compass_page.dart | 2 +- lib/pages/login_page.dart | 6 +- lib/pages/personal_login_page.dart | 12 ++-- lib/states/region.dart | 104 +++++++++++++++++++++++----- lib/states/token.dart | 8 ++- pubspec.lock | 23 +++++- pubspec.yaml | 3 + 11 files changed, 173 insertions(+), 166 deletions(-) create mode 100644 assets/magnetic_declination.db diff --git a/assets/magnetic_declination.db b/assets/magnetic_declination.db new file mode 100644 index 0000000000000000000000000000000000000000..fc6fc054776c5e567d3f73bb44e55443c4c75d91 GIT binary patch literal 192512 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 literal 0 HcmV?d00001 diff --git a/lib/components/region_selector.dart b/lib/components/region_selector.dart index c5cd852..6069565 100644 --- a/lib/components/region_selector.dart +++ b/lib/components/region_selector.dart @@ -71,100 +71,14 @@ class RegionSelector extends StatelessWidget { ], )), ), + const SizedBox( + height: 20, + ), + Text( + '磁偏角 : ${regionProvider.tempDeclination}°', + style: const TextStyle(fontSize: 24), + ) ], ))); } } - -// class RegionSelector extends StatefulWidget { -// const RegionSelector({Key key}) : super(key: key); -// -// @override -// State createState() => _RegionSelectorState(); -// } -// -// class _RegionSelectorState extends State { -// final Future _prefs = SharedPreferences.getInstance(); -// -// // final rp = RegionProvider() -// String provinceName; -// String cityName; -// -// @override -// initState() { -// // provinceName = Provider.of(context).provinceName; -// // cityName = Provider.of(context).cityName; -// _prefs.then((prefs) { -// if (prefs.getString('REGION') != null) { -// final region = -// RegionData.fromJson(jsonDecode(prefs.getString('REGION'))); -// provinceName = region.provinceName; -// cityName = region.cityName; -// } -// }); -// } -// -// // 拼接城市 -// String spliceCityName(String pname, String cname) { -// if (pname == '') return '未选择城市'; -// StringBuffer sb = StringBuffer(); -// sb.write(pname); -// if (cname == '') return sb.toString(); -// sb.write(' - '); -// sb.write(cname); -// return sb.toString(); -// } -// -// @override -// Widget build(BuildContext context) { -// return SizedBox( -// height: 100, -// child: Consumer( -// builder: (context, regionProvider, child) => Column( -// children: [ -// InkWell( -// onTap: () { -// Pickers.showAddressPicker(context, -// addAllItem: false, -// initProvince: regionProvider.provinceName, -// initCity: regionProvider.cityName, -// onConfirm: (p, c, t) { -// regionProvider.updateRegion(p, c); -// setState(() { -// provinceName = p; -// cityName = c; -// }); -// }); -// }, -// child: Container( -// constraints: const BoxConstraints(minHeight: 42), -// padding: const EdgeInsets.fromLTRB(10, 0, 12, 0), -// decoration: BoxDecoration( -// border: Border.all(color: Colors.grey), -// borderRadius: BorderRadius.circular(6), -// ), -// child: Row( -// // mainAxisSize: MainAxisSize.min, -// mainAxisAlignment: MainAxisAlignment.spaceBetween, -// crossAxisAlignment: CrossAxisAlignment.center, -// children: [ -// Text(spliceCityName(regionProvider.provinceName, -// regionProvider.cityName)), -// // SizedBox(width: 8), -// Row( -// children: [ -// InkWell( -// child: Icon(Icons.close, -// size: 20, color: Colors.grey[500]), -// onTap: () {}), -// Icon(Icons.keyboard_arrow_down, -// size: 28, color: Colors.grey[500]), -// ], -// ) -// ], -// )), -// ), -// ], -// ))); -// } -// } diff --git a/lib/main.dart b/lib/main.dart index 391d61b..7d6224d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,17 +10,7 @@ import 'package:provider/provider.dart'; void main() { ///屏幕刷新率和显示率不一致时的优化 // GestureBinding.instance.resamplingEnabled = true; - runApp( - MultiProvider( - providers: [ - ChangeNotifierProvider( - create: (context) => RegionProvider(), - ), - ChangeNotifierProvider(create: (context) => TokenProvider()), - ], - child: const MyApp(), - ), - ); + runApp(const MyApp()); } class MyApp extends StatelessWidget { @@ -29,23 +19,31 @@ class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { - return MaterialApp( - title: '风水罗盘', - theme: ThemeData( - primarySwatch: createMaterialColor(const Color(0xCFA77300)), + return MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (context) => RegionProvider(), + ), + ChangeNotifierProvider(create: (context) => TokenProvider()), + ], + child: MaterialApp( + title: '风水罗盘', + theme: ThemeData( + primarySwatch: createMaterialColor(const Color(0xCFA77300)), + ), + debugShowCheckedModeBanner: false, + home: const BottomNavigationWidget(), + localizationsDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + supportedLocales: const [ + //此处 + Locale('zh'), + Locale('en'), + ], ), - debugShowCheckedModeBanner: false, - home: const BottomNavigationWidget(), - localizationsDelegates: const [ - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - ], - supportedLocales: const [ - //此处 - Locale('zh'), - Locale('en'), - ], ); } } diff --git a/lib/net/dio_utils.dart b/lib/net/dio_utils.dart index f363143..540d3a8 100644 --- a/lib/net/dio_utils.dart +++ b/lib/net/dio_utils.dart @@ -21,10 +21,10 @@ class DioUtils { bool isProxy = false; //网络代理地址 - String proxyIp = "192.168.0.107"; + String proxyIp = "10.0.2.2"; //网络代理端口 - String proxyPort = "8888"; + String proxyPort = "7890"; DioUtils._internal() { BaseOptions options = new BaseOptions(); @@ -135,8 +135,8 @@ class DioUtils { // _dio.options.headers["content-type"]="multipart/form-data"; //发起post请求 try { - Response response = await _dio.post(url, - data: form ?? jsonMap, cancelToken: cancelTag); + Response response = + await _dio.post(url, data: form ?? jsonMap, cancelToken: cancelTag); //响应数据 dynamic responseData = response.data; @@ -216,8 +216,8 @@ class DioUtils { // _dio.options.headers["content-type"]="multipart/form-data"; //发起post请求 try { - Response response = await _dio.post(url, - data: form ?? jsonMap, cancelToken: cancelTag); + Response response = + await _dio.post(url, data: form ?? jsonMap, cancelToken: cancelTag); //响应数据 dynamic responseData = response.data; @@ -260,15 +260,15 @@ class DioUtils { loginInfo.msg = "响应超时"; break; case DioErrorType.response: - // 响应错误 + // 响应错误 loginInfo.msg = "响应错误"; break; case DioErrorType.cancel: - // 取消操作 + // 取消操作 loginInfo.msg = "已取消"; break; case DioErrorType.other: - // 默认自定义其他异常 + // 默认自定义其他异常 loginInfo.msg = "网络请求异常"; break; } @@ -316,8 +316,10 @@ class LoginInfo { String msg; String token; - LoginInfo({this.success = true, this.code = 200, this.token, this.msg="登陆成功"}); - LoginInfo.error({this.success = false, this.code = 201, this.msg="请求异常"}); + LoginInfo( + {this.success = true, this.code = 200, this.token, this.msg = "登陆成功"}); + + LoginInfo.error({this.success = false, this.code = 201, this.msg = "请求异常"}); } class RegisterInfo { @@ -325,7 +327,8 @@ class RegisterInfo { int code; String msg; + RegisterInfo({this.success = true, this.code = 200, this.msg = "注册成功"}); - RegisterInfo({this.success = true, this.code = 200, this.msg="注册成功"}); - RegisterInfo.error({this.success = false, this.code = 201, this.msg="请求异常"}); + RegisterInfo.error( + {this.success = false, this.code = 201, this.msg = "请求异常"}); } diff --git a/lib/pages/compass_page.dart b/lib/pages/compass_page.dart index fb05662..1653268 100644 --- a/lib/pages/compass_page.dart +++ b/lib/pages/compass_page.dart @@ -268,7 +268,7 @@ class _CompassState extends State { context: context, builder: (BuildContext context) { return AlertDialog( - title: Text('选择城市校准磁偏角'), + title: const Text('选择城市校准磁偏角'), content: RegionSelector(), actions: [ TextButton( diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 9be9a6c..2ff33c1 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -188,8 +188,8 @@ class _LoginPageState extends State { if (userName.trim().length != 11) { Fluttertoast.showToast( msg: "请输入11位手机号", - backgroundColor: Colors.red, - textColor: Colors.orange, + backgroundColor: Colors.orange, + textColor: Colors.white, fontSize: 20.0); return; } @@ -218,7 +218,7 @@ class _LoginPageState extends State { if (responseInfo.success) { Map res = {"token": responseInfo.token.toString()}; LoginBean loginBean = LoginBean.fromMap(res); - TokenHelper.getInstance.loginBean = loginBean; + // TokenHelper.getInstance.loginBean = loginBean; // 将token添加到状态管理器中 Provider.of(context, listen: false).setToken(loginBean); Fluttertoast.showToast(msg: "登录成功"); diff --git a/lib/pages/personal_login_page.dart b/lib/pages/personal_login_page.dart index 5186699..698b04d 100644 --- a/lib/pages/personal_login_page.dart +++ b/lib/pages/personal_login_page.dart @@ -21,13 +21,13 @@ class _PersonalLoginPageState extends State { return Scaffold( appBar: AppBar( - title: Text("个人中心"), + title: const Text("个人中心"), ), body: Container( width: double.infinity, child: Column( children: [ - Padding(padding: EdgeInsets.only(top: 80)), + const Padding(padding: EdgeInsets.only(top: 80)), SizedBox( height: 120, child: ClipRRect( @@ -35,15 +35,15 @@ class _PersonalLoginPageState extends State { child: Image.asset("assets/images/ic_launcher.png"), ), ), - Padding(padding: EdgeInsets.only(top: 30)), + const Padding(padding: EdgeInsets.only(top: 30)), ListTile( - title: Text("关于我们"), + title: const Text("关于我们"), trailing: const Icon(Icons.arrow_forward_ios_sharp), leading: const Icon(Icons.account_circle), onTap: () {}, ), ListTile( - title: Text("退出登陆"), + title: const Text("退出登陆"), trailing: const Icon(Icons.arrow_forward_ios_sharp), leading: const Icon(Icons.cancel_rounded), onTap: () async { @@ -74,7 +74,7 @@ class _PersonalLoginPageState extends State { }); if (isExit) { - TokenHelper.getInstance.clear(); + // TokenHelper.getInstance.clear(); //在状态管理器中清除token Provider.of(context, listen: false) .clearToken(); diff --git a/lib/states/region.dart b/lib/states/region.dart index fe32ba4..464caa7 100644 --- a/lib/states/region.dart +++ b/lib/states/region.dart @@ -1,7 +1,13 @@ import 'dart:convert'; +import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_pickers/address_picker/locations_data.dart'; +import 'package:path/path.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:sqflite/sqflite.dart'; import '../models/region.dart'; @@ -14,6 +20,10 @@ class RegionProvider extends ChangeNotifier { String _cityName = ''; String _tempProvinceName = ''; String _tempCityName = ''; + double _declination = 0.0; + double _tempDeclination = 0.0; + + Database db; String get provinceName => _provinceName; @@ -23,39 +33,93 @@ class RegionProvider extends ChangeNotifier { String get tempCityName => _tempCityName; + double get tempDeclination => _tempDeclination; + + double get declination => _declination; + final Future _prefs = SharedPreferences.getInstance(); - loadRegionData() { - _prefs.then((prefs) { - if (prefs.getString('REGION') != null) { - final region = - RegionData.fromJson(jsonDecode(prefs.getString('REGION'))); - _provinceName = region.provinceName; - _cityName = region.cityName; - _tempProvinceName = region.provinceName; - _tempCityName = region.cityName; - notifyListeners(); + loadRegionData() async { + db = await loadDatabase(); + final prefs = await _prefs; + if (prefs.getString('REGION') != null) { + final region = RegionData.fromJson(jsonDecode(prefs.getString('REGION'))); + _provinceName = region.provinceName; + _cityName = region.cityName; + _tempProvinceName = region.provinceName; + _tempCityName = region.cityName; + // WidgetsFlutterBinding.ensureInitialized(); + List cityCode = Address.getCityCodeByName( + provinceName: _provinceName, cityName: _cityName); + if (cityCode.length == 2) { + List> decMap = await db.rawQuery( + "SELECT declination FROM magnetic_declination WHERE cityId == ${cityCode[1]}"); + _declination = decMap[0]['declination']; + _tempDeclination = decMap[0]['declination']; + } else { + _declination = 0.0; + _tempDeclination = 0.0; } - }); + + notifyListeners(); + } } - updateRegion(pname, cname) { - // _provinceName = pname; - // _cityName = cname; + Future loadDatabase() async { + var databasesPath = await getDatabasesPath(); + var path = join(databasesPath, "magnetic_declination.db"); + var exists = await databaseExists(path); + if (!exists) { + print("Creating new copy from asset"); + try { + await Directory(dirname(path)).create(recursive: true); + } catch (_) {} + // Copy from asset + ByteData data = + await rootBundle.load(join("assets", "magnetic_declination.db")); + List bytes = + data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + // Write and flush the bytes written + await File(path).writeAsBytes(bytes, flush: true); + } else { + print("Opening existing database"); + } +// open the database + Database _db = await openDatabase(path, readOnly: true); + return _db; + } + + // 存储临时的省市名称,不会保存本地 + void updateRegion(pname, cname) async { _tempProvinceName = pname; _tempCityName = cname; - + List cityCode = Address.getCityCodeByName( + provinceName: _tempProvinceName, cityName: _tempCityName); + print(cityCode); + if (cityCode.length == 2) { + List> decMap = await db.rawQuery( + "SELECT declination FROM magnetic_declination WHERE cityId == ${cityCode[1]}"); + print(decMap); + _tempDeclination = decMap[0]['declination']; + } else { + _tempDeclination = 0.0; + } notifyListeners(); } + //更新磁偏角 + void updateDeclination(pname, cname) {} + //将临时变量保存到正式变量,并保存本地 - saveRegion() { + void saveRegion() { _provinceName = _tempProvinceName; _cityName = _tempCityName; + _declination = _tempDeclination; print(_tempCityName); final region = { "provinceName": _tempProvinceName, - 'cityName': _tempCityName + 'cityName': _tempCityName, + // 'declination': _tempDeclination }; _prefs.then((prefs) { prefs.setString('REGION', jsonEncode(region)); @@ -64,16 +128,18 @@ class RegionProvider extends ChangeNotifier { } // 覆盖临时的变量 - resetTemp() async { + void resetTemp() async { _tempProvinceName = _provinceName; _tempCityName = _cityName; + _tempDeclination = _declination; notifyListeners(); } // 将临时的省市名设为空 - clearTemp() { + void clearTemp() { _tempProvinceName = ''; _tempCityName = ''; + _tempDeclination = 0.0; notifyListeners(); } } diff --git a/lib/states/token.dart b/lib/states/token.dart index 0a44375..0d9cc73 100644 --- a/lib/states/token.dart +++ b/lib/states/token.dart @@ -12,7 +12,7 @@ class TokenProvider extends ChangeNotifier { bool get isLogin => _loginBean != null; - loadToken() { + void loadToken() { Map map = SPUtil.getObject("token_bean"); if (map != null) { //加载缓存 @@ -21,13 +21,15 @@ class TokenProvider extends ChangeNotifier { notifyListeners(); } - clearToken() { + void clearToken() { _loginBean = null; + SPUtil.remove("token_bean"); notifyListeners(); } - setToken(LoginBean lb) { + void setToken(LoginBean lb) { _loginBean = lb; + SPUtil.saveObject("token_bean", lb); notifyListeners(); } } diff --git a/pubspec.lock b/pubspec.lock index 6d74914..d225852 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -192,7 +192,7 @@ packages: source: hosted version: "2.0.2" path: - dependency: transitive + dependency: "direct main" description: name: path url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" @@ -315,6 +315,20 @@ packages: url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.8.2" + sqflite: + dependency: "direct main" + description: + name: sqflite + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + source: hosted + version: "2.0.2+1" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + source: hosted + version: "2.2.1+1" stack_trace: dependency: transitive description: @@ -343,6 +357,13 @@ packages: url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.1.0" + synchronized: + dependency: transitive + description: + name: synchronized + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + source: hosted + version: "3.0.0+2" term_glyph: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5b7fa74..b2e8307 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,6 +32,8 @@ dependencies: url: https://gitee.com/liang-fu/flutter_serial_port_api.git flutter_pickers: ^2.1.9 provider: ^6.0.3 + sqflite: ^2.0.2+1 + path: ^1.8.1 dev_dependencies: flutter_test: @@ -52,6 +54,7 @@ flutter: - assets/index.html - assets/test.js - assets/images/ + - assets/magnetic_declination.db fonts: - family: iconfont # 从 iconfont.json 中获取