Merge pull request #75 from FRE-Informatica/feat/fd-1035
FEAT/FD-1035 - Tela de Sobre no App
This commit is contained in:
commit
ff216f63c4
|
@ -24,3 +24,7 @@
|
||||||
-keep class com.google.gson.reflect.TypeToken { *; }
|
-keep class com.google.gson.reflect.TypeToken { *; }
|
||||||
-keep class com.google.common.reflect.TypeToken { *; }
|
-keep class com.google.common.reflect.TypeToken { *; }
|
||||||
|
|
||||||
|
# Additional keep rules to prevent R8 from removing necessary classes
|
||||||
|
-dontwarn com.google.j2objc.annotations.ReflectionSupport
|
||||||
|
-keep class com.google.j2objc.annotations.ReflectionSupport { *; }
|
||||||
|
|
||||||
|
|
|
@ -24,3 +24,6 @@
|
||||||
-keep class com.google.gson.reflect.TypeToken { *; }
|
-keep class com.google.gson.reflect.TypeToken { *; }
|
||||||
-keep class com.google.common.reflect.TypeToken { *; }
|
-keep class com.google.common.reflect.TypeToken { *; }
|
||||||
|
|
||||||
|
# Additional keep rules to prevent R8 from removing necessary classes
|
||||||
|
-dontwarn com.google.j2objc.annotations.ReflectionSupport
|
||||||
|
-keep class com.google.j2objc.annotations.ReflectionSupport { *; }
|
Binary file not shown.
After Width: | Height: | Size: 36 KiB |
|
@ -0,0 +1,155 @@
|
||||||
|
import 'dart:developer';
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
|
import 'package:hub/flutter_flow/flutter_flow_icon_button.dart';
|
||||||
|
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||||
|
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||||
|
import 'package:hub/flutter_flow/internationalization.dart';
|
||||||
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
|
class AboutSystemPage extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_AboutSystemPageState createState() => _AboutSystemPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AboutSystemPageState extends State<AboutSystemPage> {
|
||||||
|
String _appVersion = '';
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_loadAppVersion();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _loadAppVersion() async {
|
||||||
|
try {
|
||||||
|
final PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
||||||
|
setState(() {
|
||||||
|
_appVersion = FFLocalizations.of(context).getVariableText(
|
||||||
|
ptText: 'Versão do Aplicativo: ${packageInfo.version}',
|
||||||
|
enText: 'App Version: ${packageInfo.version}',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
} catch (e, s) {
|
||||||
|
log(e.toString(), stackTrace: s);
|
||||||
|
setState(() {
|
||||||
|
_appVersion = FFLocalizations.of(context).getVariableText(
|
||||||
|
ptText: 'Versão do Aplicativo Indisponível',
|
||||||
|
enText: 'App Version Unavailable',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final theme = FlutterFlowTheme.of(context);
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: theme.primaryBackground,
|
||||||
|
appBar: _buildAppBar(context, theme),
|
||||||
|
body: _buildBody(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
PreferredSizeWidget _buildAppBar(BuildContext context, FlutterFlowTheme theme) {
|
||||||
|
return AppBar(
|
||||||
|
backgroundColor: theme.primaryBackground,
|
||||||
|
automaticallyImplyLeading: false,
|
||||||
|
leading: _buildBackButton(context, theme),
|
||||||
|
title: _buildTitle(context, theme),
|
||||||
|
centerTitle: true,
|
||||||
|
elevation: 0.0,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildBackButton(BuildContext context, FlutterFlowTheme theme) {
|
||||||
|
return FlutterFlowIconButton(
|
||||||
|
borderColor: Colors.transparent,
|
||||||
|
borderRadius: 30.0,
|
||||||
|
borderWidth: 1.0,
|
||||||
|
buttonSize: 60.0,
|
||||||
|
icon: Icon(
|
||||||
|
Icons.keyboard_arrow_left,
|
||||||
|
color: theme.primaryText,
|
||||||
|
size: 30.0,
|
||||||
|
),
|
||||||
|
onPressed: () => Navigator.of(context).pop(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildTitle(BuildContext context, FlutterFlowTheme theme) {
|
||||||
|
return Text(
|
||||||
|
FFLocalizations.of(context).getVariableText(
|
||||||
|
ptText: 'Sobre o Sistema',
|
||||||
|
enText: 'About the System',
|
||||||
|
),
|
||||||
|
style: theme.headlineMedium.override(
|
||||||
|
fontFamily: theme.headlineMediumFamily,
|
||||||
|
color: theme.primaryText,
|
||||||
|
fontSize: 16.0,
|
||||||
|
letterSpacing: 0.0,
|
||||||
|
useGoogleFonts: GoogleFonts.asMap().containsKey(theme.headlineMediumFamily),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _launchURL() async {
|
||||||
|
final Uri url = Uri.parse('https://fre.com.br/');
|
||||||
|
if (!await launchUrl(url)) {
|
||||||
|
throw Exception('Could not launch $url');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildBody() {
|
||||||
|
return Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
SizedBox(height: 20),
|
||||||
|
_buildLogo(),
|
||||||
|
SizedBox(height: 20),
|
||||||
|
_buildAppVersionText(),
|
||||||
|
Spacer(),
|
||||||
|
_buildLaunch(),
|
||||||
|
SizedBox(height: 20),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildLogo() {
|
||||||
|
return SizedBox(
|
||||||
|
height: 50,
|
||||||
|
width: 50,
|
||||||
|
child: Image.asset('assets/images/fre.png'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildLaunch() {
|
||||||
|
final theme = FlutterFlowTheme.of(context).primary;
|
||||||
|
return RichText(
|
||||||
|
text: TextSpan(
|
||||||
|
text: 'Website',
|
||||||
|
style: TextStyle(color: theme, fontSize: 16),
|
||||||
|
recognizer: TapGestureRecognizer()..onTap = () => _launchURL(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildAppVersionText() {
|
||||||
|
final theme = FlutterFlowTheme.of(context);
|
||||||
|
return Text(
|
||||||
|
_appVersion,
|
||||||
|
style: theme.headlineMedium.override(
|
||||||
|
fontFamily: theme.headlineMediumFamily,
|
||||||
|
color: theme.primaryText,
|
||||||
|
fontSize: 16.0,
|
||||||
|
letterSpacing: 0.0,
|
||||||
|
useGoogleFonts: GoogleFonts.asMap().containsKey(theme.headlineMediumFamily),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1 +1,2 @@
|
||||||
|
export 'about_system.dart';
|
||||||
export 'home_page.dart';
|
export 'home_page.dart';
|
||||||
|
|
|
@ -148,6 +148,11 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
|
||||||
token: token,
|
token: token,
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
|
FFRoute(
|
||||||
|
name: 'aboutSystemPage',
|
||||||
|
path: '/aboutSystemPage',
|
||||||
|
builder: (context, params) => AboutSystemPage(),
|
||||||
|
),
|
||||||
FFRoute(
|
FFRoute(
|
||||||
name: 'homePage',
|
name: 'homePage',
|
||||||
path: '/homePage',
|
path: '/homePage',
|
||||||
|
|
|
@ -9,6 +9,7 @@ import 'package:hub/shared/components/molecules/locals/index.dart';
|
||||||
import 'package:hub/shared/helpers/storage/base_storage.dart';
|
import 'package:hub/shared/helpers/storage/base_storage.dart';
|
||||||
import 'package:hub/shared/helpers/storage/storage_helper.dart';
|
import 'package:hub/shared/helpers/storage/storage_helper.dart';
|
||||||
import 'package:hub/shared/services/authentication/authentication_service.dart';
|
import 'package:hub/shared/services/authentication/authentication_service.dart';
|
||||||
|
import 'package:hub/shared/utils/path_util.dart';
|
||||||
import 'package:share_plus/share_plus.dart';
|
import 'package:share_plus/share_plus.dart';
|
||||||
|
|
||||||
import '../../shared/utils/snackbar_util.dart';
|
import '../../shared/utils/snackbar_util.dart';
|
||||||
|
@ -238,18 +239,8 @@ class PreferencesPageModel with ChangeNotifier {
|
||||||
showAlertDialog(context, title, content, onConfirm);
|
showAlertDialog(context, title, content, onConfirm);
|
||||||
}
|
}
|
||||||
|
|
||||||
void logout(BuildContext context) async {
|
void navAboutSystem(BuildContext context) async {
|
||||||
final String title = FFLocalizations.of(context).getVariableText(
|
PathUtil.nav('/aboutSystemPage');
|
||||||
enText: 'Logout',
|
|
||||||
ptText: 'Sair',
|
|
||||||
);
|
|
||||||
final String content = FFLocalizations.of(context).getVariableText(
|
|
||||||
enText: 'Are you sure you want to logout?',
|
|
||||||
ptText: 'Tem certeza que deseja sair?',
|
|
||||||
);
|
|
||||||
onConfirm() async => AuthenticationService.signOut(context);
|
|
||||||
|
|
||||||
showAlertDialog(context, title, content, onConfirm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void localUnlink(BuildContext context) {
|
void localUnlink(BuildContext context) {
|
||||||
|
|
|
@ -29,9 +29,7 @@ class _PreferencesPageWidgetState extends State<PreferencesPageWidget> {
|
||||||
create: (_) => PreferencesPageModel(),
|
create: (_) => PreferencesPageModel(),
|
||||||
child: Consumer<PreferencesPageModel>(
|
child: Consumer<PreferencesPageModel>(
|
||||||
builder: (context, model, child) => GestureDetector(
|
builder: (context, model, child) => GestureDetector(
|
||||||
onTap: () => model.unfocusNode.canRequestFocus
|
onTap: () => model.unfocusNode.canRequestFocus ? FocusScope.of(context).requestFocus(model.unfocusNode) : FocusScope.of(context).unfocus(),
|
||||||
? FocusScope.of(context).requestFocus(model.unfocusNode)
|
|
||||||
: FocusScope.of(context).unfocus(),
|
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
|
backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
|
@ -77,7 +75,7 @@ class _PreferencesPageWidgetState extends State<PreferencesPageWidget> {
|
||||||
Expanded(
|
Expanded(
|
||||||
flex: 2,
|
flex: 2,
|
||||||
child: ListView.builder(
|
child: ListView.builder(
|
||||||
itemCount: 8,
|
itemCount: 9,
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 20.0),
|
padding: const EdgeInsets.symmetric(horizontal: 20.0),
|
||||||
physics: const AlwaysScrollableScrollPhysics(),
|
physics: const AlwaysScrollableScrollPhysics(),
|
||||||
itemBuilder: (BuildContext context, int index) {
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
@ -175,12 +173,12 @@ class _PreferencesPageWidgetState extends State<PreferencesPageWidget> {
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
icon = Icons.logout;
|
icon = Icons.info_outline;
|
||||||
onPressed = () => model.logout(context);
|
onPressed = () => model.navAboutSystem(context);
|
||||||
isEnabled = false;
|
isEnabled = false;
|
||||||
content = FFLocalizations.of(context).getVariableText(
|
content = FFLocalizations.of(context).getVariableText(
|
||||||
ptText: 'Sair da conta',
|
ptText: 'Sobre o Sistema',
|
||||||
enText: 'Logout',
|
enText: 'About the System',
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -205,12 +203,10 @@ class _PreferencesPageWidgetState extends State<PreferencesPageWidget> {
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
CircleAvatar(
|
CircleAvatar(
|
||||||
backgroundColor:
|
backgroundColor: isEnabled ? FlutterFlowTheme.of(context).primary : FlutterFlowTheme.of(context).alternate,
|
||||||
isEnabled ? FlutterFlowTheme.of(context).primary : FlutterFlowTheme.of(context).alternate,
|
|
||||||
child: Icon(
|
child: Icon(
|
||||||
icon,
|
icon,
|
||||||
color:
|
color: isEnabled ? FlutterFlowTheme.of(context).primaryBackground : FlutterFlowTheme.of(context).primary,
|
||||||
isEnabled ? FlutterFlowTheme.of(context).primaryBackground : FlutterFlowTheme.of(context).primary,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 8.0),
|
const SizedBox(width: 8.0),
|
||||||
|
|
|
@ -218,6 +218,16 @@ class MenuEntry implements BaseModule {
|
||||||
route: '/preferencesSettings',
|
route: '/preferencesSettings',
|
||||||
types: [MenuEntryType.Home, MenuEntryType.Drawer],
|
types: [MenuEntryType.Home, MenuEntryType.Drawer],
|
||||||
),
|
),
|
||||||
|
MenuEntry(
|
||||||
|
key: 'FRE-HUB-ABOUT-SYSTEM',
|
||||||
|
icon: Icons.info_outline,
|
||||||
|
name: FFLocalizations.of(navigatorKey.currentContext!).getVariableText(
|
||||||
|
ptText: 'Sobre o Sistema',
|
||||||
|
enText: 'About the System',
|
||||||
|
),
|
||||||
|
route: '/aboutSystemPage',
|
||||||
|
types: [MenuEntryType.Drawer],
|
||||||
|
),
|
||||||
MenuEntry(
|
MenuEntry(
|
||||||
key: 'FRE-HUB-LOGOUT',
|
key: 'FRE-HUB-LOGOUT',
|
||||||
icon: Icons.exit_to_app,
|
icon: Icons.exit_to_app,
|
||||||
|
|
|
@ -12,6 +12,7 @@ enum LicenseKeys {
|
||||||
openedVisits('FRE-HUB-OPENED-VISITS'),
|
openedVisits('FRE-HUB-OPENED-VISITS'),
|
||||||
vehicles('FRE-HUB-VEHICLES'),
|
vehicles('FRE-HUB-VEHICLES'),
|
||||||
residents('FRE-HUB-RESIDENTS'),
|
residents('FRE-HUB-RESIDENTS'),
|
||||||
|
about('FRE-HUB-ABOUT-SYSTEM'),
|
||||||
pets('FRE-HUB-PETS'),
|
pets('FRE-HUB-PETS'),
|
||||||
orders('FRE-HUB-ORDERS'),
|
orders('FRE-HUB-ORDERS'),
|
||||||
completeSchedule('FRE-HUB-COMPLETE-SCHEDULE'),
|
completeSchedule('FRE-HUB-COMPLETE-SCHEDULE'),
|
||||||
|
@ -236,6 +237,13 @@ class License {
|
||||||
startDate: '',
|
startDate: '',
|
||||||
quantity: 0,
|
quantity: 0,
|
||||||
),
|
),
|
||||||
|
Module(
|
||||||
|
key: LicenseKeys.about.value,
|
||||||
|
display: ModuleStatus.active.key,
|
||||||
|
expirationDate: '',
|
||||||
|
startDate: '',
|
||||||
|
quantity: 0,
|
||||||
|
),
|
||||||
Module(
|
Module(
|
||||||
key: LicenseKeys.logout.value,
|
key: LicenseKeys.logout.value,
|
||||||
display: ModuleStatus.active.key,
|
display: ModuleStatus.active.key,
|
||||||
|
|
36
pubspec.lock
36
pubspec.lock
|
@ -965,10 +965,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: io
|
name: io
|
||||||
sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
|
sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.4"
|
version: "1.0.5"
|
||||||
iregexp:
|
iregexp:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1117,10 +1117,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: material_symbols_icons
|
name: material_symbols_icons
|
||||||
sha256: a783133f87c58e10b1cc19797f7c3192ff9c2bab301c4ade90312d8f2aed01b2
|
sha256: "64404f47f8e0a9d20478468e5decef867a688660bad7173adcd20418d7f892c9"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.2800.2"
|
version: "4.2801.0"
|
||||||
maybe_just_nothing:
|
maybe_just_nothing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1181,10 +1181,26 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: package_config
|
name: package_config
|
||||||
sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
|
sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.0"
|
version: "2.1.1"
|
||||||
|
package_info_plus:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: package_info_plus
|
||||||
|
sha256: da8d9ac8c4b1df253d1a328b7bf01ae77ef132833479ab40763334db13b91cce
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "8.1.1"
|
||||||
|
package_info_plus_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: package_info_plus_platform_interface
|
||||||
|
sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.0.1"
|
||||||
page_transition:
|
page_transition:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -1221,10 +1237,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: path_provider_android
|
name: path_provider_android
|
||||||
sha256: "8c4967f8b7cb46dc914e178daa29813d83ae502e0529d7b0478330616a691ef7"
|
sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.14"
|
version: "2.2.15"
|
||||||
path_provider_foundation:
|
path_provider_foundation:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -1373,10 +1389,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: pub_semver
|
name: pub_semver
|
||||||
sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
|
sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.4"
|
version: "2.1.5"
|
||||||
pubspec_parse:
|
pubspec_parse:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -102,6 +102,7 @@ dependencies:
|
||||||
# dio: ^5.7.0
|
# dio: ^5.7.0
|
||||||
# crypto: ^3.0.5
|
# crypto: ^3.0.5
|
||||||
freezed_annotation: ^2.4.4
|
freezed_annotation: ^2.4.4
|
||||||
|
package_info_plus: ^8.1.1
|
||||||
# json_annotation: ^4.9.0
|
# json_annotation: ^4.9.0
|
||||||
|
|
||||||
dependency_overrides:
|
dependency_overrides:
|
||||||
|
|
Loading…
Reference in New Issue