146 lines
4.3 KiB
Dart
146 lines
4.3 KiB
Dart
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';
|
|
|
|
class RegionProvider extends ChangeNotifier {
|
|
RegionProvider() {
|
|
loadRegionData();
|
|
}
|
|
|
|
String _provinceName = '';
|
|
String _cityName = '';
|
|
String _tempProvinceName = '';
|
|
String _tempCityName = '';
|
|
double _declination = 0.0;
|
|
double _tempDeclination = 0.0;
|
|
|
|
Database db;
|
|
|
|
String get provinceName => _provinceName;
|
|
|
|
String get cityName => _cityName;
|
|
|
|
String get tempProvinceName => _tempProvinceName;
|
|
|
|
String get tempCityName => _tempCityName;
|
|
|
|
double get tempDeclination => _tempDeclination;
|
|
|
|
double get declination => _declination;
|
|
|
|
final Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
|
|
|
|
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<String> cityCode = Address.getCityCodeByName(
|
|
provinceName: _provinceName, cityName: _cityName);
|
|
if (cityCode.length == 2) {
|
|
List<Map<String, Object>> 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();
|
|
}
|
|
}
|
|
|
|
Future<Database> 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<int> 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<String> cityCode = Address.getCityCodeByName(
|
|
provinceName: _tempProvinceName, cityName: _tempCityName);
|
|
print(cityCode);
|
|
if (cityCode.length == 2) {
|
|
List<Map<String, Object>> 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) {}
|
|
|
|
//将临时变量保存到正式变量,并保存本地
|
|
void saveRegion() {
|
|
_provinceName = _tempProvinceName;
|
|
_cityName = _tempCityName;
|
|
_declination = _tempDeclination;
|
|
print(_tempCityName);
|
|
final region = <String, dynamic>{
|
|
"provinceName": _tempProvinceName,
|
|
'cityName': _tempCityName,
|
|
// 'declination': _tempDeclination
|
|
};
|
|
_prefs.then((prefs) {
|
|
prefs.setString('REGION', jsonEncode(region));
|
|
});
|
|
notifyListeners();
|
|
}
|
|
|
|
// 覆盖临时的变量
|
|
void resetTemp() async {
|
|
_tempProvinceName = _provinceName;
|
|
_tempCityName = _cityName;
|
|
_tempDeclination = _declination;
|
|
notifyListeners();
|
|
}
|
|
|
|
// 将临时的省市名设为空
|
|
void clearTemp() {
|
|
_tempProvinceName = '';
|
|
_tempCityName = '';
|
|
_tempDeclination = 0.0;
|
|
notifyListeners();
|
|
}
|
|
}
|