Skip to content
Snippets Groups Projects
Commit f655f752 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Normalize architecture

parent cd97929b
No related branches found
No related tags found
1 merge request!35Resolve "Normalize architecture"
Pipeline #4541 passed
Showing
with 168 additions and 109 deletions
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
app.versionName=1.0.26 app.versionName=1.0.27
app.versionCode=27 app.versionCode=28
{ {
"app_name": "Random application", "app_name": "Sandbox App",
"bottom_nav_sample": "Sample", "bottom_nav_sample": "Sample",
"bottom_nav_chart": "Graph", "bottom_nav_chart": "Graph",
......
{ {
"app_name": "Random application", "app_name": "App de test",
"bottom_nav_sample": "Démo", "bottom_nav_sample": "Démo",
"bottom_nav_chart": "Graph", "bottom_nav_chart": "Graph",
......
import 'package:flutter/material.dart';
class AppColors {
static const Color primary = contentColorCyan;
static const Color menuBackground = Color(0xFF090912);
static const Color itemsBackground = Color(0xFF1B2339);
static const Color pageBackground = Color(0xFF282E45);
static const Color mainTextColor1 = Colors.white;
static const Color mainTextColor2 = Colors.white70;
static const Color mainTextColor3 = Colors.white38;
static const Color mainGridLineColor = Colors.white10;
static const Color borderColor = Colors.white54;
static const Color gridLinesColor = Color(0x11FFFFFF);
static const Color contentColorBlack = Colors.black;
static const Color contentColorWhite = Colors.white;
static const Color contentColorBlue = Color(0xFF2196F3);
static const Color contentColorYellow = Color(0xFFFFC300);
static const Color contentColorOrange = Color(0xFFFF683B);
static const Color contentColorGreen = Color(0xFF3BFF49);
static const Color contentColorPurple = Color(0xFF6E1BFF);
static const Color contentColorPink = Color(0xFFFF3AF2);
static const Color contentColorRed = Color(0xFFE80054);
static const Color contentColorCyan = Color(0xFF50E4FF);
}
...@@ -6,8 +6,8 @@ import 'package:hive/hive.dart'; ...@@ -6,8 +6,8 @@ import 'package:hive/hive.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart'; import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:random/ui/screens/skeleton_screen.dart'; import 'ui/screens/skeleton_screen.dart';
import 'package:random/config/theme.dart'; import 'config/theme.dart';
void main() async { void main() async {
/// Initialize packages /// Initialize packages
......
import 'dart:math'; import 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../config/app_colors.dart';
class GraphPainter extends CustomPainter { class GraphPainter extends CustomPainter {
const GraphPainter(); const GraphPainter();
double random(double max) { double random(double max) {
return Random().nextDouble() * max; return 0.1 * max + Random().nextDouble() * max * 0.8;
}
Color getRandomColor() {
const List<Color> availableColors = [
AppColors.contentColorCyan,
AppColors.contentColorGreen,
AppColors.contentColorOrange,
AppColors.contentColorPurple,
];
return availableColors[Random().nextInt(availableColors.length)];
} }
@override @override
...@@ -19,12 +33,14 @@ class GraphPainter extends CustomPainter { ...@@ -19,12 +33,14 @@ class GraphPainter extends CustomPainter {
canvas.drawRect(rectBackground, paintBackground); canvas.drawRect(rectBackground, paintBackground);
// Draw some lines // Draw some lines
final paintLine = Paint(); Paint paintLine = Paint();
paintLine.color = Colors.red;
paintLine.style = PaintingStyle.fill; paintLine.style = PaintingStyle.fill;
paintLine.strokeWidth = 2.0;
int linesCount = 500; int linesCount = 300;
for (int i = 0; i < linesCount; i++) { for (int i = 0; i < linesCount; i++) {
paintLine.color = getRandomColor();
Offset lineStart = Offset(random(size.width), random(size.height)); Offset lineStart = Offset(random(size.width), random(size.height));
Offset lineStop = Offset(random(size.width), random(size.height)); Offset lineStop = Offset(random(size.width), random(size.height));
canvas.drawLine(lineStart, lineStop, paintLine); canvas.drawLine(lineStart, lineStop, paintLine);
......
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../widgets/header.dart';
class AboutPage extends StatelessWidget { class AboutPage extends StatelessWidget {
const AboutPage({super.key}); const AboutPage({super.key});
...@@ -11,12 +13,8 @@ class AboutPage extends StatelessWidget { ...@@ -11,12 +13,8 @@ class AboutPage extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
children: <Widget>[ children: <Widget>[
SizedBox(height: 50), SizedBox(height: 8),
Text( Header(text: 'about_title'),
'about_title',
textAlign: TextAlign.start,
style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2),
).tr(),
Text('about_content').tr(), Text('about_content').tr(),
], ],
); );
......
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:ionicons/ionicons.dart'; import 'package:ionicons/ionicons.dart';
import 'package:random/config/theme.dart'; import '../../config/theme.dart';
import 'package:random/cubit/data_cubit.dart';
import 'package:random/cubit/settings_cubit.dart';
class ActivityDemoPage extends StatelessWidget { import '../../cubit/data_cubit.dart';
const ActivityDemoPage({super.key}); import '../../cubit/settings_cubit.dart';
import '../widgets/header.dart';
class DemoPage extends StatelessWidget {
const DemoPage({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SizedBox.expand( return Material(
child: Container( color: Theme.of(context).colorScheme.background,
child: FittedBox( child: ListView(
fit: BoxFit.contain, padding: const EdgeInsets.symmetric(horizontal: 4),
alignment: Alignment.center, physics: const BouncingScrollPhysics(),
child: SizedBox( children: <Widget>[
height: (MediaQuery.of(context).size.height), SizedBox(height: 8),
width: (MediaQuery.of(context).size.width), Header(text: 'TOP'),
child: Center( SizedBox(height: 20),
child: Column( persistedCounterBlock(),
mainAxisAlignment: MainAxisAlignment.spaceEvenly, SizedBox(height: 20),
crossAxisAlignment: CrossAxisAlignment.center, fakeApiCall(),
mainAxisSize: MainAxisSize.max, SizedBox(height: 20),
children: <Widget>[ Header(text: 'BOTTOM'),
Text('TOP').tr(), ],
SizedBox(height: 20),
persistedCounterBlock(),
SizedBox(height: 20),
fakeApiCall(),
SizedBox(height: 20),
Text('BOTTOM').tr(),
],
),
),
),
),
), ),
); );
} }
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:random/painters/GraphPainter.dart';
class ActivityGraphPage extends StatelessWidget { import '../painters/graph_painter.dart';
const ActivityGraphPage({super.key});
class GraphPage extends StatelessWidget {
const GraphPage({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
......
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:random/ui/widgets/settings_form.dart'; import '../widgets/header.dart';
import '../widgets/settings_form.dart';
class SettingsPage extends StatelessWidget { class SettingsPage extends StatelessWidget {
const SettingsPage({super.key}); const SettingsPage({super.key});
...@@ -13,12 +13,8 @@ class SettingsPage extends StatelessWidget { ...@@ -13,12 +13,8 @@ class SettingsPage extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
children: <Widget>[ children: <Widget>[
SizedBox(height: 50), SizedBox(height: 8),
Text( Header(text: 'settings_title'),
'settings_title',
textAlign: TextAlign.start,
style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2),
).tr(),
SizedBox(height: 8), SizedBox(height: 8),
SettingsForm(), SettingsForm(),
], ],
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:random/activities/ActivityDemoPage.dart'; import '../../cubit/bottom_nav_cubit.dart';
import 'package:random/activities/ActivityGraphPage.dart'; import '../../cubit/settings_cubit.dart';
import 'package:random/cubit/bottom_nav_cubit.dart';
import 'package:random/cubit/settings_cubit.dart';
import 'package:random/ui/screens/about_page.dart';
import 'package:random/ui/screens/settings_page.dart';
import 'package:random/ui/widgets/custom_app_bar.dart';
import 'package:random/ui/widgets/bottom_nav_bar.dart';
class SkeletonScreen extends StatelessWidget { import '../widgets/app_bar.dart';
import '../widgets/bottom_nav_bar.dart';
import 'demo_page.dart';
import 'graph_page.dart';
import 'about_page.dart';
import 'settings_page.dart';
class SkeletonScreen extends StatefulWidget {
const SkeletonScreen({super.key}); const SkeletonScreen({super.key});
@override
State<SkeletonScreen> createState() => _SkeletonScreenState();
}
class _SkeletonScreenState extends State<SkeletonScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
const List<Widget> pageNavigation = <Widget>[ const List<Widget> pageNavigation = <Widget>[
ActivityDemoPage(), DemoPage(),
ActivityGraphPage(), GraphPage(),
SettingsPage(), SettingsPage(),
AboutPage(), AboutPage(),
]; ];
...@@ -27,8 +34,8 @@ class SkeletonScreen extends StatelessWidget { ...@@ -27,8 +34,8 @@ class SkeletonScreen extends StatelessWidget {
child: BlocProvider<BottomNavCubit>( child: BlocProvider<BottomNavCubit>(
create: (BuildContext context) => BottomNavCubit(), create: (BuildContext context) => BottomNavCubit(),
child: Scaffold( child: Scaffold(
extendBodyBehindAppBar: true, extendBodyBehindAppBar: false,
appBar: const CustomAppBarGone(), appBar: StandardAppBar(),
body: BlocBuilder<BottomNavCubit, int>( body: BlocBuilder<BottomNavCubit, int>(
builder: (BuildContext context, int state) { builder: (BuildContext context, int state) {
return AnimatedSwitcher( return AnimatedSwitcher(
......
import 'package:flutter/material.dart';
import 'package:unicons/unicons.dart';
import '../widgets/header.dart';
class StandardAppBar extends StatelessWidget implements PreferredSizeWidget {
const StandardAppBar({super.key});
@override
Widget build(BuildContext context) {
return AppBar(
title: const Header(text: 'app_name'),
actions: [
IconButton(
onPressed: () {},
icon: const Icon(UniconsSolid.refresh),
),
],
);
}
@override
Size get preferredSize => const Size.fromHeight(50);
}
...@@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; ...@@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:ionicons/ionicons.dart'; import 'package:ionicons/ionicons.dart';
import 'package:random/cubit/bottom_nav_cubit.dart'; import '../../cubit/bottom_nav_cubit.dart';
class BottomNavBar extends StatelessWidget { class BottomNavBar extends StatelessWidget {
const BottomNavBar({super.key}); const BottomNavBar({super.key});
......
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class CustomAppBarGone extends StatelessWidget implements PreferredSizeWidget {
const CustomAppBarGone({super.key});
@override
Widget build(BuildContext context) {
final Brightness brightness = Theme.of(context).colorScheme.brightness;
return AppBar(
systemOverlayStyle: SystemUiOverlayStyle(
statusBarBrightness: brightness,
systemStatusBarContrastEnforced: false,
statusBarColor: Theme.of(context).colorScheme.background,
statusBarIconBrightness:
brightness == Brightness.dark ? Brightness.light : Brightness.dark,
),
backgroundColor: Colors.transparent,
excludeHeaderSemantics: true,
shadowColor: Colors.transparent,
scrolledUnderElevation: 0,
surfaceTintColor: Colors.transparent,
foregroundColor: Colors.transparent,
elevation: 0,
bottomOpacity: 0,
toolbarOpacity: 0,
);
}
@override
Size get preferredSize => const Size.fromHeight(0);
}
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
class ShowErrorWidget extends StatelessWidget {
const ShowErrorWidget({super.key, required this.message});
final String message;
@override
Widget build(BuildContext context) {
return Text(
'⚠️ ' + tr(message),
textAlign: TextAlign.start,
style: TextStyle(color: Colors.red),
);
}
}
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
class Header extends StatelessWidget {
const Header({super.key, required this.text});
final String text;
@override
Widget build(BuildContext context) {
return Text(
tr(text),
textAlign: TextAlign.start,
style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2),
);
}
}
...@@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; ...@@ -3,8 +3,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:unicons/unicons.dart'; import 'package:unicons/unicons.dart';
import 'package:random/cubit/bottom_nav_cubit.dart'; import '../../cubit/bottom_nav_cubit.dart';
import 'package:random/cubit/settings_cubit.dart'; import '../../cubit/settings_cubit.dart';
class SettingsForm extends StatefulWidget { class SettingsForm extends StatefulWidget {
const SettingsForm({super.key}); const SettingsForm({super.key});
......
...@@ -3,7 +3,7 @@ description: A random application, for testing purpose only. ...@@ -3,7 +3,7 @@ description: A random application, for testing purpose only.
publish_to: 'none' publish_to: 'none'
version: 1.0.26+27 version: 1.0.27+28
environment: environment:
sdk: '^3.0.0' sdk: '^3.0.0'
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment