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
android.useAndroidX=true
android.enableJetifier=true
app.versionName=1.0.26
app.versionCode=27
app.versionName=1.0.27
app.versionCode=28
{
"app_name": "Random application",
"app_name": "Sandbox App",
"bottom_nav_sample": "Sample",
"bottom_nav_chart": "Graph",
......
{
"app_name": "Random application",
"app_name": "App de test",
"bottom_nav_sample": "Démo",
"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';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:path_provider/path_provider.dart';
import 'package:random/ui/screens/skeleton_screen.dart';
import 'package:random/config/theme.dart';
import 'ui/screens/skeleton_screen.dart';
import 'config/theme.dart';
void main() async {
/// Initialize packages
......
import 'dart:math';
import 'package:flutter/material.dart';
import '../../config/app_colors.dart';
class GraphPainter extends CustomPainter {
const GraphPainter();
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
......@@ -19,12 +33,14 @@ class GraphPainter extends CustomPainter {
canvas.drawRect(rectBackground, paintBackground);
// Draw some lines
final paintLine = Paint();
paintLine.color = Colors.red;
Paint paintLine = Paint();
paintLine.style = PaintingStyle.fill;
paintLine.strokeWidth = 2.0;
int linesCount = 500;
int linesCount = 300;
for (int i = 0; i < linesCount; i++) {
paintLine.color = getRandomColor();
Offset lineStart = Offset(random(size.width), random(size.height));
Offset lineStop = Offset(random(size.width), random(size.height));
canvas.drawLine(lineStart, lineStop, paintLine);
......
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import '../widgets/header.dart';
class AboutPage extends StatelessWidget {
const AboutPage({super.key});
......@@ -11,12 +13,8 @@ class AboutPage extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
SizedBox(height: 50),
Text(
'about_title',
textAlign: TextAlign.start,
style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2),
).tr(),
SizedBox(height: 8),
Header(text: 'about_title'),
Text('about_content').tr(),
],
);
......
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:ionicons/ionicons.dart';
import 'package:random/config/theme.dart';
import 'package:random/cubit/data_cubit.dart';
import 'package:random/cubit/settings_cubit.dart';
import '../../config/theme.dart';
class ActivityDemoPage extends StatelessWidget {
const ActivityDemoPage({super.key});
import '../../cubit/data_cubit.dart';
import '../../cubit/settings_cubit.dart';
import '../widgets/header.dart';
class DemoPage extends StatelessWidget {
const DemoPage({super.key});
@override
Widget build(BuildContext context) {
return SizedBox.expand(
child: Container(
child: FittedBox(
fit: BoxFit.contain,
alignment: Alignment.center,
child: SizedBox(
height: (MediaQuery.of(context).size.height),
width: (MediaQuery.of(context).size.width),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
return Material(
color: Theme.of(context).colorScheme.background,
child: ListView(
padding: const EdgeInsets.symmetric(horizontal: 4),
physics: const BouncingScrollPhysics(),
children: <Widget>[
Text('TOP').tr(),
SizedBox(height: 8),
Header(text: 'TOP'),
SizedBox(height: 20),
persistedCounterBlock(),
SizedBox(height: 20),
fakeApiCall(),
SizedBox(height: 20),
Text('BOTTOM').tr(),
Header(text: 'BOTTOM'),
],
),
),
),
),
),
);
}
......
import 'package:flutter/material.dart';
import 'package:random/painters/GraphPainter.dart';
class ActivityGraphPage extends StatelessWidget {
const ActivityGraphPage({super.key});
import '../painters/graph_painter.dart';
class GraphPage extends StatelessWidget {
const GraphPage({super.key});
@override
Widget build(BuildContext context) {
......
import 'package:easy_localization/easy_localization.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 {
const SettingsPage({super.key});
......@@ -13,12 +13,8 @@ class SettingsPage extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
SizedBox(height: 50),
Text(
'settings_title',
textAlign: TextAlign.start,
style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2),
).tr(),
SizedBox(height: 8),
Header(text: 'settings_title'),
SizedBox(height: 8),
SettingsForm(),
],
......
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:random/activities/ActivityDemoPage.dart';
import 'package:random/activities/ActivityGraphPage.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';
import '../../cubit/bottom_nav_cubit.dart';
import '../../cubit/settings_cubit.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});
@override
State<SkeletonScreen> createState() => _SkeletonScreenState();
}
class _SkeletonScreenState extends State<SkeletonScreen> {
@override
Widget build(BuildContext context) {
const List<Widget> pageNavigation = <Widget>[
ActivityDemoPage(),
ActivityGraphPage(),
DemoPage(),
GraphPage(),
SettingsPage(),
AboutPage(),
];
......@@ -27,8 +34,8 @@ class SkeletonScreen extends StatelessWidget {
child: BlocProvider<BottomNavCubit>(
create: (BuildContext context) => BottomNavCubit(),
child: Scaffold(
extendBodyBehindAppBar: true,
appBar: const CustomAppBarGone(),
extendBodyBehindAppBar: false,
appBar: StandardAppBar(),
body: BlocBuilder<BottomNavCubit, int>(
builder: (BuildContext context, int state) {
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';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:ionicons/ionicons.dart';
import 'package:random/cubit/bottom_nav_cubit.dart';
import '../../cubit/bottom_nav_cubit.dart';
class BottomNavBar extends StatelessWidget {
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';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:unicons/unicons.dart';
import 'package:random/cubit/bottom_nav_cubit.dart';
import 'package:random/cubit/settings_cubit.dart';
import '../../cubit/bottom_nav_cubit.dart';
import '../../cubit/settings_cubit.dart';
class SettingsForm extends StatefulWidget {
const SettingsForm({super.key});
......
......@@ -3,7 +3,7 @@ description: A random application, for testing purpose only.
publish_to: 'none'
version: 1.0.26+27
version: 1.0.27+28
environment:
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