Increased target SDK to 33, Increased dart to 2.17.3, Indicate configuration loading in profile view
This commit is contained in:
parent
c8007e8415
commit
7ef179906d
15 changed files with 196 additions and 182 deletions
|
@ -1,7 +1,9 @@
|
|||
# CHANGELOG
|
||||
|
||||
## 1.4.3+16 - UNRELEASED
|
||||
* ...
|
||||
* Increased target SDK to `33`
|
||||
* Increased dart to `>= 2.17.3`
|
||||
* Indicate configuration loading in profile view
|
||||
|
||||
## 1.4.2+15
|
||||
* Minor cleanup
|
||||
|
|
|
@ -32,8 +32,11 @@ Start by installing dependencies and generating entities!
|
|||
### Working versions for SDK
|
||||
|
||||
```
|
||||
Flutter version 2.10.5
|
||||
Dart version 2.16.2
|
||||
• Flutter version 3.0.2
|
||||
• Framework revision cd41fdd495
|
||||
• Engine revision f15f824b57
|
||||
• Dart version 2.17.3
|
||||
• DevTools version 2.12.2
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
|
|
@ -31,7 +31,7 @@ if (keystorePropertiesFile.exists()) {
|
|||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 31
|
||||
compileSdkVersion 33
|
||||
|
||||
lintOptions {
|
||||
disable 'InvalidPackage'
|
||||
|
@ -40,7 +40,7 @@ android {
|
|||
defaultConfig {
|
||||
applicationId "de.varakh.fbmobile"
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 31
|
||||
targetSdkVersion 33
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
|
|
@ -105,6 +105,7 @@
|
|||
"instance": "Instance",
|
||||
"connection": "{url}",
|
||||
"show_config": "Show configuration",
|
||||
"show_config_loading": "Loading configuration...",
|
||||
"shown_config": {
|
||||
"title": "Configuration",
|
||||
"description": "Upload max size: {uploadMaxSize}\n\nMax files per request: {maxFilesPerRequest}\n\nMax inputs vars: {maxInputVars}\n\nRequest max size: {requestMaxSize}",
|
||||
|
|
14
lib/app.dart
14
lib/app.dart
|
@ -26,23 +26,21 @@ class MyApp extends StatelessWidget {
|
|||
state: LocalizationProvider.of(context).state,
|
||||
child: StreamProvider<SwipeEvent?>(
|
||||
initialData: null,
|
||||
create: (context) =>
|
||||
locator<SwipeService>().swipeEventController.stream,
|
||||
create: (context) => locator<SwipeService>().swipeEventController.stream,
|
||||
child: StreamProvider<RefreshEvent?>(
|
||||
initialData: null,
|
||||
create: (context) =>
|
||||
locator<RefreshService>().refreshEventController.stream,
|
||||
create: (context) => locator<RefreshService>().refreshEventController.stream,
|
||||
child: StreamProvider<Session?>(
|
||||
initialData: Session.initial(),
|
||||
create: (context) =>
|
||||
locator<SessionService>().sessionController.stream,
|
||||
create: (context) => locator<SessionService>().sessionController.stream,
|
||||
child: LifeCycleManager(
|
||||
child: MaterialApp(
|
||||
debugShowCheckedModeBanner: false,
|
||||
title: translate('app.title'),
|
||||
builder: (context, child) => Navigator(
|
||||
key: locator<DialogService>().dialogNavigationKey,
|
||||
onGenerateRoute: (settings) => MaterialPageRoute(
|
||||
builder: (context) => DialogManager(child: child)),
|
||||
onGenerateRoute: (settings) =>
|
||||
MaterialPageRoute(builder: (context) => DialogManager(child: child)),
|
||||
),
|
||||
theme: ThemeData(
|
||||
brightness: Brightness.light,
|
||||
|
|
|
@ -16,14 +16,10 @@ class LifeCycleManager extends StatefulWidget {
|
|||
_LifeCycleManagerState createState() => _LifeCycleManagerState();
|
||||
}
|
||||
|
||||
class _LifeCycleManagerState extends State<LifeCycleManager>
|
||||
with WidgetsBindingObserver {
|
||||
class _LifeCycleManagerState extends State<LifeCycleManager> with WidgetsBindingObserver {
|
||||
final Logger logger = getLogger();
|
||||
|
||||
List<StoppableService> servicesToManage = [
|
||||
locator<SessionService>(),
|
||||
locator<PermissionService>()
|
||||
];
|
||||
List<StoppableService> servicesToManage = [locator<SessionService>(), locator<PermissionService>()];
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -33,13 +29,13 @@ class _LifeCycleManagerState extends State<LifeCycleManager>
|
|||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
WidgetsBinding.instance!.addObserver(this);
|
||||
WidgetsBinding.instance.addObserver(this);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
WidgetsBinding.instance!.removeObserver(this);
|
||||
WidgetsBinding.instance.removeObserver(this);
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -18,7 +18,37 @@ class BaseModel extends ChangeNotifier {
|
|||
|
||||
String? get stateMessage => _stateMap[STATE_MESSAGE] as String?;
|
||||
|
||||
void setStateValue(String key, Object? stateValue) {
|
||||
bool getStateValueAsBoolean(String key) {
|
||||
if (_stateMap.containsKey(key) && _stateMap[key] is bool) {
|
||||
return _stateMap[key] as bool;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
String? getStateValueAsString(String key) {
|
||||
if (_stateMap.containsKey(key) && _stateMap[key] is String) {
|
||||
return _stateMap[key] as String;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
int? getStateValueAsInt(String key) {
|
||||
if (_stateMap.containsKey(key) && _stateMap[key] is int) {
|
||||
return _stateMap[key] as int;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
void setStateBoolValue(String key, bool stateValue) => _setStateValue(key, stateValue);
|
||||
|
||||
void setStateIntValue(String key, int? stateValue) => _setStateValue(key, stateValue);
|
||||
|
||||
void setStateStringValue(String key, String? stateValue) => _setStateValue(key, stateValue);
|
||||
|
||||
void _setStateValue(String key, Object? stateValue) {
|
||||
if (_stateMap.containsKey(key)) {
|
||||
_stateMap.update(key, (value) => stateValue);
|
||||
} else {
|
||||
|
@ -41,11 +71,11 @@ class BaseModel extends ChangeNotifier {
|
|||
}
|
||||
|
||||
void setStateView(ViewState stateView) {
|
||||
setStateValue(STATE_VIEW, stateView);
|
||||
_setStateValue(STATE_VIEW, stateView);
|
||||
}
|
||||
|
||||
void setStateMessage(String? stateMessage) {
|
||||
setStateValue(STATE_MESSAGE, stateMessage);
|
||||
_setStateValue(STATE_MESSAGE, stateMessage);
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -6,7 +6,6 @@ import 'package:logger/logger.dart';
|
|||
import '../../core/services/session_service.dart';
|
||||
import '../../locator.dart';
|
||||
import '../enums/error_code.dart';
|
||||
import '../enums/viewstate.dart';
|
||||
import '../error/rest_service_exception.dart';
|
||||
import '../error/service_exception.dart';
|
||||
import '../models/rest/config.dart';
|
||||
|
@ -18,18 +17,21 @@ import '../util/logger.dart';
|
|||
import 'base_model.dart';
|
||||
|
||||
class ProfileModel extends BaseModel {
|
||||
static const _configurationButtonLoading = 'configurationButtonLoading';
|
||||
|
||||
final SessionService _sessionService = locator<SessionService>();
|
||||
final DialogService _dialogService = locator<DialogService>();
|
||||
final LinkService _linkService = locator<LinkService>();
|
||||
final FileService _fileService = locator<FileService>();
|
||||
final Logger _logger = getLogger();
|
||||
|
||||
bool get configLoading => getStateValueAsBoolean(_configurationButtonLoading);
|
||||
|
||||
String? errorMessage;
|
||||
|
||||
Future logout() async {
|
||||
var dialogResult = await _dialogService.showConfirmationDialog(
|
||||
title: translate('logout.title'),
|
||||
description: translate('logout.confirm'));
|
||||
title: translate('logout.title'), description: translate('logout.confirm'));
|
||||
|
||||
if (dialogResult.confirmed!) {
|
||||
await _sessionService.logout();
|
||||
|
@ -39,12 +41,11 @@ class ProfileModel extends BaseModel {
|
|||
Future revealApiKey(String? apiKey) async {
|
||||
await _dialogService.showDialog(
|
||||
title: translate('profile.revealed_api_key.title'),
|
||||
description: translate('profile.revealed_api_key.description',
|
||||
args: {'apiKey': apiKey}));
|
||||
description: translate('profile.revealed_api_key.description', args: {'apiKey': apiKey}));
|
||||
}
|
||||
|
||||
Future showConfig(String url) async {
|
||||
setStateView(ViewState.Busy);
|
||||
setStateBoolValue(_configurationButtonLoading, true);
|
||||
Config? config;
|
||||
try {
|
||||
config = await _fileService.getConfig(url);
|
||||
|
@ -53,15 +54,13 @@ class ProfileModel extends BaseModel {
|
|||
if (e is RestServiceException) {
|
||||
if (e.statusCode == HttpStatus.unauthorized) {
|
||||
errorMessage = translate('login.errors.wrong_credentials');
|
||||
} else if (e.statusCode != HttpStatus.unauthorized &&
|
||||
e.statusCode == HttpStatus.forbidden) {
|
||||
} else if (e.statusCode != HttpStatus.unauthorized && e.statusCode == HttpStatus.forbidden) {
|
||||
errorMessage = translate('login.errors.forbidden');
|
||||
} else if (e.statusCode == HttpStatus.notFound) {
|
||||
errorMessage = translate('api.incompatible_error_not_found');
|
||||
}
|
||||
if (e.statusCode == HttpStatus.badRequest) {
|
||||
errorMessage = translate('api.bad_request',
|
||||
args: {'reason': e.responseBody.message});
|
||||
errorMessage = translate('api.bad_request', args: {'reason': e.responseBody.message});
|
||||
} else {
|
||||
errorMessage = translate('api.general_rest_error');
|
||||
}
|
||||
|
@ -71,32 +70,29 @@ class ProfileModel extends BaseModel {
|
|||
errorMessage = translate('api.socket_timeout');
|
||||
} else {
|
||||
errorMessage = translate('app.unknown_error');
|
||||
setStateView(ViewState.Idle);
|
||||
setStateBoolValue(_configurationButtonLoading, false);
|
||||
_sessionService.logout();
|
||||
setStateView(ViewState.Idle);
|
||||
setStateBoolValue(_configurationButtonLoading, false);
|
||||
_logger.e('An unknown error occurred', e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
setStateView(ViewState.Idle);
|
||||
setStateBoolValue(_configurationButtonLoading, false);
|
||||
|
||||
if (config != null && errorMessage == null) {
|
||||
await _dialogService.showDialog(
|
||||
title: translate('profile.shown_config.title'),
|
||||
description: translate('profile.shown_config.description', args: {
|
||||
'uploadMaxSize':
|
||||
FormatterUtil.formatBytes(config.uploadMaxSize as int, 2),
|
||||
'uploadMaxSize': FormatterUtil.formatBytes(config.uploadMaxSize as int, 2),
|
||||
'maxFilesPerRequest': config.maxFilesPerRequest,
|
||||
'maxInputVars': config.maxInputVars,
|
||||
'requestMaxSize':
|
||||
FormatterUtil.formatBytes(config.requestMaxSize as int, 2)
|
||||
'requestMaxSize': FormatterUtil.formatBytes(config.requestMaxSize as int, 2)
|
||||
}));
|
||||
} else {
|
||||
await _dialogService.showDialog(
|
||||
title: translate('profile.shown_config.error.title'),
|
||||
description: translate('profile.shown_config.error.description',
|
||||
args: {'message': errorMessage}));
|
||||
description: translate('profile.shown_config.error.description', args: {'message': errorMessage}));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -51,12 +51,11 @@ class UploadModel extends BaseModel {
|
|||
void init() {
|
||||
_pasteTextController.addListener(() {
|
||||
pasteTextTouched = pasteTextController.text.isNotEmpty;
|
||||
setStateValue("PASTE_TEXT_TOUCHED", pasteTextTouched);
|
||||
setStateBoolValue("PASTE_TEXT_TOUCHED", pasteTextTouched);
|
||||
});
|
||||
|
||||
// For sharing images coming from outside the app while the app is in the memory
|
||||
_intentDataStreamSubscription = ReceiveSharingIntent.getMediaStream()
|
||||
.listen((List<SharedMediaFile> value) {
|
||||
_intentDataStreamSubscription = ReceiveSharingIntent.getMediaStream().listen((List<SharedMediaFile> value) {
|
||||
if (value.length > 0) {
|
||||
setStateView(ViewState.Busy);
|
||||
paths = value.map((sharedFile) {
|
||||
|
@ -98,8 +97,7 @@ class UploadModel extends BaseModel {
|
|||
});
|
||||
|
||||
// For sharing or opening urls/text coming from outside the app while the app is in the memory
|
||||
_intentDataStreamSubscription =
|
||||
ReceiveSharingIntent.getTextStream().listen((String value) {
|
||||
_intentDataStreamSubscription = ReceiveSharingIntent.getTextStream().listen((String value) {
|
||||
if (value.isNotEmpty) {
|
||||
setStateView(ViewState.Busy);
|
||||
pasteTextController.text = value;
|
||||
|
@ -167,9 +165,7 @@ class UploadModel extends BaseModel {
|
|||
allowMultiple: true,
|
||||
withData: false,
|
||||
withReadStream: true,
|
||||
allowedExtensions: (_extension?.isNotEmpty ?? false)
|
||||
? _extension?.replaceAll(' ', '').split(',')
|
||||
: null,
|
||||
allowedExtensions: (_extension?.isNotEmpty ?? false) ? _extension?.replaceAll(' ', '').split(',') : null,
|
||||
))
|
||||
?.files;
|
||||
} on PlatformException catch (e) {
|
||||
|
@ -204,25 +200,21 @@ class UploadModel extends BaseModel {
|
|||
Map<String, String>? additionalFiles;
|
||||
|
||||
if (pasteTextController.text.isNotEmpty) {
|
||||
additionalFiles = Map.from({
|
||||
'paste-${(new DateTime.now().millisecondsSinceEpoch / 1000).round()}.txt':
|
||||
pasteTextController.text
|
||||
});
|
||||
additionalFiles = Map.from(
|
||||
{'paste-${(new DateTime.now().millisecondsSinceEpoch / 1000).round()}.txt': pasteTextController.text});
|
||||
}
|
||||
|
||||
if (paths != null && paths!.length > 0) {
|
||||
files = paths!.map((e) => new File(e.path!)).toList();
|
||||
}
|
||||
|
||||
UploadedResponse response =
|
||||
await _fileService.uploadPaste(files, additionalFiles);
|
||||
UploadedResponse response = await _fileService.uploadPaste(files, additionalFiles);
|
||||
response.data.ids.forEach((element) {
|
||||
uploadedPasteIds.putIfAbsent(element, () => false);
|
||||
});
|
||||
|
||||
if (createMulti && response.data.ids.length > 1) {
|
||||
UploadedMultiResponse multiResponse =
|
||||
await _fileService.uploadMultiPaste(response.data.ids);
|
||||
UploadedMultiResponse multiResponse = await _fileService.uploadMultiPaste(response.data.ids);
|
||||
uploadedPasteIds.putIfAbsent(multiResponse.data.urlId, () => true);
|
||||
}
|
||||
|
||||
|
@ -242,11 +234,9 @@ class UploadModel extends BaseModel {
|
|||
e.responseBody is RestError &&
|
||||
e.responseBody.message != null) {
|
||||
if (e.statusCode == HttpStatus.badRequest) {
|
||||
errorMessage = translate('api.bad_request',
|
||||
args: {'reason': e.responseBody.message});
|
||||
errorMessage = translate('api.bad_request', args: {'reason': e.responseBody.message});
|
||||
} else {
|
||||
errorMessage = translate('api.general_rest_error_payload',
|
||||
args: {'message': e.responseBody.message});
|
||||
errorMessage = translate('api.general_rest_error_payload', args: {'message': e.responseBody.message});
|
||||
}
|
||||
} else {
|
||||
errorMessage = translate('api.general_rest_error');
|
||||
|
|
|
@ -9,10 +9,10 @@ import 'locator.dart';
|
|||
/// main entry point used to configure log level, locales, ...
|
||||
void main() async {
|
||||
setupLogger(Level.info);
|
||||
// setupLogger(Level.debug);
|
||||
setupLocator();
|
||||
|
||||
var delegate = await LocalizationDelegate.create(fallbackLocale: 'en', supportedLocales: ['en']);
|
||||
var delegate = await LocalizationDelegate.create(fallbackLocale: 'en', supportedLocales: ['en', 'en_US']);
|
||||
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
runApp(LocalizedApp(delegate, MyApp()));
|
||||
}
|
||||
|
|
|
@ -53,15 +53,26 @@ class ProfileView extends StatelessWidget {
|
|||
UIHelper.verticalSpaceMedium(),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 25.0, right: 25.0),
|
||||
child: ElevatedButton.icon(
|
||||
icon: Icon(Icons.settings, color: blueColor),
|
||||
label: Text(
|
||||
translate('profile.show_config'),
|
||||
style: TextStyle(color: buttonForegroundColor),
|
||||
),
|
||||
onPressed: () async {
|
||||
await model.showConfig(url);
|
||||
})),
|
||||
child: model.configLoading
|
||||
? Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
CircularProgressIndicator(),
|
||||
Text(translate('profile.show_config_loading'),
|
||||
style: TextStyle(color: buttonBackgroundColor))
|
||||
],
|
||||
))
|
||||
: ElevatedButton.icon(
|
||||
icon: Icon(Icons.settings, color: blueColor),
|
||||
label: Text(
|
||||
translate('profile.show_config'),
|
||||
style: TextStyle(color: buttonForegroundColor),
|
||||
),
|
||||
onPressed: () async {
|
||||
await model.showConfig(url);
|
||||
})),
|
||||
UIHelper.verticalSpaceMedium(),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 25.0, right: 25.0),
|
||||
|
|
|
@ -19,8 +19,7 @@ class AuthenticatedTabBarView extends StatefulWidget {
|
|||
AuthenticatedTabBarState createState() => AuthenticatedTabBarState();
|
||||
}
|
||||
|
||||
class AuthenticatedTabBarState extends State<AuthenticatedTabBarView>
|
||||
with SingleTickerProviderStateMixin {
|
||||
class AuthenticatedTabBarState extends State<AuthenticatedTabBarView> with SingleTickerProviderStateMixin {
|
||||
final Logger _logger = getLogger();
|
||||
final SwipeService _swipeService = locator<SwipeService>();
|
||||
|
||||
|
@ -51,8 +50,7 @@ class AuthenticatedTabBarState extends State<AuthenticatedTabBarView>
|
|||
}
|
||||
});
|
||||
|
||||
_swipeEventSubscription =
|
||||
_swipeService.swipeEventController.stream.listen((SwipeEvent event) {
|
||||
_swipeEventSubscription = _swipeService.swipeEventController.stream.listen((SwipeEvent event) {
|
||||
_logger.d('Received a swipe event for the authenticated tab bar: $event');
|
||||
|
||||
int targetIndex = _currentTabIndex;
|
||||
|
@ -72,8 +70,7 @@ class AuthenticatedTabBarState extends State<AuthenticatedTabBarView>
|
|||
targetIndex = _tabPages.length - 1;
|
||||
}
|
||||
|
||||
_logger.d(
|
||||
"Changing to tab '$targetIndex' because of a swipe event '$event'");
|
||||
_logger.d("Changing to tab '$targetIndex' because of a swipe event '$event'");
|
||||
_tabController!.animateTo(targetIndex);
|
||||
});
|
||||
}
|
||||
|
@ -91,12 +88,9 @@ class AuthenticatedTabBarState extends State<AuthenticatedTabBarView>
|
|||
double yourWidth = width / 3;
|
||||
double yourHeight = 55;
|
||||
|
||||
Color colorTabItem0 =
|
||||
_currentTabIndex == 0 ? blueColor : primaryAccentColor;
|
||||
Color colorTabItem1 =
|
||||
_currentTabIndex == 1 ? blueColor : primaryAccentColor;
|
||||
Color colorTabItem2 =
|
||||
_currentTabIndex == 2 ? blueColor : primaryAccentColor;
|
||||
Color colorTabItem0 = _currentTabIndex == 0 ? blueColor : primaryAccentColor;
|
||||
Color colorTabItem1 = _currentTabIndex == 1 ? blueColor : primaryAccentColor;
|
||||
Color colorTabItem2 = _currentTabIndex == 2 ? blueColor : primaryAccentColor;
|
||||
|
||||
List<Widget> _tabsButton = [
|
||||
Container(
|
||||
|
@ -105,13 +99,10 @@ class AuthenticatedTabBarState extends State<AuthenticatedTabBarView>
|
|||
alignment: Alignment.center,
|
||||
child: Tab(
|
||||
icon: Icon(
|
||||
_currentTabIndex == 0
|
||||
? Icons.upload_outlined
|
||||
: Icons.upload_rounded,
|
||||
_currentTabIndex == 0 ? Icons.upload_outlined : Icons.upload_rounded,
|
||||
color: colorTabItem0,
|
||||
),
|
||||
child: Text(translate('tabs.upload'),
|
||||
style: TextStyle(color: colorTabItem0)),
|
||||
child: Text(translate('tabs.upload'), style: TextStyle(color: colorTabItem0)),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
|
@ -120,13 +111,10 @@ class AuthenticatedTabBarState extends State<AuthenticatedTabBarView>
|
|||
alignment: Alignment.center,
|
||||
child: Tab(
|
||||
icon: Icon(
|
||||
_currentTabIndex == 1
|
||||
? Icons.history_outlined
|
||||
: Icons.history_rounded,
|
||||
_currentTabIndex == 1 ? Icons.history_outlined : Icons.history_rounded,
|
||||
color: colorTabItem1,
|
||||
),
|
||||
child: Text(translate('tabs.history'),
|
||||
style: TextStyle(color: colorTabItem1)),
|
||||
child: Text(translate('tabs.history'), style: TextStyle(color: colorTabItem1)),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
|
@ -135,13 +123,10 @@ class AuthenticatedTabBarState extends State<AuthenticatedTabBarView>
|
|||
alignment: Alignment.center,
|
||||
child: Tab(
|
||||
icon: Icon(
|
||||
_currentTabIndex == 2
|
||||
? Icons.person_outlined
|
||||
: Icons.person_rounded,
|
||||
_currentTabIndex == 2 ? Icons.person_outlined : Icons.person_rounded,
|
||||
color: colorTabItem2,
|
||||
),
|
||||
child: Text(translate('tabs.profile'),
|
||||
style: TextStyle(color: colorTabItem2)),
|
||||
child: Text(translate('tabs.profile'), style: TextStyle(color: colorTabItem2)),
|
||||
),
|
||||
),
|
||||
];
|
||||
|
|
|
@ -8,11 +8,7 @@ class MyAppBar extends AppBar {
|
|||
static final List<Widget> aboutEnabledWidgets = [AboutIconButton()];
|
||||
static final List<Widget> aboutDisabledWidgets = [];
|
||||
|
||||
MyAppBar(
|
||||
{Key? key,
|
||||
required Widget title,
|
||||
List<Widget>? actionWidgets,
|
||||
bool enableAbout = true})
|
||||
MyAppBar({Key? key, required Widget title, List<Widget>? actionWidgets, bool enableAbout = true})
|
||||
: super(
|
||||
key: key,
|
||||
title: Row(children: <Widget>[title]),
|
||||
|
@ -23,8 +19,7 @@ class MyAppBar extends AppBar {
|
|||
),
|
||||
backgroundColor: primaryAccentColor);
|
||||
|
||||
static List<Widget> _renderIconButtons(
|
||||
List<Widget>? actionWidgets, bool aboutEnabled) {
|
||||
static List<Widget> _renderIconButtons(List<Widget>? actionWidgets, bool aboutEnabled) {
|
||||
if (actionWidgets == null) {
|
||||
actionWidgets = [];
|
||||
}
|
||||
|
|
131
pubspec.lock
131
pubspec.lock
|
@ -7,21 +7,21 @@ packages:
|
|||
name: _fe_analyzer_shared
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "39.0.0"
|
||||
version: "40.0.0"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
version: "4.1.0"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: args
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.3.0"
|
||||
version: "2.3.1"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -63,14 +63,14 @@ packages:
|
|||
name: build_resolvers
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.8"
|
||||
version: "2.0.9"
|
||||
build_runner:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: build_runner
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.10"
|
||||
version: "2.1.11"
|
||||
build_runner_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -91,14 +91,14 @@ packages:
|
|||
name: built_value
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "8.2.3"
|
||||
version: "8.3.3"
|
||||
built_value_generator:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: built_value_generator
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "8.2.3"
|
||||
version: "8.3.3"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -147,14 +147,14 @@ packages:
|
|||
name: collection
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.15.0"
|
||||
version: "1.16.0"
|
||||
convert:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: convert
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
version: "3.0.2"
|
||||
crypto:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -168,7 +168,7 @@ packages:
|
|||
name: cupertino_icons
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
version: "1.0.5"
|
||||
dart_style:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -189,14 +189,14 @@ packages:
|
|||
name: fake_async
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
version: "1.3.0"
|
||||
ffi:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: ffi
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
version: "1.2.1"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -210,14 +210,14 @@ packages:
|
|||
name: file_picker
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.5.1"
|
||||
version: "4.6.1"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fixnum
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
version: "1.0.1"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
|
@ -241,7 +241,7 @@ packages:
|
|||
name: flutter_plugin_android_lifecycle
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.5"
|
||||
version: "2.0.6"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
|
@ -253,7 +253,7 @@ packages:
|
|||
name: flutter_translate
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
version: "3.1.0"
|
||||
flutter_web_plugins:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
|
@ -265,7 +265,7 @@ packages:
|
|||
name: frontend_server_client
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
version: "2.1.3"
|
||||
get_it:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -279,7 +279,7 @@ packages:
|
|||
name: glob
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
version: "2.1.0"
|
||||
graphs:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -300,14 +300,14 @@ packages:
|
|||
name: http_multi_server
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.2.0"
|
||||
version: "3.2.1"
|
||||
http_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_parser
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
version: "4.0.1"
|
||||
intl:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -328,7 +328,7 @@ packages:
|
|||
name: js
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.6.3"
|
||||
version: "0.6.4"
|
||||
json_annotation:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -377,7 +377,7 @@ packages:
|
|||
name: material_color_utilities
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.1.3"
|
||||
version: "0.1.4"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -405,7 +405,7 @@ packages:
|
|||
name: package_config
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
version: "2.1.0"
|
||||
package_info_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -454,42 +454,42 @@ packages:
|
|||
name: path
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.8.0"
|
||||
version: "1.8.1"
|
||||
path_provider_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_linux
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.5"
|
||||
version: "2.1.7"
|
||||
path_provider_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.3"
|
||||
version: "2.0.4"
|
||||
path_provider_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_windows
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.5"
|
||||
version: "2.0.7"
|
||||
permission_handler:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: permission_handler
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "9.2.0"
|
||||
version: "10.0.0"
|
||||
permission_handler_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_android
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "9.0.2+1"
|
||||
version: "10.0.0"
|
||||
permission_handler_apple:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -531,7 +531,7 @@ packages:
|
|||
name: pool
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.5.0"
|
||||
version: "1.5.1"
|
||||
process:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -545,7 +545,7 @@ packages:
|
|||
name: provider
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "6.0.2"
|
||||
version: "6.0.3"
|
||||
pub_semver:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -566,7 +566,7 @@ packages:
|
|||
name: quiver
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.1+1"
|
||||
version: "3.1.0"
|
||||
receive_sharing_intent:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -580,7 +580,7 @@ packages:
|
|||
name: share_plus
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.0.4"
|
||||
version: "4.0.9"
|
||||
share_plus_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -594,63 +594,63 @@ packages:
|
|||
name: share_plus_macos
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
version: "3.0.1"
|
||||
share_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: share_plus_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.2"
|
||||
version: "3.0.3"
|
||||
share_plus_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: share_plus_web
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
version: "3.0.1"
|
||||
share_plus_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: share_plus_windows
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
version: "3.0.1"
|
||||
shared_preferences:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: shared_preferences
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.13"
|
||||
version: "2.0.15"
|
||||
shared_preferences_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_android
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.11"
|
||||
version: "2.0.12"
|
||||
shared_preferences_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_ios
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
version: "2.1.1"
|
||||
shared_preferences_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_linux
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
version: "2.1.1"
|
||||
shared_preferences_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_macos
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.3"
|
||||
version: "2.0.4"
|
||||
shared_preferences_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -664,28 +664,28 @@ packages:
|
|||
name: shared_preferences_web
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.3"
|
||||
version: "2.0.4"
|
||||
shared_preferences_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_windows
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
version: "2.1.1"
|
||||
shelf:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
version: "1.3.1"
|
||||
shelf_web_socket:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_web_socket
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
version: "1.0.2"
|
||||
simple_gesture_detector:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -718,7 +718,7 @@ packages:
|
|||
name: source_span
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.8.1"
|
||||
version: "1.8.2"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -732,7 +732,14 @@ packages:
|
|||
name: stacked
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.3.3"
|
||||
version: "2.3.12"
|
||||
stacked_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stacked_core
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.3"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -767,7 +774,7 @@ packages:
|
|||
name: test_api
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.4.8"
|
||||
version: "0.4.9"
|
||||
timing:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -781,7 +788,7 @@ packages:
|
|||
name: typed_data
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
version: "1.3.1"
|
||||
universal_io:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -795,56 +802,56 @@ packages:
|
|||
name: url_launcher
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "6.1.0"
|
||||
version: "6.1.4"
|
||||
url_launcher_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_android
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "6.0.16"
|
||||
version: "6.0.17"
|
||||
url_launcher_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_ios
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "6.0.15"
|
||||
version: "6.0.17"
|
||||
url_launcher_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_linux
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
version: "3.0.1"
|
||||
url_launcher_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_macos
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
version: "3.0.1"
|
||||
url_launcher_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.5"
|
||||
version: "2.1.0"
|
||||
url_launcher_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_web
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.9"
|
||||
version: "2.0.12"
|
||||
url_launcher_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_windows
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
version: "3.0.1"
|
||||
validators:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -858,7 +865,7 @@ packages:
|
|||
name: vector_math
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
version: "2.1.2"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -879,7 +886,7 @@ packages:
|
|||
name: win32
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.5.2"
|
||||
version: "2.6.1"
|
||||
xdg_directories:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -893,7 +900,7 @@ packages:
|
|||
name: yaml
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.1.0"
|
||||
version: "3.1.1"
|
||||
sdks:
|
||||
dart: ">=2.16.2 <3.0.0"
|
||||
dart: ">=2.17.3 <3.0.0"
|
||||
flutter: ">=2.10.0"
|
||||
|
|
24
pubspec.yaml
24
pubspec.yaml
|
@ -14,30 +14,30 @@ description: A mobile client for FileBin.
|
|||
version: 1.4.3+16
|
||||
|
||||
environment:
|
||||
sdk: '>=2.16.2 <3.0.0'
|
||||
sdk: '>=2.17.3 <3.0.0'
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
cupertino_icons: 1.0.4
|
||||
cupertino_icons: 1.0.5
|
||||
flutter_localizations:
|
||||
sdk: flutter
|
||||
flutter_translate: 3.0.1
|
||||
provider: 6.0.2
|
||||
stacked: 2.3.3
|
||||
flutter_translate: 3.1.0 # > 3.x breaks with WidgetBinding, wait for dependency update
|
||||
provider: 6.0.3
|
||||
stacked: 2.3.12
|
||||
get_it: 7.2.0
|
||||
logger: 1.1.0
|
||||
shared_preferences: 2.0.13
|
||||
shared_preferences: 2.0.15
|
||||
http: 0.13.4
|
||||
validators: 3.0.0
|
||||
flutter_linkify: 5.0.2
|
||||
url_launcher: 6.1.0
|
||||
url_launcher: 6.1.4
|
||||
expandable: 5.0.1
|
||||
share_plus: 4.0.4
|
||||
file_picker: 4.5.1
|
||||
share_plus: 4.0.9
|
||||
file_picker: 4.6.1
|
||||
clipboard: 0.1.3
|
||||
receive_sharing_intent: 1.4.5
|
||||
permission_handler: 9.2.0
|
||||
permission_handler: 10.0.0
|
||||
package_info_plus: 1.4.2
|
||||
simple_gesture_detector: 0.2.0
|
||||
json_annotation: 4.5.0
|
||||
|
@ -45,8 +45,8 @@ dependencies:
|
|||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
build_runner: 2.1.10
|
||||
built_value_generator: ^8.2.3
|
||||
build_runner: 2.1.11
|
||||
built_value_generator: 8.3.3
|
||||
json_serializable: 6.2.0
|
||||
|
||||
# For information on the generic Dart part of this file, see the
|
||||
|
|
Loading…
Reference in a new issue