8000 Create flavor development and production in Dart · CoderJava/Flutter-News-App@b438bec · GitHub
[go: up one dir, main page]

Skip to content
8000

Commit b438bec

Browse files
committed
Create flavor development and production in Dart
1 parent 42c3002 commit b438bec

File tree

4 files changed

+191
-109
lines changed

4 files changed

+191
-109
lines changed

lib/app.dart

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import 'dart:io';
2+
3+
import 'package:easy_localization/easy_localization.dart';
4+
import 'package:flutter/material.dart';
5+
import 'package:flutter/services.dart';
6+
import 'package:flutter_news_app/config/flavor_config.dart';
7+
import 'package:flutter_news_app/core/route/app_route.dart';
8+
import 'package:flutter_news_app/feature/presentation/page/splash/splash_page.dart';
9+
10+
class App extends StatefulWidget {
11+
const App({Key? key}) : super(key: key);
12+
13+
@override
14+
State<App> createState() => _AppState();
15+
}
16+
17+
class _AppState extends State<App> {
18+
19+
@override
20+
void initState() {
21+
WidgetsBinding.instance.addPostFrameCallback((_) async {
22+
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
23+
});
24+
super.initState();
25+
}
26+
27+
@override
28+
Widget build(BuildContext context) {
29+
return MaterialApp(
30+
debugShowCheckedModeBanner: FlavorConfig.instance.flavor == Flavor.development,
31+
localizationsDelegates: context.localizationDelegates,
32+
supportedLocales: context.supportedLocales,
33+
locale: context.locale,
34+
theme: ThemeData(
35+
primarySwatch: const MaterialColor(
36+
0xFFFFC63F,
37+
<int, Color>{
38+
50: Color(0xFFFFF9E4),
39+
100: Color(0xFFFFEDBA),
40+
200: Color(0xFFFFE28F),
41+
300: Color(0xFFFFD864),
42+
400: Color(0xFFFFCE4A),
43+
500: Color(0xFFFFC63F),
44+
600: Color(0xFFFFB83A),
45+
700: Color(0xFFFFA636),
46+
800: Color(0xFFFE9734),
47+
900: Color(0xFFFB7A30),
48+
},
49+
),
50+
),
51+
title: FlavorConfig.instance.flavor == Flavor.development ? 'Dev FNews' : 'FNews',
52+
home: SplashPage(),
53+
onGenerateRoute: (RouteSettings settings) => AppRoute.onGenerateRoute(settings),
54+
builder: (context, child) {
55+
return GestureDetector(
56+
onTap: () {
57+
if (Platform.isIOS) {
58+
hideSoftKeyboard();
59+
}
60+
},
61+
child: MediaQuery(
62+
data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0),
63+
child: child!,
64+
),
65+
);
66+
},
67+
);
68+
}
69+
70+
hideSoftKeyboard() {
71+
final currentFocus = FocusScope.of(context);
72+
if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
73+
FocusManager.instance.primaryFocus?.unfocus();
74+
}
75+
}
76+
}

lib/main.dart

Lines changed: 39 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -1,113 +1,43 @@
1-
import 'package:flutter/material.dart';
2-
3-
void main() {
4-
runApp(MyApp());
5-
}
6-
7-
class MyApp extends StatelessWidget {
8-
// This widget is the root of your application.
9-
@override
10-
Widget build(BuildContext context) {
11-
return MaterialApp(
12-
title: 'Flutter Demo',
13-
theme: ThemeData(
14-
// This is the theme of your application.
15-
//
16-
// Try running your application with "flutter run". You'll see the
17-
// application has a blue toolbar. Then, without quitting the app, try
18-
// changing the primarySwatch below to Colors.green and then invoke
19-
// "hot reload" (press "r" in the console where you ran "flutter run",
20-
// or simply save your changes to "hot reload" in a Flutter IDE).
21-
// Notice that the counter didn't reset back to zero; the application
22-
// is not restarted.
23-
primarySwatch: Colors.blue,
24-
),
25-
home: MyHomePage(title: 'Flutter Demo Home Page'),
26-
);
27-
}
28-
}
29-
30-
class MyHomePage extends StatefulWidget {
31-
MyHomePage({Key? key, required this.title}) : super(key: key);
32-
33-
// This widget is the home page of your application. It is stateful, meaning
34-
// that it has a State object (defined below) that contains fields that affect
35-
// how it looks.
1+
import 'dart:async';
362

37-
// This class is the configuration for the state. It holds the values (in this
38-
// case the title) provided by the parent (in this case the App widget) and
39-
// used by the build method of the State. Fields in a Widget subclass are
40-
// always marked "final".
41-
42-
final String title;
43-
44-
@override
45-
_MyHomePageState createState() => _MyHomePageState();
46-
}
47-
48-
class _MyHomePageState extends State<MyHomePage> {
49-
int _counter = 0;
50-
51-
void _incrementCounter() {
52-
setState(() {
53-
// This call to setState tells the Flutter framework that something has
54-
// changed in this State, which causes it to rerun the build method below
55-
// so that the display can reflect the updated values. If we changed
56-
// _counter without calling setState(), then the build method would not be
57-
// called again, and so nothing would appear to happen.
58-
_counter++;
59-
});
60-
}
61-
62-
@override
63-
Widget build(BuildContext context) {
64-
// This method is rerun every time setState is called, for instance as done
65-
// by the _incrementCounter method above.
66-
//
67-
// The Flutter framework has been optimized to make rerunning build methods
68-
// fast, so that you can just rebuild anything that needs updating rather
69-
// than having to individually change instances of widgets.
70-
return Scaffold(
71-
appBar: AppBar(
72-
// Here we take the value from the MyHomePage object that was created by
73-
// the App.build method, and use it to set our appbar title.
74-
title: Text(widget.title),
75-
),
76-
body: Center(
77-
// Center is a layout widget. It takes a single child and positions it
78-
// in the middle of the parent.
79-
child: Column(
80-
// Column is also a layout widget. It takes a list of children and
81-
// arranges them vertically. By default, it sizes itself to fit its
82-
// children horizontally, and tries to be as tall as its parent.
83-
//
84-
// Invoke "debug painting" (press "p" in the console, choose the
85-
// "Toggle Debug Paint" action from the Flutter Inspector in Android
86-
// Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
87-
// to see the wireframe for each widget.
88-
//
89-
// Column has various properties to control how it sizes itself and
90-
// how it positions its children. Here we use mainAxisAlignment to
91-
// center the children vertically; the main axis here is the vertical
92-
// axis because Columns are vertical (the cross axis would be
93-
// horizontal).
94-
mainAxisAlignment: MainAxisAlignment.center,
95-
children: <Widget>[
96-
Text(
97-
'You have pushed the button this many times:',
98-
),
99-
Text(
100-
'$_counter',
101-
style: Theme.of(context).textTheme.headline4,
102-
),
3+
import 'package:easy_localization/easy_localization.dart';
4+
import 'package:flutter/material.dart';
5+
import 'package:flutter_news_app/app.dart';
6+
import 'package:flutter_news_app/config/base_url_config.dart';
7+
import 'package:flutter_news_app/config/flavor_config.dart';
8+
import 'package:flutter_news_app/core/util/constant_value.dart';
9+
10+
void main() async {
11+
WidgetsFlutterBinding.ensureInitialized();
12+
await EasyLocalization.ensureInitialized();
13+
final constantColor = ConstantColor();
14+
final baseUrlConfig = BaseUrlConfig();
15+
FlavorConfig(
16+
flavor: Flavor.production,
17+
colorPrimary: constantColor.primaryColor500,
18+
colorAccent: constantColor.accentColor,
19+
colorPrimaryDark: constantColor.primaryColor900,
20+
colorPrimaryLight: constantColor.primaryColor50,
21+
values: FlavorValues(
22+
baseUrlNewsEndpoint: baseUrlConfig.baseUrlNewsProduction + baseUrlConfig.prefixNewsEndpointV2,
23+
),
24+
);
25+
runZonedGuarded(
26+
() {
27+
runApp(
28+
EasyLocalization(
29+
supportedLocales: const [
30+
Locale('en', 'US'),
31+
Locale('id', 'ID'),
10332
],
33+
path: 'assets/translations',
34+
child: const App(),
10435
),
105-
),
106-
floatingActionButton: FloatingActionButton(
107-
onPressed: _incrementCounter,
108-
tooltip: 'Increment',
109-
child: Icon(Icons.add),
110-
), // This trailing comma makes auto-formatting nicer for build methods.
111-
);
112-
}
36+
);
37+
},
38+
(error, stacktrace) {
39+
debugPrint('runZonedGuarded: Caught error in my root zone.');
40+
debugPrint('stacktrace: $stacktrace');
41+
},
42+
);
11343
}

lib/main_development.dart

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import 'package:easy_localization/easy_localization.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:flutter_news_app/app.dart';
4+
import 'package:flutter_news_app/config/base_url_config.dart';
5+
import 'package:flutter_news_app/config/flavor_config.dart';
6+
import 'package:flutter_news_app/core/util/constant_value.dart';
7+
8+
void main() async {
9+
WidgetsFlutterBinding.ensureInitialized();
10+
await EasyLocalization.ensureInitialized();
11+
final constantColor = ConstantColor();
12+
final baseUrlConfig = BaseUrlConfig();
13+
FlavorConfig(
14+
flavor: Flavor.development,
15+
colorPrimary: constantColor.primaryColor500,
16+
colorAccent: constantColor.accentColor,
17+
colorPrimaryDark: constantColor.primaryColor900,
18+
colorPrimaryLight: constantColor.primaryColor50,
19+
values: FlavorValues(
20+
baseUrlNewsEndpoint: baseUrlConfig.baseUrlNewsProduction + baseUrlConfig.prefixNewsEndpointV2,
21+
),
22+
);
23+
runApp(
24+
EasyLocalization(
25+
supportedLocales: const [
26+
Locale('en', 'US'),
27+
Locale('id', 'ID'),
28+
],
29+
path: 'assets/translations',
30+
child: const App(),
31+
),
32+
);
33+
}

lib/main_production.dart

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import 'dart:async';
2+
3+
import 'package:easy_localization/easy_localization.dart';
4+
import 'package:flutter/material.dart';
5+
import 'package:flutter_news_app/app.dart';
6+
import 'package:flutter_news_app/config/base_url_config.dart';
7+
import 'package:flutter_news_app/config/flavor_config.dart';
8+
import 'package:flutter_news_app/core/util/constant_value.dart';
9+
10+
void main() async {
11+
WidgetsFlutterBinding.ensureInitialized();
12+
await EasyLocalization.ensureInitialized();
13+
final constantColor = ConstantColor();
14+
final baseUrlConfig = BaseUrlConfig();
15+
FlavorConfig(
16+
flavor: Flavor.production,
17+
colorPrimary: constantColor.primaryColor500,
18+
colorAccent: constantColor.accentColor,
19+
colorPrimaryDark: constantColor.primaryColor900,
20+
colorPrimaryLight: constantColor.primaryColor50,
21+
values: FlavorValues(
22+
baseUrlNewsEndpoint: baseUrlConfig.baseUrlNewsProduction + baseUrlConfig.prefixNewsEndpointV2,
23+
),
24+
);
25+
runZonedGuarded(
26+
() {
27+
runApp(
28+
EasyLocalization(
29+
supportedLocales: const [
30+
Locale('en', 'US'),
31+
Locale('id', 'ID'),
32+
],
33+
path: 'assets/translations',
34+
child: const App(),
35+
),
36+
);
37+
},
38+
(error, stacktrace) {
39+
debugPrint('runZonedGuarded: Caught error in my root zone.');
40+
debugPrint('stacktrace: $stacktrace');
41+
},
42+
);
43+
}

0 commit comments

Comments
 (0)
0