Merge branch 'flutterflow'
This commit is contained in:
commit
dbb83b723c
|
@ -44,8 +44,8 @@
|
||||||
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
6436409727A31CD800820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
6436409327A31CD100820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||||
6436409427A31CDB00820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
6436409927A31CD000820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
@ -225,8 +225,8 @@
|
||||||
6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
|
6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
|
||||||
isa = PBXVariantGroup;
|
isa = PBXVariantGroup;
|
||||||
children = (
|
children = (
|
||||||
6436409727A31CD800820AF7 /* pt */,
|
6436409327A31CD100820AF7 /* pt */,
|
||||||
6436409427A31CDB00820AF7 /* en */,
|
6436409927A31CD000820AF7 /* en */,
|
||||||
);
|
);
|
||||||
name = InfoPlist.strings;
|
name = InfoPlist.strings;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
|
|
@ -151,8 +151,12 @@ Future singInActionApp(
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
FFAppState().deleteEmail();
|
||||||
FFAppState().email = '';
|
FFAppState().email = '';
|
||||||
|
|
||||||
|
FFAppState().deletePasswd();
|
||||||
FFAppState().passwd = '';
|
FFAppState().passwd = '';
|
||||||
|
|
||||||
FFAppState().update(() {});
|
FFAppState().update(() {});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||||
|
import 'package:csv/csv.dart';
|
||||||
|
import 'package:synchronized/synchronized.dart';
|
||||||
|
|
||||||
class FFAppState extends ChangeNotifier {
|
class FFAppState extends ChangeNotifier {
|
||||||
static FFAppState _instance = FFAppState._internal();
|
static FFAppState _instance = FFAppState._internal();
|
||||||
|
@ -15,36 +17,45 @@ class FFAppState extends ChangeNotifier {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future initializePersistedState() async {
|
Future initializePersistedState() async {
|
||||||
prefs = await SharedPreferences.getInstance();
|
secureStorage = const FlutterSecureStorage();
|
||||||
_safeInit(() {
|
await _safeInitAsync(() async {
|
||||||
_cliUUID = prefs.getString('ff_cliUUID') ?? _cliUUID;
|
_cliUUID = await secureStorage.getString('ff_cliUUID') ?? _cliUUID;
|
||||||
});
|
});
|
||||||
_safeInit(() {
|
await _safeInitAsync(() async {
|
||||||
_ownerUUID = prefs.getString('ff_ownerUUID') ?? _ownerUUID;
|
_ownerUUID = await secureStorage.getString('ff_ownerUUID') ?? _ownerUUID;
|
||||||
});
|
});
|
||||||
_safeInit(() {
|
await _safeInitAsync(() async {
|
||||||
_userUUID = prefs.getString('ff_userUUID') ?? _userUUID;
|
_userUUID = await secureStorage.getString('ff_userUUID') ?? _userUUID;
|
||||||
});
|
});
|
||||||
_safeInit(() {
|
await _safeInitAsync(() async {
|
||||||
_devUUID = prefs.getString('ff_devUUID') ?? _devUUID;
|
_devUUID = await secureStorage.getString('ff_devUUID') ?? _devUUID;
|
||||||
});
|
});
|
||||||
_safeInit(() {
|
await _safeInitAsync(() async {
|
||||||
_email = prefs.getString('ff_email') ?? _email;
|
_email = await secureStorage.getString('ff_email') ?? _email;
|
||||||
});
|
});
|
||||||
_safeInit(() {
|
await _safeInitAsync(() async {
|
||||||
_passwd = prefs.getString('ff_passwd') ?? _passwd;
|
_passwd = await secureStorage.getString('ff_passwd') ?? _passwd;
|
||||||
});
|
});
|
||||||
_safeInit(() {
|
await _safeInitAsync(() async {
|
||||||
_device = prefs.getString('ff_device') ?? _device;
|
_device = await secureStorage.getString('ff_device') ?? _device;
|
||||||
});
|
});
|
||||||
_safeInit(() {
|
await _safeInitAsync(() async {
|
||||||
_isLogged = prefs.getBool('ff_isLogged') ?? _isLogged;
|
_isLogged = await secureStorage.getBool('ff_isLogged') ?? _isLogged;
|
||||||
});
|
});
|
||||||
_safeInit(() {
|
await _safeInitAsync(() async {
|
||||||
_local = prefs.getString('ff_local') ?? _local;
|
_local = await secureStorage.getString('ff_local') ?? _local;
|
||||||
});
|
});
|
||||||
_safeInit(() {
|
await _safeInitAsync(() async {
|
||||||
_token = prefs.getString('ff_token') ?? _token;
|
_token = await secureStorage.getString('ff_token') ?? _token;
|
||||||
|
});
|
||||||
|
await _safeInitAsync(() async {
|
||||||
|
_createdAt = await secureStorage.getString('ff_createdAt') ?? _createdAt;
|
||||||
|
});
|
||||||
|
await _safeInitAsync(() async {
|
||||||
|
_updatedAt = await secureStorage.getString('ff_updatedAt') ?? _updatedAt;
|
||||||
|
});
|
||||||
|
await _safeInitAsync(() async {
|
||||||
|
_status = await secureStorage.getString('ff_status') ?? _status;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,76 +64,149 @@ class FFAppState extends ChangeNotifier {
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
late SharedPreferences prefs;
|
late FlutterSecureStorage secureStorage;
|
||||||
|
|
||||||
String _cliUUID = '';
|
String _cliUUID = '';
|
||||||
String get cliUUID => _cliUUID;
|
String get cliUUID => _cliUUID;
|
||||||
set cliUUID(String value) {
|
set cliUUID(String value) {
|
||||||
_cliUUID = value;
|
_cliUUID = value;
|
||||||
prefs.setString('ff_cliUUID', value);
|
secureStorage.setString('ff_cliUUID', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteCliUUID() {
|
||||||
|
secureStorage.delete(key: 'ff_cliUUID');
|
||||||
}
|
}
|
||||||
|
|
||||||
String _ownerUUID = '';
|
String _ownerUUID = '';
|
||||||
String get ownerUUID => _ownerUUID;
|
String get ownerUUID => _ownerUUID;
|
||||||
set ownerUUID(String value) {
|
set ownerUUID(String value) {
|
||||||
_ownerUUID = value;
|
_ownerUUID = value;
|
||||||
prefs.setString('ff_ownerUUID', value);
|
secureStorage.setString('ff_ownerUUID', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteOwnerUUID() {
|
||||||
|
secureStorage.delete(key: 'ff_ownerUUID');
|
||||||
}
|
}
|
||||||
|
|
||||||
String _userUUID = '';
|
String _userUUID = '';
|
||||||
String get userUUID => _userUUID;
|
String get userUUID => _userUUID;
|
||||||
set userUUID(String value) {
|
set userUUID(String value) {
|
||||||
_userUUID = value;
|
_userUUID = value;
|
||||||
prefs.setString('ff_userUUID', value);
|
secureStorage.setString('ff_userUUID', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteUserUUID() {
|
||||||
|
secureStorage.delete(key: 'ff_userUUID');
|
||||||
}
|
}
|
||||||
|
|
||||||
String _devUUID = '';
|
String _devUUID = '';
|
||||||
String get devUUID => _devUUID;
|
String get devUUID => _devUUID;
|
||||||
set devUUID(String value) {
|
set devUUID(String value) {
|
||||||
_devUUID = value;
|
_devUUID = value;
|
||||||
prefs.setString('ff_devUUID', value);
|
secureStorage.setString('ff_devUUID', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteDevUUID() {
|
||||||
|
secureStorage.delete(key: 'ff_devUUID');
|
||||||
}
|
}
|
||||||
|
|
||||||
String _email = '';
|
String _email = '';
|
||||||
String get email => _email;
|
String get email => _email;
|
||||||
set email(String value) {
|
set email(String value) {
|
||||||
_email = value;
|
_email = value;
|
||||||
prefs.setString('ff_email', value);
|
secureStorage.setString('ff_email', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteEmail() {
|
||||||
|
secureStorage.delete(key: 'ff_email');
|
||||||
}
|
}
|
||||||
|
|
||||||
String _passwd = '';
|
String _passwd = '';
|
||||||
String get passwd => _passwd;
|
String get passwd => _passwd;
|
||||||
set passwd(String value) {
|
set passwd(String value) {
|
||||||
_passwd = value;
|
_passwd = value;
|
||||||
prefs.setString('ff_passwd', value);
|
secureStorage.setString('ff_passwd', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deletePasswd() {
|
||||||
|
secureStorage.delete(key: 'ff_passwd');
|
||||||
}
|
}
|
||||||
|
|
||||||
String _device = '';
|
String _device = '';
|
||||||
String get device => _device;
|
String get device => _device;
|
||||||
set device(String value) {
|
set device(String value) {
|
||||||
_device = value;
|
_device = value;
|
||||||
prefs.setString('ff_device', value);
|
secureStorage.setString('ff_device', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteDevice() {
|
||||||
|
secureStorage.delete(key: 'ff_device');
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _isLogged = false;
|
bool _isLogged = false;
|
||||||
bool get isLogged => _isLogged;
|
bool get isLogged => _isLogged;
|
||||||
set isLogged(bool value) {
|
set isLogged(bool value) {
|
||||||
_isLogged = value;
|
_isLogged = value;
|
||||||
prefs.setBool('ff_isLogged', value);
|
secureStorage.setBool('ff_isLogged', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteIsLogged() {
|
||||||
|
secureStorage.delete(key: 'ff_isLogged');
|
||||||
}
|
}
|
||||||
|
|
||||||
String _local = '';
|
String _local = '';
|
||||||
String get local => _local;
|
String get local => _local;
|
||||||
set local(String value) {
|
set local(String value) {
|
||||||
_local = value;
|
_local = value;
|
||||||
prefs.setString('ff_local', value);
|
secureStorage.setString('ff_local', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteLocal() {
|
||||||
|
secureStorage.delete(key: 'ff_local');
|
||||||
}
|
}
|
||||||
|
|
||||||
String _token = '';
|
String _token = '';
|
||||||
String get token => _token;
|
String get token => _token;
|
||||||
set token(String value) {
|
set token(String value) {
|
||||||
_token = value;
|
_token = value;
|
||||||
prefs.setString('ff_token', value);
|
secureStorage.setString('ff_token', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteToken() {
|
||||||
|
secureStorage.delete(key: 'ff_token');
|
||||||
|
}
|
||||||
|
|
||||||
|
String _createdAt = '';
|
||||||
|
String get createdAt => _createdAt;
|
||||||
|
set createdAt(String value) {
|
||||||
|
_createdAt = value;
|
||||||
|
secureStorage.setString('ff_createdAt', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteCreatedAt() {
|
||||||
|
secureStorage.delete(key: 'ff_createdAt');
|
||||||
|
}
|
||||||
|
|
||||||
|
String _updatedAt = '';
|
||||||
|
String get updatedAt => _updatedAt;
|
||||||
|
set updatedAt(String value) {
|
||||||
|
_updatedAt = value;
|
||||||
|
secureStorage.setString('ff_updatedAt', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteUpdatedAt() {
|
||||||
|
secureStorage.delete(key: 'ff_updatedAt');
|
||||||
|
}
|
||||||
|
|
||||||
|
String _status = '';
|
||||||
|
String get status => _status;
|
||||||
|
set status(String value) {
|
||||||
|
_status = value;
|
||||||
|
secureStorage.setString('ff_status', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteStatus() {
|
||||||
|
secureStorage.delete(key: 'ff_status');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,3 +221,46 @@ Future _safeInitAsync(Function() initializeField) async {
|
||||||
await initializeField();
|
await initializeField();
|
||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension FlutterSecureStorageExtensions on FlutterSecureStorage {
|
||||||
|
static final _lock = Lock();
|
||||||
|
|
||||||
|
Future<void> writeSync({required String key, String? value}) async =>
|
||||||
|
await _lock.synchronized(() async {
|
||||||
|
await write(key: key, value: value);
|
||||||
|
});
|
||||||
|
|
||||||
|
void remove(String key) => delete(key: key);
|
||||||
|
|
||||||
|
Future<String?> getString(String key) async => await read(key: key);
|
||||||
|
Future<void> setString(String key, String value) async =>
|
||||||
|
await writeSync(key: key, value: value);
|
||||||
|
|
||||||
|
Future<bool?> getBool(String key) async => (await read(key: key)) == 'true';
|
||||||
|
Future<void> setBool(String key, bool value) async =>
|
||||||
|
await writeSync(key: key, value: value.toString());
|
||||||
|
|
||||||
|
Future<int?> getInt(String key) async =>
|
||||||
|
int.tryParse(await read(key: key) ?? '');
|
||||||
|
Future<void> setInt(String key, int value) async =>
|
||||||
|
await writeSync(key: key, value: value.toString());
|
||||||
|
|
||||||
|
Future<double?> getDouble(String key) async =>
|
||||||
|
double.tryParse(await read(key: key) ?? '');
|
||||||
|
Future<void> setDouble(String key, double value) async =>
|
||||||
|
await writeSync(key: key, value: value.toString());
|
||||||
|
|
||||||
|
Future<List<String>?> getStringList(String key) async =>
|
||||||
|
await read(key: key).then((result) {
|
||||||
|
if (result == null || result.isEmpty) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return const CsvToListConverter()
|
||||||
|
.convert(result)
|
||||||
|
.first
|
||||||
|
.map((e) => e.toString())
|
||||||
|
.toList();
|
||||||
|
});
|
||||||
|
Future<void> setStringList(String key, List<String> value) async =>
|
||||||
|
await writeSync(key: key, value: const ListToCsvConverter().convert([value]));
|
||||||
|
}
|
||||||
|
|
|
@ -1,87 +0,0 @@
|
||||||
// ignore_for_file: unnecessary_getters_setters
|
|
||||||
|
|
||||||
import '/backend/schema/util/schema_util.dart';
|
|
||||||
|
|
||||||
import 'index.dart';
|
|
||||||
import '/flutter_flow/flutter_flow_util.dart';
|
|
||||||
|
|
||||||
class ActionStruct extends BaseStruct {
|
|
||||||
ActionStruct({
|
|
||||||
String? title,
|
|
||||||
String? icon,
|
|
||||||
}) : _title = title,
|
|
||||||
_icon = icon;
|
|
||||||
|
|
||||||
// "title" field.
|
|
||||||
String? _title;
|
|
||||||
String get title => _title ?? '';
|
|
||||||
set title(String? val) => _title = val;
|
|
||||||
|
|
||||||
bool hasTitle() => _title != null;
|
|
||||||
|
|
||||||
// "icon" field.
|
|
||||||
String? _icon;
|
|
||||||
String get icon => _icon ?? '';
|
|
||||||
set icon(String? val) => _icon = val;
|
|
||||||
|
|
||||||
bool hasIcon() => _icon != null;
|
|
||||||
|
|
||||||
static ActionStruct fromMap(Map<String, dynamic> data) => ActionStruct(
|
|
||||||
title: data['title'] as String?,
|
|
||||||
icon: data['icon'] as String?,
|
|
||||||
);
|
|
||||||
|
|
||||||
static ActionStruct? maybeFromMap(dynamic data) =>
|
|
||||||
data is Map ? ActionStruct.fromMap(data.cast<String, dynamic>()) : null;
|
|
||||||
|
|
||||||
Map<String, dynamic> toMap() => {
|
|
||||||
'title': _title,
|
|
||||||
'icon': _icon,
|
|
||||||
}.withoutNulls;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Map<String, dynamic> toSerializableMap() => {
|
|
||||||
'title': serializeParam(
|
|
||||||
_title,
|
|
||||||
ParamType.String,
|
|
||||||
),
|
|
||||||
'icon': serializeParam(
|
|
||||||
_icon,
|
|
||||||
ParamType.String,
|
|
||||||
),
|
|
||||||
}.withoutNulls;
|
|
||||||
|
|
||||||
static ActionStruct fromSerializableMap(Map<String, dynamic> data) =>
|
|
||||||
ActionStruct(
|
|
||||||
title: deserializeParam(
|
|
||||||
data['title'],
|
|
||||||
ParamType.String,
|
|
||||||
false,
|
|
||||||
),
|
|
||||||
icon: deserializeParam(
|
|
||||||
data['icon'],
|
|
||||||
ParamType.String,
|
|
||||||
false,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
@override
|
|
||||||
String toString() => 'ActionStruct(${toMap()})';
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool operator ==(Object other) {
|
|
||||||
return other is ActionStruct && title == other.title && icon == other.icon;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
int get hashCode => const ListEquality().hash([title, icon]);
|
|
||||||
}
|
|
||||||
|
|
||||||
ActionStruct createActionStruct({
|
|
||||||
String? title,
|
|
||||||
String? icon,
|
|
||||||
}) =>
|
|
||||||
ActionStruct(
|
|
||||||
title: title,
|
|
||||||
icon: icon,
|
|
||||||
);
|
|
|
@ -1,4 +1,3 @@
|
||||||
export '/backend/schema/util/schema_util.dart';
|
export '/backend/schema/util/schema_util.dart';
|
||||||
|
|
||||||
export 'action_struct.dart';
|
|
||||||
export 'device_struct.dart';
|
export 'device_struct.dart';
|
||||||
|
|
|
@ -101,12 +101,19 @@ class LoginPageModel extends FlutterFlowModel<LoginPageWidget> {
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
FFAppState().deleteEmail();
|
||||||
FFAppState().email = '';
|
FFAppState().email = '';
|
||||||
|
|
||||||
|
FFAppState().deletePasswd();
|
||||||
FFAppState().passwd = '';
|
FFAppState().passwd = '';
|
||||||
|
|
||||||
FFAppState().update(() {});
|
FFAppState().update(() {});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
FFAppState().deleteEmail();
|
||||||
FFAppState().email = '';
|
FFAppState().email = '';
|
||||||
|
|
||||||
|
FFAppState().deletePasswd();
|
||||||
FFAppState().passwd = '';
|
FFAppState().passwd = '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -171,18 +171,18 @@ class _HomePageWidgetState extends State<HomePageWidget> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
|
child: Container(
|
||||||
|
height: 30.0,
|
||||||
|
decoration: const BoxDecoration(),
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.max,
|
mainAxisSize: MainAxisSize.max,
|
||||||
mainAxisAlignment: MainAxisAlignment.end,
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
children: [
|
children: [
|
||||||
Flexible(
|
Flexible(
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsetsDirectional.fromSTEB(
|
|
||||||
0.0, 5.9, 40.0, 0.0),
|
|
||||||
child: FlutterFlowIconButton(
|
child: FlutterFlowIconButton(
|
||||||
borderRadius: 100.0,
|
borderRadius: 100.0,
|
||||||
borderWidth: 1.0,
|
borderWidth: 1.0,
|
||||||
buttonSize: 0.0,
|
buttonSize: 40.0,
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
Icons.close_sharp,
|
Icons.close_sharp,
|
||||||
color: FlutterFlowTheme.of(context)
|
color: FlutterFlowTheme.of(context)
|
||||||
|
@ -199,10 +199,10 @@ class _HomePageWidgetState extends State<HomePageWidget> {
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
.divide(const SizedBox(width: 0.0))
|
.divide(const SizedBox(width: 0.0))
|
||||||
.around(const SizedBox(width: 0.0)),
|
.around(const SizedBox(width: 0.0)),
|
||||||
|
|
|
@ -29,6 +29,7 @@ dependencies:
|
||||||
cached_network_image: 3.3.1
|
cached_network_image: 3.3.1
|
||||||
collection: 1.18.0
|
collection: 1.18.0
|
||||||
crop_your_image: 1.0.0
|
crop_your_image: 1.0.0
|
||||||
|
csv: 5.0.1
|
||||||
device_info_plus: 9.1.2
|
device_info_plus: 9.1.2
|
||||||
dropdown_button2: 2.3.9
|
dropdown_button2: 2.3.9
|
||||||
easy_debounce: 2.0.1
|
easy_debounce: 2.0.1
|
||||||
|
@ -37,6 +38,12 @@ dependencies:
|
||||||
flutter_animate: 4.1.1+1
|
flutter_animate: 4.1.1+1
|
||||||
flutter_cache_manager: 3.3.1
|
flutter_cache_manager: 3.3.1
|
||||||
flutter_plugin_android_lifecycle: 2.0.17
|
flutter_plugin_android_lifecycle: 2.0.17
|
||||||
|
flutter_secure_storage: 8.0.0
|
||||||
|
flutter_secure_storage_linux: 1.2.0
|
||||||
|
flutter_secure_storage_macos: 3.0.1
|
||||||
|
flutter_secure_storage_platform_interface: 1.0.2
|
||||||
|
flutter_secure_storage_web: 1.1.2
|
||||||
|
flutter_secure_storage_windows: 2.1.1
|
||||||
flutter_spinkit: 5.2.0
|
flutter_spinkit: 5.2.0
|
||||||
flutter_staggered_grid_view: 0.7.0
|
flutter_staggered_grid_view: 0.7.0
|
||||||
flutter_svg: 2.0.9
|
flutter_svg: 2.0.9
|
||||||
|
@ -66,6 +73,7 @@ dependencies:
|
||||||
shared_preferences_platform_interface: 2.3.1
|
shared_preferences_platform_interface: 2.3.1
|
||||||
shared_preferences_web: 2.2.1
|
shared_preferences_web: 2.2.1
|
||||||
sqflite: 2.2.6
|
sqflite: 2.2.6
|
||||||
|
synchronized: 3.1.0
|
||||||
timeago: 3.2.2
|
timeago: 3.2.2
|
||||||
url_launcher: 6.2.5
|
url_launcher: 6.2.5
|
||||||
url_launcher_android: 6.3.0
|
url_launcher_android: 6.3.0
|
||||||
|
|
Loading…
Reference in New Issue