first commit
This commit is contained in:
74
lib/controller/login/login_controller.dart
Normal file
74
lib/controller/login/login_controller.dart
Normal file
@@ -0,0 +1,74 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_itis4you_with_jde_user_login_app/pages/main/main_view.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../../utils/constants.dart';
|
||||
|
||||
class LoginController extends GetConnect {
|
||||
//check diverse
|
||||
final isLoading = true.obs;
|
||||
final loginUserNameController = TextEditingController();
|
||||
final loginUserPasswortController = TextEditingController();
|
||||
var _listUsers = [];
|
||||
final isPermitted = false.obs;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
_getListUsers();
|
||||
loginUserNameController.text = 'Seiringer Josef';
|
||||
loginUserPasswortController.text = '1234';
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
@override
|
||||
void onReady() {}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
loginUserNameController.dispose();
|
||||
loginUserPasswortController.dispose();
|
||||
}
|
||||
|
||||
Future<void> _getListUsers() async {
|
||||
isLoading(false);
|
||||
|
||||
final response =
|
||||
await rootBundle.loadString('lib/markup/login/login_markup.json');
|
||||
|
||||
if (response.isNotEmpty) {
|
||||
String jsonString = response;
|
||||
print(jsonString);
|
||||
//clear all Caracter returns and spaces from jsonString to resultData
|
||||
var decodeResult = json.decode(jsonString);
|
||||
_listUsers = decodeResult['users'] as List<dynamic>;
|
||||
isLoading(true);
|
||||
}
|
||||
}
|
||||
|
||||
void logInUser() {
|
||||
isPermitted(false);
|
||||
if (loginUserNameController.text == '' ||
|
||||
loginUserPasswortController.text == '') {
|
||||
kDisplaySnackBarRed('Es fehlen Eingaben bei den Anmelde Daten!');
|
||||
isLoading(false);
|
||||
} else {
|
||||
kLoginUser = loginUserNameController.text;
|
||||
kLoginPassword = loginUserPasswortController.text;
|
||||
if (_listUsers.isNotEmpty) {
|
||||
for (var mapItem in _listUsers) {
|
||||
String user = mapItem['username'];
|
||||
String pass = mapItem['password'];
|
||||
if (user == kLoginUser && pass == kLoginPassword) {
|
||||
isPermitted(true);
|
||||
}
|
||||
print(mapItem);
|
||||
Get.offAllNamed(MainPage.namedRoute);
|
||||
}
|
||||
}
|
||||
print(isPermitted.value);
|
||||
}
|
||||
}
|
||||
}
|
||||
51
lib/controller/main/main_controller.dart
Normal file
51
lib/controller/main/main_controller.dart
Normal file
@@ -0,0 +1,51 @@
|
||||
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intl/date_symbol_data_local.dart';
|
||||
import 'package:mobile_scanner/mobile_scanner.dart';
|
||||
|
||||
import '../../pages/login/login_view.dart';
|
||||
|
||||
class MainController extends GetxController {
|
||||
|
||||
final qrText = ''.obs;
|
||||
MobileScannerController scannerController = MobileScannerController();
|
||||
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
_initializeDateFormatting();
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
stopScanning();
|
||||
super.onReady();
|
||||
}
|
||||
|
||||
void _initializeDateFormatting() async {
|
||||
await initializeDateFormatting('de_DE', null);
|
||||
}
|
||||
|
||||
void startScanning() {
|
||||
scannerController.start();
|
||||
}
|
||||
void stopScanning() {
|
||||
scannerController.stop();
|
||||
}
|
||||
|
||||
void onDetect(Barcode barcode, args) {
|
||||
final String code = barcode.rawValue ?? 'Unknown';
|
||||
qrText.value = code;
|
||||
stopScanning();
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
scannerController.dispose();
|
||||
}
|
||||
|
||||
void goToLoginPage() {
|
||||
Get.offAllNamed(LoginPage.namedRoute);
|
||||
}
|
||||
}
|
||||
28
lib/main.dart
Normal file
28
lib/main.dart
Normal file
@@ -0,0 +1,28 @@
|
||||
import 'dart:io';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'pages/login/login_view.dart';
|
||||
import 'utils/http_overrides.dart';
|
||||
import 'utils/sample_routes.dart';
|
||||
|
||||
void main() {
|
||||
HttpOverrides.global = MyHttpOverrides();
|
||||
runApp(const MyApp());
|
||||
}
|
||||
|
||||
class MyApp extends StatelessWidget {
|
||||
const MyApp({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GetMaterialApp(
|
||||
title: 'Itis4You App',
|
||||
theme: ThemeData(
|
||||
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
|
||||
useMaterial3: true,
|
||||
),
|
||||
initialRoute: LoginPage.namedRoute,
|
||||
getPages: SampleRouts.samplePages,
|
||||
);
|
||||
}
|
||||
}
|
||||
19
lib/markup/login/login_markup.json
Normal file
19
lib/markup/login/login_markup.json
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"users":[
|
||||
{
|
||||
"id":"1000",
|
||||
"username":"Zimmermann Harald",
|
||||
"password":"1234"
|
||||
},
|
||||
{
|
||||
"id":"1001",
|
||||
"username":"Seiringer Josef",
|
||||
"password":"1234"
|
||||
},
|
||||
{
|
||||
"id":"1002",
|
||||
"username":"Frizenwallner Andreas",
|
||||
"password":"1234"
|
||||
}
|
||||
]
|
||||
}
|
||||
11
lib/models/http_exception.dart
Normal file
11
lib/models/http_exception.dart
Normal file
@@ -0,0 +1,11 @@
|
||||
class HttpException implements Exception {
|
||||
final String message;
|
||||
|
||||
HttpException(this.message);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return message;
|
||||
// return super.toString(); // Instance of HttpException
|
||||
}
|
||||
}
|
||||
78
lib/models/its_data.dart
Normal file
78
lib/models/its_data.dart
Normal file
@@ -0,0 +1,78 @@
|
||||
class ItsData {
|
||||
final Data data;
|
||||
|
||||
ItsData({required this.data});
|
||||
|
||||
factory ItsData.fromJson(Map<String, dynamic> json) {
|
||||
final data = json['data'] != null ? Data.fromJson(json['data']) : null;
|
||||
return ItsData(data: data!);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['data'] = this.data.toJson();
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class Data {
|
||||
List<Users> users;
|
||||
|
||||
Data({required this.users});
|
||||
|
||||
factory Data.fromJson(Map<String, dynamic> json) {
|
||||
List<Users> users = [];
|
||||
if (json['users'] != null) {
|
||||
json['users'].forEach((v) {
|
||||
users.add(Users.fromJson(v));
|
||||
});
|
||||
}
|
||||
return Data(users: users);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['users'] = users.map((v) => v.toJson()).toList();
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class Users {
|
||||
final User user;
|
||||
|
||||
Users({required this.user});
|
||||
|
||||
factory Users.fromJson(Map<String, dynamic> json) {
|
||||
final user = json['user'] != null ? User.fromJson(json['user']) : throw Exception('User data is null');
|
||||
return Users(user: user);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['user'] = user.toJson();
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class User {
|
||||
final String userID;
|
||||
final String name;
|
||||
final String eMail;
|
||||
|
||||
User({required this.userID, required this.name, required this.eMail});
|
||||
|
||||
factory User.fromJson(Map<String, dynamic> json) {
|
||||
final userID = json['userID'];
|
||||
final name = json['name'];
|
||||
final eMail = json['eMail'];
|
||||
return User(userID: userID, name: name, eMail: eMail);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['userID'] = userID;
|
||||
data['name'] = name;
|
||||
data['eMail'] = eMail;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
30
lib/models/my_network.dart
Normal file
30
lib/models/my_network.dart
Normal file
@@ -0,0 +1,30 @@
|
||||
|
||||
import '../models/its_data.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'dart:convert';
|
||||
|
||||
import '../utils/constants.dart';
|
||||
|
||||
class MyNetwork {
|
||||
final String networkUrl;
|
||||
|
||||
MyNetwork({required this.networkUrl});
|
||||
|
||||
Future<List<User>> getAllUsers() async {
|
||||
List<User> myUserList = [];
|
||||
var result =
|
||||
await http.get(Uri.parse(kGetAllUsersURL), headers: kHttpHeaderBasicApiRest);
|
||||
if (result.statusCode == 200) {
|
||||
var jsonRequest = jsonDecode(result.body);
|
||||
var apiRestUserlist = jsonRequest['data']['users'];
|
||||
for (var user in apiRestUserlist) {
|
||||
User u = User(
|
||||
eMail: user['user']['eMail'],
|
||||
userID: user['user']['userID'],
|
||||
name: user['user']['name']);
|
||||
myUserList.add(u);
|
||||
}
|
||||
}
|
||||
return myUserList;
|
||||
}
|
||||
}
|
||||
87
lib/pages/login/login_view.dart
Normal file
87
lib/pages/login/login_view.dart
Normal file
@@ -0,0 +1,87 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import '/controller/login/login_controller.dart';
|
||||
import '/utils/my_text_button.dart';
|
||||
|
||||
class LoginPage extends GetView<LoginController> {
|
||||
static const namedRoute = '/login-page';
|
||||
const LoginPage({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var logCtrl = controller;
|
||||
var screenWidth = MediaQuery.of(context).size.width;
|
||||
//var screenHeight = MediaQuery.of(context).size.height;
|
||||
return SafeArea(
|
||||
child: Scaffold(
|
||||
body: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
const SizedBox(height: 25.0),
|
||||
Container(
|
||||
width: screenWidth*0.4,
|
||||
padding: const EdgeInsets.all(10.0),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.red,
|
||||
borderRadius: BorderRadius.all(Radius.circular(8.0)),
|
||||
),
|
||||
child: const Text(
|
||||
'Internorm',
|
||||
style: TextStyle(
|
||||
fontSize: 50.0,
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
const Text('Itis4You Inventory',
|
||||
style:
|
||||
TextStyle(fontSize: 30.0, fontStyle: FontStyle.italic)),
|
||||
const SizedBox(height: 50.0),
|
||||
SizedBox(
|
||||
width: screenWidth*0.5,
|
||||
child: TextField(
|
||||
textAlign: TextAlign.center,
|
||||
decoration: InputDecoration(
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(5.0),
|
||||
),
|
||||
labelText: 'Nachname Vorname',
|
||||
|
||||
),
|
||||
keyboardType: TextInputType.text,
|
||||
controller: logCtrl.loginUserNameController,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 10.0),
|
||||
SizedBox(
|
||||
width: screenWidth*0.5,
|
||||
child: TextField(
|
||||
textAlign: TextAlign.center,
|
||||
decoration: InputDecoration(
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(5.0),
|
||||
),
|
||||
labelText: 'Passwort 4 Stellen',
|
||||
|
||||
),
|
||||
keyboardType: TextInputType.text,
|
||||
obscureText: true,
|
||||
controller: logCtrl.loginUserPasswortController,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 20.0),
|
||||
MyTextButton(
|
||||
onTap: () => logCtrl.logInUser(),
|
||||
screenWidth: screenWidth * 0.4,
|
||||
buttonText: 'ANMELDEN',
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
90
lib/pages/main/main_view.dart
Normal file
90
lib/pages/main/main_view.dart
Normal file
@@ -0,0 +1,90 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_itis4you_with_jde_user_login_app/utils/my_text_button.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:mobile_scanner/mobile_scanner.dart';
|
||||
import '../../controller/main/main_controller.dart';
|
||||
|
||||
class MainPage extends GetView<MainController> {
|
||||
static const namedRoute = '/main-page';
|
||||
const MainPage({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var mainCtrl = controller;
|
||||
double screenWidth = MediaQuery.of(context).size.width;
|
||||
double screenHeight = MediaQuery.of(context).size.height;
|
||||
return SafeArea(
|
||||
child: Scaffold(
|
||||
appBar: AppBar(
|
||||
centerTitle: true,
|
||||
title: const Text(
|
||||
'Inventarcode Scannen',
|
||||
style: TextStyle(color: Colors.white, fontSize: 25.0),
|
||||
),
|
||||
toolbarHeight: 120.0,
|
||||
backgroundColor: Colors.grey.shade700,
|
||||
leading: IconButton(
|
||||
icon: const Icon(Icons.arrow_back),
|
||||
onPressed: () => mainCtrl.goToLoginPage(),
|
||||
),
|
||||
//centerTitle: true,
|
||||
),
|
||||
body: SafeArea(
|
||||
child: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
width: screenWidth * 0.7,
|
||||
height: screenHeight * 0.35,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
),
|
||||
child: MobileScanner(
|
||||
controller: mainCtrl.scannerController,
|
||||
onDetect: (barcode) {
|
||||
var bar = barcode.barcodes.first;
|
||||
var args = barcode.image;
|
||||
mainCtrl.onDetect(bar, args);
|
||||
},
|
||||
),
|
||||
),
|
||||
SizedBox(height: 50.0),
|
||||
Obx(() => Center(
|
||||
child: Container(
|
||||
alignment: Alignment.center,
|
||||
width: screenWidth*0.6,
|
||||
height: 80.0,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: Colors.grey.shade600,
|
||||
width: 5.0,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(20.0),
|
||||
),
|
||||
child: Text(
|
||||
mainCtrl.qrText.value,
|
||||
style: TextStyle(
|
||||
fontSize: 35.0,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
)),
|
||||
SizedBox(height: 50.0),
|
||||
SizedBox(
|
||||
width: screenWidth * 0.4,
|
||||
child: MyTextButton(
|
||||
onTap: () => mainCtrl.startScanning(),
|
||||
screenWidth: screenWidth * 0.4,
|
||||
buttonText: 'Start Scannen',
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
63
lib/utils/constants.dart
Normal file
63
lib/utils/constants.dart
Normal file
@@ -0,0 +1,63 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
const kLoginURL = 'http://ifnweb12.ifndom.net:8789/jderest/v2/tokenrequest';
|
||||
const kGetAllUsersURL =
|
||||
'https://api.internorm.com:4481/gateway/ITIS4U_Inventory_Management/1.0/ITIS4U_Inventory/users';
|
||||
const kGetAssetsByUserIdBaseURL =
|
||||
'https://api.internorm.com:4481/gateway/ITIS4U_Inventory_Management/1.0/ITIS4U_Inventory/assetsByUser';
|
||||
const kGetAssetByInventoryIdBaseURL =
|
||||
'https://api.internorm.com:4481/gateway/ITIS4U_Inventory_Management/1.0/ITIS4U_Inventory/asset';
|
||||
|
||||
var szApiUsername = 'Service';
|
||||
var szApiPassword = 'manage';
|
||||
var kLoginToken = '';
|
||||
var kLoginUser = '';
|
||||
var kLoginPassword = '';
|
||||
|
||||
//HttpHeader Authentification Login
|
||||
var kBasicAuthLogin =
|
||||
'Basic ${base64.encode(utf8.encode('$kLoginUser:$kLoginPassword'))}';
|
||||
var kHttpHeaderBasic = {HttpHeaders.authorizationHeader: kBasicAuthLogin};
|
||||
|
||||
var kBasicAuthApiRest = 'Basic ${base64.encode(utf8.encode('$szApiUsername:$szApiPassword'))}';
|
||||
var kHttpHeaderBasicApiRest = {HttpHeaders.authorizationHeader: kBasicAuthLogin};
|
||||
|
||||
var kFontSizeDouble = 15.0;
|
||||
|
||||
var kTextSyleLittleGrey =
|
||||
TextStyle(fontSize: 12.0, color: Colors.grey.shade500);
|
||||
|
||||
//DropDown Styles
|
||||
var kInputDecorationDropDownMenue = InputDecoration(
|
||||
//prefixIcon: Icon(Icons.date_range),
|
||||
hintText: 'User'.toUpperCase(),
|
||||
contentPadding: const EdgeInsets.all(10),
|
||||
hintStyle: TextStyle(letterSpacing: 2, fontSize: kFontSizeDouble),
|
||||
filled: true,
|
||||
fillColor: Colors.grey.shade400,
|
||||
errorStyle: const TextStyle(color: Colors.yellow),
|
||||
);
|
||||
|
||||
|
||||
SnackbarController kDisplaySnackBarRed(String szInfoText) {
|
||||
return Get.snackbar('Info', szInfoText,
|
||||
backgroundColor: Colors.red[600],
|
||||
snackPosition: SnackPosition.TOP,
|
||||
colorText: Colors.white,
|
||||
snackStyle: SnackStyle.GROUNDED);
|
||||
}
|
||||
|
||||
SnackbarController kDisplaySnackBarGreen(String szInfoText) {
|
||||
return Get.snackbar('Info', szInfoText,
|
||||
backgroundColor: Colors.green[600],
|
||||
snackPosition: SnackPosition.TOP,
|
||||
colorText: Colors.black,
|
||||
snackStyle: SnackStyle.GROUNDED);
|
||||
}
|
||||
|
||||
|
||||
String? kHandyModel;
|
||||
10
lib/utils/http_overrides.dart
Normal file
10
lib/utils/http_overrides.dart
Normal file
@@ -0,0 +1,10 @@
|
||||
import 'dart:io';
|
||||
|
||||
class MyHttpOverrides extends HttpOverrides {
|
||||
@override
|
||||
HttpClient createHttpClient(SecurityContext? context) {
|
||||
return super.createHttpClient(context)
|
||||
..badCertificateCallback =
|
||||
(X509Certificate cert, String host, int port) => true;
|
||||
}
|
||||
}
|
||||
40
lib/utils/my_text_button.dart
Normal file
40
lib/utils/my_text_button.dart
Normal file
@@ -0,0 +1,40 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class MyTextButton extends StatelessWidget {
|
||||
const MyTextButton({
|
||||
super.key,
|
||||
required this.onTap,
|
||||
required this.screenWidth,
|
||||
required this.buttonText,
|
||||
});
|
||||
|
||||
final void Function()? onTap;
|
||||
final double screenWidth;
|
||||
final String buttonText;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: onTap,
|
||||
child: Container(
|
||||
alignment: Alignment.center,
|
||||
width: screenWidth,
|
||||
height: 80.0,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.blue.shade700,
|
||||
borderRadius: BorderRadius.circular(5.0)
|
||||
),
|
||||
child: Text(
|
||||
buttonText,
|
||||
style: const TextStyle(
|
||||
fontSize: 30.0,
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.bold,
|
||||
letterSpacing: 2.0,
|
||||
wordSpacing: 8.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
11
lib/utils/sample_bindings.dart
Normal file
11
lib/utils/sample_bindings.dart
Normal file
@@ -0,0 +1,11 @@
|
||||
import 'package:get/get.dart';
|
||||
import '../controller/login/login_controller.dart';
|
||||
import '../controller/main/main_controller.dart';
|
||||
|
||||
class SampleBindings extends Bindings {
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.lazyPut<LoginController>(() => LoginController());
|
||||
Get.lazyPut<MainController>(() => MainController());
|
||||
}
|
||||
}
|
||||
21
lib/utils/sample_routes.dart
Normal file
21
lib/utils/sample_routes.dart
Normal file
@@ -0,0 +1,21 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import './sample_bindings.dart';
|
||||
import '../../pages/main/main_view.dart';
|
||||
import '../../pages/login/login_view.dart';
|
||||
|
||||
class SampleRouts {
|
||||
static final sampleBindings = SampleBindings();
|
||||
static final samplePages = [
|
||||
GetPage(
|
||||
name: LoginPage.namedRoute,
|
||||
binding: sampleBindings,
|
||||
page: () => const LoginPage(),
|
||||
),
|
||||
GetPage(
|
||||
name: MainPage.namedRoute,
|
||||
binding: sampleBindings,
|
||||
page: () => const MainPage(),
|
||||
),
|
||||
];
|
||||
}
|
||||
43
lib/widgets/my_text_button.dart
Normal file
43
lib/widgets/my_text_button.dart
Normal file
@@ -0,0 +1,43 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class MyTextButton extends StatelessWidget {
|
||||
const MyTextButton({
|
||||
super.key,
|
||||
required this.onTap,
|
||||
required this.screenWidth,
|
||||
this.screenHeight = 80.0,
|
||||
this.fontSize = 20.0,
|
||||
this.backgroundColor = const Color.fromARGB(255, 66, 66, 66),
|
||||
this.textColor = Colors.white,
|
||||
required this.buttonText,
|
||||
});
|
||||
|
||||
final void Function()? onTap;
|
||||
final double screenWidth;
|
||||
final double screenHeight;
|
||||
final double fontSize;
|
||||
final Color backgroundColor;
|
||||
final Color textColor;
|
||||
final String buttonText;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: onTap,
|
||||
child: Container(
|
||||
alignment: Alignment.center,
|
||||
width: screenWidth,
|
||||
height: screenHeight,
|
||||
color: backgroundColor,
|
||||
child: Text(
|
||||
buttonText,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: fontSize,
|
||||
color: textColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user