Add environment variables

main
3wish 2024-04-11 17:27:45 +08:00
parent b39bd90b1f
commit 5811c5315f
9 changed files with 151 additions and 8 deletions

1
.dev.env 100644
View File

@ -0,0 +1 @@
SERVER_HOST=http://116.205.141.108:80/api

1
.local.env 100644
View File

@ -0,0 +1 @@
SERVER_HOST=http://10.0.2.2:8000

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:together_mobile/utils/env.dart';
import '/common/theme.dart'; import '/common/theme.dart';
import '/database/hive_database.dart'; import '/database/hive_database.dart';
@ -11,6 +12,7 @@ import 'notification_api.dart';
final easyLoading = EasyLoading.init(); final easyLoading = EasyLoading.init();
void main() async { void main() async {
await EnvConfig.loadEnv(Env.product);
initGetIt(); initGetIt();
await NotificationAPI.init(); await NotificationAPI.init();
HiveDatabase.registerAdapter(); HiveDatabase.registerAdapter();

49
lib/main_dev.dart 100644
View File

@ -0,0 +1,49 @@
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:together_mobile/utils/env.dart';
import '/common/theme.dart';
import '/database/hive_database.dart';
import '/router/router.dart';
import '/models/init_get_it.dart';
import 'notification_api.dart';
final easyLoading = EasyLoading.init();
void main() async {
await EnvConfig.loadEnv(Env.development);
initGetIt();
await NotificationAPI.init();
HiveDatabase.registerAdapter();
runApp(const Together());
}
class Together extends StatelessWidget {
const Together({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp.router(
debugShowCheckedModeBanner: false,
title: "Together",
theme: lightThemeData(context),
darkTheme: darkThemeData(context),
routerConfig: router,
// This builder is used to dismiss keyboard while tap anywhere of the
// screen excluding the input widgets.
builder: (context, child) {
child = easyLoading(context, child);
child = GestureDetector(
onTap: () {
if (FocusManager.instance.primaryFocus != null) {
FocusManager.instance.primaryFocus!.unfocus();
}
},
child: child,
);
return child;
},
);
}
}

View File

@ -0,0 +1,51 @@
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import '/common/theme.dart';
import '/database/hive_database.dart';
import '/router/router.dart';
import '/models/init_get_it.dart';
import '/utils/env.dart';
import 'notification_api.dart';
final easyLoading = EasyLoading.init();
//
void main() async {
await EnvConfig.loadEnv(Env.local);
initGetIt();
await NotificationAPI.init();
HiveDatabase.registerAdapter();
runApp(const Together());
}
class Together extends StatelessWidget {
const Together({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp.router(
debugShowCheckedModeBanner: false,
title: "Together",
theme: lightThemeData(context),
darkTheme: darkThemeData(context),
routerConfig: router,
// This builder is used to dismiss keyboard while tap anywhere of the
// screen excluding the input widgets.
builder: (context, child) {
child = easyLoading(context, child);
child = GestureDetector(
onTap: () {
if (FocusManager.instance.primaryFocus != null) {
FocusManager.instance.primaryFocus!.unfocus();
}
},
child: child,
);
return child;
},
);
}
}

View File

@ -1,14 +1,15 @@
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import '/models/init_get_it.dart'; import '/models/init_get_it.dart';
import '/models/token_model.dart'; import '/models/token_model.dart';
const baseUrl = 'http://10.0.2.2:8000/api'; final baseUrl = dotenv.env['SERVER_HOST'];
const userAvatarsUrl = 'http://10.0.2.2:8000/static/avatars/user'; final userAvatarsUrl = '$baseUrl/static/avatars/user';
const groupChatAvatarsUrl = 'http://10.0.2.2:8000/static/avatars/group_chat'; final groupChatAvatarsUrl = '$baseUrl/static/avatars/group_chat';
final baseOptions = BaseOptions( final baseOptions = BaseOptions(
baseUrl: baseUrl, baseUrl: baseUrl!,
connectTimeout: const Duration(seconds: 5), connectTimeout: const Duration(seconds: 5),
receiveTimeout: const Duration(seconds: 5), receiveTimeout: const Duration(seconds: 5),
); );
@ -16,10 +17,10 @@ final baseOptions = BaseOptions(
var request = Dio(baseOptions) var request = Dio(baseOptions)
..interceptors.add( ..interceptors.add(
InterceptorsWrapper( InterceptorsWrapper(
onRequest: onRequest: (
(RequestOptions options, RequestInterceptorHandler handler) async { RequestOptions options,
String baseUrl = options.baseUrl.replaceFirst('/api', ''); RequestInterceptorHandler handler,
options.baseUrl = baseUrl; ) async {
if (getIt.get<Token>().token != '') { if (getIt.get<Token>().token != '') {
options.headers['Authorization'] = options.headers['Authorization'] =
'Bearer ${getIt.get<Token>().token}'; 'Bearer ${getIt.get<Token>().token}';

27
lib/utils/env.dart 100644
View File

@ -0,0 +1,27 @@
import 'package:flutter_dotenv/flutter_dotenv.dart';
enum Env {
product,
development,
local,
}
class EnvConfig {
static late Env env;
static Future<void> loadEnv(Env e) async {
switch (e) {
case Env.local:
env = Env.local;
await dotenv.load(fileName: '.local.env');
break;
case Env.development:
env = Env.development;
await dotenv.load(fileName: '.dev.env');
break;
case Env.product:
await dotenv.load(fileName: '.prod.env');
break;
}
}
}

View File

@ -390,6 +390,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.3" version: "1.0.3"
flutter_dotenv:
dependency: "direct main"
description:
name: flutter_dotenv
sha256: "9357883bdd153ab78cbf9ffa07656e336b8bbb2b5a3ca596b0b27e119f7c7d77"
url: "https://pub.dev"
source: hosted
version: "5.1.0"
flutter_easyloading: flutter_easyloading:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -39,6 +39,7 @@ dependencies:
fast_rsa: ^3.5.7 fast_rsa: ^3.5.7
flutter: flutter:
sdk: flutter sdk: flutter
flutter_dotenv: ^5.1.0
flutter_easyloading: ^3.0.5 flutter_easyloading: ^3.0.5
flutter_local_notifications: ^17.0.0 flutter_local_notifications: ^17.0.0
flutter_pickers: ^2.1.9 flutter_pickers: ^2.1.9
@ -84,6 +85,8 @@ flutter:
assets: assets:
- assets/images/ - assets/images/
- assets/icons/ - assets/icons/
- .local.env
- .dev.env
# An image asset can refer to one or more resolution-specific "variants", see # An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware # https://flutter.dev/assets-and-images/#resolution-aware
# For details regarding adding assets from package dependencies, see # For details regarding adding assets from package dependencies, see