You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
619 lines
16 KiB
619 lines
16 KiB
10 months ago
|
import 'dart:io';
|
||
|
import 'dart:typed_data';
|
||
|
import 'package:flutter/material.dart';
|
||
|
import 'dart:convert';
|
||
|
import 'package:flutter/services.dart';
|
||
|
import 'package:capture/common/preloader.dart';
|
||
|
import 'package:http/http.dart' as http;
|
||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||
|
import 'package:intl/intl.dart';
|
||
|
import 'dart:async';
|
||
|
import 'package:fluttertoast/fluttertoast.dart';
|
||
|
import 'package:path/path.dart' as path;
|
||
|
|
||
|
//const Color primaryColor = Color(0XFF1786A3);
|
||
|
const Color primaryColor = Color(0XFF68A85D);
|
||
|
const Color secondaryColor = Color(0XFFA0C899);
|
||
|
const Color buttonColors = Color(0XFFFFAC1C);
|
||
|
const Color greyColor = Color(0XFF8F8E8E);
|
||
|
const Color textFieldStartColor = Colors.grey;
|
||
|
const Color screenBackgroundColor = Color(0XFFEAF6FF);
|
||
|
const Color screenBackgroundColord = Colors.black12;
|
||
|
const Color dashboardbackground = Color(0XFFF5F5F5);
|
||
|
|
||
|
//Color AppBarGradient_1 = Color(0XFF1258F6);
|
||
|
Color AppBarGradient_1 = Color(0XFF68A85D);
|
||
|
|
||
|
TextStyle PreloaderText() {
|
||
|
return TextStyle(color: Color(0XFF68A85D));
|
||
|
}
|
||
|
|
||
|
TextStyle labelTextStyle() {
|
||
|
return TextStyle(color: primaryColor, fontSize: 12);
|
||
|
}
|
||
|
|
||
|
TextStyle labelTextStyleOrderMedicine() {
|
||
|
return TextStyle(color: primaryColor, fontSize: 12,fontWeight: FontWeight.bold);
|
||
|
}
|
||
|
|
||
|
TextStyle haveMotorTextStyle() {
|
||
|
return TextStyle(
|
||
|
color: Colors.red, fontSize: 12, fontWeight: FontWeight.bold);
|
||
|
}
|
||
|
|
||
|
TextStyle textButtonStyle() {
|
||
|
return TextStyle(color: primaryColor, fontSize: 15);
|
||
|
}
|
||
|
|
||
|
TextStyle textButtonStyleReports() {
|
||
|
return TextStyle(color: Colors.white, fontSize: 12);
|
||
|
}
|
||
|
|
||
|
TextStyle iconBelowTextStyle() {
|
||
|
return TextStyle(fontSize: 10, color: primaryColor);
|
||
|
}
|
||
|
|
||
|
TextStyle valuesTextStyle() {
|
||
|
return TextStyle(
|
||
|
fontSize: 12,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
TextStyle recordDetailsHeading() {
|
||
|
return TextStyle(
|
||
|
fontSize: 14,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
TextStyle problemTextStyle() {
|
||
|
return TextStyle(
|
||
|
fontSize: 12,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
color: Colors.red
|
||
|
);
|
||
|
}
|
||
|
|
||
|
TextStyle headingsTextStyle() {
|
||
|
return TextStyle(
|
||
|
fontSize: 12,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
color: primaryColor
|
||
|
);
|
||
|
}
|
||
|
|
||
|
TextStyle startAndStopHeading() {
|
||
|
return TextStyle(
|
||
|
fontSize: 14,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
color: primaryColor,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
Text capacitySuffixText() {
|
||
|
return Text('in Ltrs.');
|
||
|
}
|
||
|
|
||
|
Text dimensionSuffixText() {
|
||
|
return Text('in fts');
|
||
|
}
|
||
|
|
||
|
TextStyle dashboardTextStyle() {
|
||
|
return TextStyle(
|
||
|
color: Colors.white,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
TextStyle labelTextStyleBold() {
|
||
|
return TextStyle(
|
||
|
color: primaryColor,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
TextStyle serverIssueTextStyle() {
|
||
|
return TextStyle(color: Colors.red, fontSize: 15);
|
||
|
}
|
||
|
|
||
|
TextStyle bottomSheetValuesTextStyle() {
|
||
|
return TextStyle(
|
||
|
fontSize: 12,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
overflow: TextOverflow.ellipsis,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
TextStyle wrapTextStyle() {
|
||
|
return TextStyle(
|
||
|
color: primaryColor,
|
||
|
fontSize: 12,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
overflow: TextOverflow.ellipsis,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
TextStyle wrapTextStyleBlack() {
|
||
|
return TextStyle(
|
||
|
color: Colors.black,
|
||
|
fontSize: 12,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
overflow: TextOverflow.ellipsis,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
TextStyle withoutWrapTextStyle() {
|
||
|
return TextStyle(
|
||
|
fontSize: 12,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
TextStyle bmiTextStyle() {
|
||
|
return TextStyle(
|
||
|
color: primaryColor,
|
||
|
fontSize: 16,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
TextStyle drawerListItemsTextStyle() {
|
||
|
return TextStyle(color: Colors.white);
|
||
|
}
|
||
|
|
||
|
TextStyle drawerHeaderTextStyle() {
|
||
|
return TextStyle(color: Colors.white, fontSize: 15);
|
||
|
}
|
||
|
|
||
|
TextStyle drawerHeaderTextStyleNew() {
|
||
|
return TextStyle(color: Colors.black, fontSize: 15);
|
||
|
}
|
||
|
TextStyle radioHeadingTextStyle() {
|
||
|
return TextStyle(color: Colors.white);
|
||
|
}
|
||
|
TextStyle radioItemsTextStyle() {
|
||
|
return TextStyle(color: Colors.white,fontSize: 11);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
InputDecoration textFormFieldDecoration(IconData icon, var text) {
|
||
|
return InputDecoration(
|
||
|
filled: true,
|
||
|
fillColor: primaryColor,
|
||
|
prefixIcon: Icon(
|
||
|
icon,
|
||
|
color: Colors.white,
|
||
|
),
|
||
|
border: OutlineInputBorder(borderSide: BorderSide(color: Colors.white)),
|
||
|
focusedBorder: OutlineInputBorder(
|
||
|
borderSide: BorderSide(color: Colors.white),
|
||
|
),
|
||
|
enabledBorder: OutlineInputBorder(
|
||
|
borderSide: BorderSide(color: Colors.white),
|
||
|
),
|
||
|
labelText: text,
|
||
|
labelStyle: TextStyle(
|
||
|
color: Colors.white, //<-- SEE HERE
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
|
||
|
InputDecoration textFormFieldDecorationGrey(IconData icon, var text) {
|
||
|
return InputDecoration(
|
||
|
prefixIcon: Icon(
|
||
|
icon,
|
||
|
color: greyColor,
|
||
|
),
|
||
|
border: OutlineInputBorder(
|
||
|
borderSide: BorderSide(color: greyColor)),
|
||
|
focusedBorder: OutlineInputBorder(
|
||
|
borderSide: BorderSide(color: greyColor),
|
||
|
),
|
||
|
enabledBorder: OutlineInputBorder(
|
||
|
borderSide: BorderSide(color: greyColor),
|
||
|
),
|
||
|
labelText: text,
|
||
|
labelStyle: TextStyle(
|
||
|
color: greyColor, //<-- SEE HERE
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
|
||
|
InputDecoration textFormFieldDecorationBMI(IconData icon, var text) {
|
||
|
return InputDecoration(
|
||
|
//filled: true,
|
||
|
//fillColor: Colors.white,
|
||
|
prefixIcon: Icon(
|
||
|
icon,
|
||
|
color: primaryColor,
|
||
|
),
|
||
|
border: OutlineInputBorder(borderSide: BorderSide(color: primaryColor)),
|
||
|
focusedBorder: OutlineInputBorder(
|
||
|
borderSide: BorderSide(color: primaryColor),
|
||
|
),
|
||
|
enabledBorder: OutlineInputBorder(
|
||
|
borderSide: BorderSide(color: primaryColor),
|
||
|
),
|
||
|
labelText: text,
|
||
|
labelStyle: TextStyle(
|
||
|
color: Colors.grey, //<-- SEE HERE
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
final GlobalKey<State> preloaderWindowKey = new GlobalKey<State>();
|
||
|
Future<void> preloaderWindow(BuildContext context) async {
|
||
|
try {
|
||
|
Dialogs.showLoadingDialog(context, preloaderWindowKey);
|
||
|
} catch (error) {}
|
||
|
}
|
||
|
|
||
|
class AppSettings {
|
||
|
static SharedPreferences sharedPreferences =
|
||
|
SharedPreferences.getInstance() as SharedPreferences;
|
||
|
static String userName = '';
|
||
|
static String userAddress = '';
|
||
|
static String detailedAddress = '';
|
||
|
static String emergencyContactNumber1 = '';
|
||
|
static String emergencyContactNumber2 = '';
|
||
|
static String emergencyRelation1 = '';
|
||
|
static String emergencyRelation2 = '';
|
||
|
static String emergencyRelationName1 = '';
|
||
|
static String emergencyRelationName2 = '';
|
||
|
static String bloodGroup = '';
|
||
|
static String email = '';
|
||
|
static String age = '';
|
||
|
static String gender = '';
|
||
|
static String phoneNumber = '';
|
||
|
static String accessToken = '';
|
||
|
static String customerId = '';
|
||
|
static double userLatitude = 0;
|
||
|
static double userLongitude = 0;
|
||
|
static String customerIdsign = '';
|
||
|
static String profileImage = '';
|
||
|
static List<String> storedPreferenceValidKeys = ['username', 'access_token'];
|
||
|
static String preloadText = 'Please wait';
|
||
|
static String latitude = '';
|
||
|
static String longitude = '';
|
||
|
static bool servicestatus = false;
|
||
|
static bool haspermission = false;
|
||
|
static String fcmId = '';
|
||
|
static String originalQrCode = '';
|
||
|
static String qrCode = '';
|
||
|
static String serverToken =
|
||
|
'AAAAA66BLaA:APA91bHcmbyiNN8hCL-t-M9oH-u7ZMOl74fcImMM2DQZLgdyY98Wu9XxME-CTPcjpjU6Yy48ouxISrOMb9lpa3PJofh8qciUKMNxV2al-bDvGvPP_VVaH0mrTHzR56hdkGy1Zl-0frDO';
|
||
|
|
||
|
//api urls
|
||
|
//static String host = 'http://35.200.129.165:4000/api/';
|
||
|
static String host = 'http://cloudh.in:4000/api/';
|
||
|
static String loginUrl = host + 'dataCaptureAdminlogin';
|
||
|
static String signUpUrl = host + 'adminDataCaptureSignup';
|
||
|
static String getAllMedicinesDataUrl = host + 'getAllMedicineData';
|
||
|
static String resetTokenUrl = host + 'reset_token';
|
||
|
static String medicinesUploadPicUrl = host + 'uploads-dataCapture';
|
||
|
|
||
|
|
||
|
static File? updatedImage;
|
||
|
static String image = '';
|
||
|
static String profilePictureUrl = '';
|
||
|
static String bloodGroupPictureUrl = '';
|
||
|
static var api = {
|
||
|
'signIn': host + '/login',
|
||
|
};
|
||
|
|
||
|
/*Formatter*/
|
||
|
static String formNum(String s) {
|
||
|
var comma = NumberFormat('#,##,###', 'en_IN');
|
||
|
return comma.format(
|
||
|
int.parse(s),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
static String formDouble(String s) {
|
||
|
var comma = NumberFormat('#,##,###.##', 'en_IN');
|
||
|
return comma.format(
|
||
|
double.parse(s),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/* Preloader */
|
||
|
static GlobalKey<State> preLoaderKey = new GlobalKey<State>();
|
||
|
static Future<void> preLoaderDialog(BuildContext context) async {
|
||
|
try {
|
||
|
preLoaderKey = new GlobalKey<State>();
|
||
|
Dialogs.showLoadingDialog(context, preLoaderKey);
|
||
|
} catch (error) {}
|
||
|
}
|
||
|
|
||
|
////request headers with content type
|
||
|
static Future<Map<String, String>> buildRequestHeaders() async {
|
||
|
Map<String, String> _headers = new Map<String, String>();
|
||
|
_headers[HttpHeaders.contentTypeHeader] = 'application/json';
|
||
|
_headers['Authorization'] = accessToken;
|
||
|
return _headers;
|
||
|
}
|
||
|
|
||
|
//request headers without content type
|
||
|
static Future<Map<String, String>> buildPutRequestHeaders() async {
|
||
|
Map<String, String> _headers = new Map<String, String>();
|
||
|
_headers['Authorization'] = accessToken;
|
||
|
return _headers;
|
||
|
}
|
||
|
|
||
|
static Future<Map<String, String>>
|
||
|
buildPutRequestHeadersForResetToken() async {
|
||
|
Map<String, String> _headers = new Map<String, String>();
|
||
|
return _headers;
|
||
|
}
|
||
|
|
||
|
// Shared preferences save,get and clear data
|
||
|
static saveData(String _key, _value, type) async {
|
||
|
sharedPreferences = await SharedPreferences.getInstance();
|
||
|
|
||
|
if (type == 'STRING') {
|
||
|
await sharedPreferences.setString(_key, _value.toString());
|
||
|
} else if (type == 'INTEGER') {
|
||
|
await sharedPreferences.setInt(_key, _value);
|
||
|
} else if (type == 'BOOL') {
|
||
|
await sharedPreferences.setBool(_key, _value);
|
||
|
} else if (type == 'DOUBLE') {
|
||
|
await sharedPreferences.setDouble(_key, _value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static getData(String _key, type) async {
|
||
|
sharedPreferences = await SharedPreferences.getInstance();
|
||
|
if (type == 'STRING') {
|
||
|
return sharedPreferences.getString(_key) ?? '';
|
||
|
} else if (type == 'INTEGER') {
|
||
|
return sharedPreferences.getInt(_key) ?? -1;
|
||
|
} else if (type == 'BOOL') {
|
||
|
return sharedPreferences.getBool(_key) ?? -1;
|
||
|
} else if (type == 'DOUBLE') {
|
||
|
return sharedPreferences.getDouble(_key) ?? -1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static clearSharedPrefeences() async {
|
||
|
sharedPreferences = await SharedPreferences.getInstance();
|
||
|
await sharedPreferences.clear();
|
||
|
}
|
||
|
|
||
|
/*Sign in check*/
|
||
|
static Future<bool> isSigIn() async {
|
||
|
bool isSignInCheck = true;
|
||
|
for (var eachKey in storedPreferenceValidKeys) {
|
||
|
if (await getData(eachKey, 'STRING') == '') {
|
||
|
isSignInCheck = false;
|
||
|
}
|
||
|
}
|
||
|
return isSignInCheck;
|
||
|
}
|
||
|
|
||
|
static Future<bool> internetConnectivity() async {
|
||
|
try {
|
||
|
final result = await InternetAddress.lookup('google.com');
|
||
|
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
|
||
|
return true;
|
||
|
}
|
||
|
} on SocketException catch (_) {
|
||
|
return false;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/*Apis Starts here*/
|
||
|
|
||
|
static Future<bool> login(payload) async {
|
||
|
var response = await http.post(Uri.parse(loginUrl),
|
||
|
body: json.encode(payload),
|
||
|
headers: {'Content-type': 'application/json'});
|
||
|
|
||
|
if (response.statusCode == 200) {
|
||
|
try {
|
||
|
var _response = json.decode(response.body);
|
||
|
|
||
|
await saveAvailableReportAndLocationsInMemory(_response);
|
||
|
//await saveProfilePic(_response);
|
||
|
return true;
|
||
|
|
||
|
} catch (e) {
|
||
|
// display error toast
|
||
|
return false;
|
||
|
}
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static Future<bool> signUp(payload) async {
|
||
|
var response = await http.post(Uri.parse(signUpUrl),
|
||
|
body: json.encode(payload),
|
||
|
headers: {'Content-type': 'application/json'});
|
||
|
|
||
|
if (response.statusCode == 200) {
|
||
|
try {
|
||
|
var _response = json.decode(response.body);
|
||
|
//customerIdsign = _response['armintahealthdata']['customerId'];
|
||
|
print(_response);
|
||
|
return true;
|
||
|
} catch (e) {
|
||
|
// display error toast
|
||
|
return false;
|
||
|
}
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static Future<String> getAllMedicinesData() async {
|
||
|
var uri = Uri.parse(getAllMedicinesDataUrl+'/'+userName.toString().toLowerCase());
|
||
|
|
||
|
var response = await http.get(uri, headers: await buildRequestHeaders());
|
||
|
if (response.statusCode == 200) {
|
||
|
return response.body;
|
||
|
} else if (response.statusCode == 401) {
|
||
|
bool status = await AppSettings.resetToken();
|
||
|
if (status) {
|
||
|
response = await http.get(uri, headers: await buildRequestHeaders());
|
||
|
if (response.statusCode == 200) {
|
||
|
return response.body;
|
||
|
} else {
|
||
|
return '';
|
||
|
}
|
||
|
} else {
|
||
|
return '';
|
||
|
}
|
||
|
} else {
|
||
|
return '';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static Future<bool> resetToken() async {
|
||
|
var uri = Uri.parse(resetTokenUrl + '/' + customerId);
|
||
|
|
||
|
try {
|
||
|
// var response = await http.get(uri, headers: await buildPutRequestHeaders());
|
||
|
var response = await http.get(uri,
|
||
|
headers: await buildPutRequestHeadersForResetToken());
|
||
|
if (response.statusCode == 200) {
|
||
|
print(response.body);
|
||
|
var res = jsonDecode(response.body);
|
||
|
print(res);
|
||
|
|
||
|
accessToken = res['access_token'];
|
||
|
return true;
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
} catch (e) {
|
||
|
print(e);
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static Future<String> uploadMedicinesCamera(file) async {
|
||
|
var request = http.MultipartRequest('POST', Uri.parse(medicinesUploadPicUrl + '/' + customerId));
|
||
|
request.files.add(await http.MultipartFile.fromPath('picture', file.path));
|
||
|
var res = await request.send();
|
||
|
var response = await http.Response.fromStream(res);
|
||
|
return response.body;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*Apis ends here*/
|
||
|
|
||
|
//save data local
|
||
|
static Future<void> saveAvailableReportAndLocationsInMemory(
|
||
|
dynamic input) async {
|
||
|
// save login name information
|
||
|
await saveData('username', input['Data']['name'], 'STRING');
|
||
|
await saveData(
|
||
|
'access_token', input['token'], 'STRING');
|
||
|
await saveData('phone', input['Data']['phone'], 'STRING');
|
||
|
await saveData('email', input['Data']['emails'][0]['email']??'', 'STRING');
|
||
|
await saveData('customerId', input['Data']['accountId'], 'STRING');
|
||
|
//latitude,longitude
|
||
|
await loadDataFromMemory();
|
||
|
}
|
||
|
|
||
|
/* static Future<void> saveProfile(dynamic image) async {
|
||
|
// save login name information
|
||
|
await saveData('profile', image.toString(), 'STRING');
|
||
|
//await loadDataFromMemory();
|
||
|
}*/
|
||
|
|
||
|
static Uint8List convertBase64Image(String base64String) {
|
||
|
return Base64Decoder().convert(base64String.split(',').last);
|
||
|
}
|
||
|
|
||
|
static Future<void> loadDataFromMemory() async {
|
||
|
userName = await getData('username', 'STRING');
|
||
|
accessToken = await getData('access_token', 'STRING');
|
||
|
email = await getData('email', 'STRING');
|
||
|
phoneNumber = await getData('phone', 'STRING');
|
||
|
customerId = await getData('customerId', 'STRING');
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
static void longSuccessToast(String message) {
|
||
|
Fluttertoast.showToast(
|
||
|
msg: message,
|
||
|
toastLength: Toast.LENGTH_SHORT,
|
||
|
gravity: ToastGravity.BOTTOM,
|
||
|
timeInSecForIosWeb: 1,
|
||
|
backgroundColor: Colors.green,
|
||
|
textColor: Colors.white,
|
||
|
fontSize: 16.0);
|
||
|
}
|
||
|
|
||
|
static void longSuccessToast1(String message) {
|
||
|
Fluttertoast.showToast(
|
||
|
msg: message,
|
||
|
toastLength: Toast.LENGTH_LONG,
|
||
|
gravity: ToastGravity.CENTER,
|
||
|
timeInSecForIosWeb: 1,
|
||
|
backgroundColor: Colors.green,
|
||
|
textColor: Colors.white,
|
||
|
fontSize: 16.0);
|
||
|
}
|
||
|
|
||
|
static void longFailedToast(String message) {
|
||
|
Fluttertoast.showToast(
|
||
|
msg: message,
|
||
|
toastLength: Toast.LENGTH_LONG,
|
||
|
gravity: ToastGravity.BOTTOM,
|
||
|
timeInSecForIosWeb: 1,
|
||
|
backgroundColor: Colors.red,
|
||
|
textColor: Colors.white,
|
||
|
fontSize: 16.0);
|
||
|
}
|
||
|
|
||
|
static Widget noDataUI(String _tabName) {
|
||
|
_tabName = _tabName ?? '';
|
||
|
return Container(
|
||
|
child: Column(
|
||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||
|
children: <Widget>[
|
||
|
Image(
|
||
|
image: AssetImage('images/no_data.png'),
|
||
|
width: 200,
|
||
|
),
|
||
|
SizedBox(
|
||
|
height: 8,
|
||
|
),
|
||
|
Text(
|
||
|
'There is no data to show you right now.',
|
||
|
style: TextStyle(
|
||
|
fontSize: 12,
|
||
|
color: Colors.grey[600],
|
||
|
fontFamily: 'Swis2',
|
||
|
),
|
||
|
),
|
||
|
SizedBox(
|
||
|
height: 5,
|
||
|
),
|
||
|
Text(
|
||
|
_tabName,
|
||
|
style: TextStyle(fontSize: 15, fontFamily: 'Swis1'),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
static appBar(String title) {
|
||
|
title = title ?? '';
|
||
|
return AppBar(
|
||
|
backgroundColor: primaryColor,
|
||
|
title: Text(title),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
}
|