Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
P
Perpustakaan_flutter
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Nurrofi
Perpustakaan_flutter
Commits
44048e79
You need to sign in or sign up before continuing.
Commit
44048e79
authored
Feb 05, 2024
by
Nurrofimutaqin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
menambahkan hal yang kurang dalam fitur-fitur
parent
bef5cd9e
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
322 additions
and
162 deletions
+322
-162
peminjaman.dart
lib/models/peminjaman.dart
+4
-4
book_detail.dart
lib/pages/book_detail.dart
+49
-64
book_loans.dart
lib/pages/book_loans.dart
+7
-1
book_loans_near_overdue.dart
lib/pages/book_loans_near_overdue.dart
+7
-1
book_loans_overdue.dart
lib/pages/book_loans_overdue.dart
+8
-3
change-data.dart
lib/pages/change-data.dart
+7
-10
detail_peminjaman.dart
lib/pages/detail_peminjaman.dart
+136
-42
home.dart
lib/pages/home.dart
+18
-7
loginpages.dart
lib/pages/loginpages.dart
+28
-22
register.dart
lib/pages/register.dart
+58
-8
No files found.
lib/models/peminjaman.dart
View file @
44048e79
...
...
@@ -10,11 +10,11 @@ class Peminjaman {
factory
Peminjaman
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
return
Peminjaman
(
id:
json
[
'id'
],
tanggal_pinjam:
json
[
'tanggal_pinjam'
],
tanggal_kembali:
json
[
'tanggal_kembali'
],
tanggal_pinjam:
json
[
'tanggal_pinjam'
]
.
toString
()
,
tanggal_kembali:
json
[
'tanggal_kembali'
]
.
toString
()
,
status:
json
[
'status'
],
member_nama:
json
[
'member_nama'
],
buku_judul:
json
[
'buku_judul'
],
member_nama:
json
[
'member_nama'
]
.
toString
()
,
buku_judul:
json
[
'buku_judul'
]
.
toString
()
,
);
}
}
lib/pages/book_detail.dart
View file @
44048e79
import
'dart:convert'
;
import
'package:flutter/material.dart'
;
import
'package:http/http.dart'
as
http
;
import
'package:perpustakaan/models/book.dart'
;
import
'package:perpustakaan/providers/api_loans.dart'
;
import
'package:shared_preferences/shared_preferences.dart'
;
class
BookDetailScreen
extends
StatelessWidget
{
late
final
Book
book
;
final
TextEditingController
tanggal_kembalicontroller
=
TextEditingController
();
//
final TextEditingController tanggal_kembalicontroller= TextEditingController();
BookDetailScreen
({
required
this
.
book
});
// Declare a field that holds the Todo.
// late final Book bookId;
// Future<void> pinjam(BuildContext context) async {
// try {
// await peminjaman.Bookloans(
// tanggal_kembali: tanggal_kembali.text, id: book.id,
// );
// ScaffoldMessenger.of(context).showSnackBar(
// SnackBar(
// content: Text('Change data successfully'),
// backgroundColor: Colors.green,
// ),
// );
// } catch (e) {
// ScaffoldMessenger.of(context).showSnackBar(
// SnackBar(
// content: Text('Failed to change user data. Please try again.'),
// backgroundColor: Colors.red,
// ),
// );
// print('Error changing user data: $e');
// }
// }
Future
<
void
>
bookloan
(
BuildContext
context
)
async
{
final
String
apiUrl
=
'http://10.0.2.2:8000/api/member/book-loan-by-buku/
${book.id}
'
;
...
...
@@ -48,40 +21,52 @@ class BookDetailScreen extends StatelessWidget {
final
Map
<
String
,
String
>
token
=
{
'Authorization'
:
'Bearer
$accessToken
'
,
};
// Mengambil data dari kontroler teks
final
String
tanggal_kembali
=
tanggal_kembalicontroller
.
text
;
// // Mengambil data dari kontroler teks
// final String tanggal_kembali = tanggal_kembalicontroller.text;
DateTime
?
pickedDate
=
await
showDatePicker
(
context:
context
,
initialDate:
DateTime
.
now
(),
firstDate:
DateTime
.
now
(),
lastDate:
DateTime
(
2101
),
);
// Jika pengguna memilih tanggal, kirim permintaan pinjam buku
if
(
pickedDate
!=
null
)
{
// Konversi tanggal ke format "YYYY-MM-DD"
String
formattedDate
=
"
${pickedDate.year}
-
${pickedDate.month.toString().padLeft(2, '0')}
-
${pickedDate.day.toString().padLeft(2, '0')}
"
;
// Membuat payload data
final
Map
<
String
,
String
>
data
=
{
'tanggal_kembali'
:
tanggal_kembali
,
};
final
Map
<
String
,
String
>
data
=
{
'tanggal_kembali'
:
formattedDate
,
};
// Mengirim permintaan POST ke server
final
http
.
Response
response
=
await
http
.
post
(
Uri
.
parse
(
apiUrl
),
headers:
token
,
body:
data
,
);
// Memeriksa status response
if
(
response
.
statusCode
==
200
)
{
// Data berhasil ditambahkan
print
(
'Data berhasil ditambahkan'
);
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
content:
Text
(
'Book Loan successfully'
),
backgroundColor:
Colors
.
green
,
),
// Mengirim permintaan POST ke server
final
http
.
Response
response
=
await
http
.
post
(
Uri
.
parse
(
apiUrl
),
headers:
token
,
body:
data
,
);
}
else
{
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
content:
Text
(
'Masukan Tanggal kembali (yy-mm-dd)'
),
backgroundColor:
Colors
.
red
,
),
);
// Terjadi kesalahan
print
(
'Terjadi kesalahan:
${response.statusCode}
'
);
// Memeriksa status response
if
(
response
.
statusCode
==
200
)
{
// Data berhasil ditambahkan
print
(
'Data berhasil ditambahkan'
);
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
content:
Text
(
'Book Loan successfully'
),
backgroundColor:
Colors
.
green
,
),
);
}
else
{
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
content:
Text
(
'Masukan Tanggal kembali (yy-mm-dd)'
),
backgroundColor:
Colors
.
red
,
),
);
// Terjadi kesalahan
print
(
'Terjadi kesalahan:
${response.statusCode}
'
);
}
}
}
@override
...
...
@@ -109,12 +94,12 @@ class BookDetailScreen extends StatelessWidget {
padding:
const
EdgeInsets
.
all
(
8.0
),
child:
Column
(
children:
[
TextField
(
controller:
tanggal_kembalicontroller
,
decoration:
InputDecoration
(
labelText:
'Tanggal Kembali'
,
border:
OutlineInputBorder
()),
),
//
TextField(
//
controller: tanggal_kembalicontroller,
//
decoration: InputDecoration(
//
labelText: 'Tanggal Kembali',
//
border: OutlineInputBorder()),
//
),
SizedBox
(
height:
20
),
ElevatedButton
(
onPressed:
()=>
bookloan
(
context
),
...
...
lib/pages/book_loans.dart
View file @
44048e79
...
...
@@ -31,7 +31,13 @@ class BookLoans extends StatelessWidget {
child:
ListTile
(
tileColor:
Colors
.
grey
.
withOpacity
(
0.1
),
title:
Text
(
peminjaman
[
'buku_judul'
]),
subtitle:
Text
(
'Tanggal pinjam :
${peminjaman["tanggal_pinjam"]}
|| Due Date:
${peminjaman["tanggal_kembali"]}
'
),
subtitle:
Column
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
children:
[
Text
(
'Tanggal pinjam :
${peminjaman["tanggal_pinjam"]}
'
),
Text
(
'Due Date:
${peminjaman["tanggal_kembali"]}
'
)
],
),
trailing:
Text
(
status
),
),
);
...
...
lib/pages/book_loans_near_overdue.dart
View file @
44048e79
...
...
@@ -32,7 +32,13 @@ class BookLoansAll extends StatelessWidget {
child:
ListTile
(
tileColor:
Colors
.
grey
.
withOpacity
(
0.1
),
title:
Text
(
peminjaman
[
'buku_judul'
]),
subtitle:
Text
(
'Tanggal pinjam :
${peminjaman["tanggal_pinjam"]}
|| Due Date:
${peminjaman["tanggal_kembali"]}
'
),
subtitle:
Column
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
children:
[
Text
(
'Tanggal pinjam :
${peminjaman["tanggal_pinjam"]}
'
),
Text
(
'Due Date:
${peminjaman["tanggal_kembali"]}
'
)
],
),
trailing:
Text
(
status
),
onTap:
()
async
{
var
peminjamanId
=
peminjaman
[
'id'
];
...
...
lib/pages/book_loans_overdue.dart
View file @
44048e79
import
'package:flutter/material.dart'
;
import
'package:intl/intl.dart'
;
//
import 'package:intl/intl.dart';
import
'package:perpustakaan/pages/detail_peminjaman.dart'
;
import
'package:perpustakaan/providers/api_loans.dart'
;
...
...
@@ -34,8 +34,13 @@ class BookLoansOverdue extends StatelessWidget {
child:
ListTile
(
tileColor:
Colors
.
grey
.
withOpacity
(
0.1
),
title:
Text
(
peminjaman
[
'buku_judul'
]),
subtitle:
Text
(
'Tanggal pinjam :
${peminjaman["tanggal_pinjam"]}
|| Due Date:
${peminjaman["tanggal_kembali"]}
'
),
subtitle:
Column
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
children:
[
Text
(
'Tanggal pinjam :
${peminjaman["tanggal_pinjam"]}
'
),
Text
(
'Due Date:
${peminjaman["tanggal_kembali"]}
'
)
],
),
trailing:
Text
(
status
),
onTap:
()
async
{
var
peminjamanId
=
peminjaman
[
'id'
];
...
...
lib/pages/change-data.dart
View file @
44048e79
...
...
@@ -15,7 +15,7 @@ class ChangeData extends StatefulWidget {
class
_ChangeDataState
extends
State
<
ChangeData
>
{
ApiUser
UserApi
=
ApiUser
();
late
TextEditingController
firstNameController
;
late
TextEditingController
firstNameController
;
late
TextEditingController
lastNameController
;
late
TextEditingController
emailController
;
late
TextEditingController
usernameController
;
...
...
@@ -29,6 +29,7 @@ class _ChangeDataState extends State<ChangeData> {
emailController
=
TextEditingController
(
text:
widget
.
user
.
email
);
usernameController
=
TextEditingController
(
text:
widget
.
user
.
username
);
}
Future
<
void
>
changedatauser
(
BuildContext
context
)
async
{
final
String
apiUrl
=
'http://10.0.2.2:8000/api/change-data/member/'
;
...
...
@@ -63,6 +64,10 @@ class _ChangeDataState extends State<ChangeData> {
// Memeriksa status response
if
(
response
.
statusCode
==
200
)
{
// Data berhasil ditambahkan
setState
(()
{
UserApi
.
userDetail
();
});
print
(
'Data berhasil ditambahkan'
);
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
...
...
@@ -118,14 +123,8 @@ class _ChangeDataState extends State<ChangeData> {
SizedBox
(
height:
20
),
ElevatedButton
(
onPressed:
()
{
setState
(()
{
ApiUser
apiuser
=
ApiUser
();
apiuser
.
getdatauser
();
changedatauser
(
context
);
});
Navigator
.
pop
(
context
);
}
,
},
child:
Text
(
'Change Data'
),
style:
ElevatedButton
.
styleFrom
(
backgroundColor:
Colors
.
grey
,
...
...
@@ -137,5 +136,3 @@ class _ChangeDataState extends State<ChangeData> {
);
}
}
lib/pages/detail_peminjaman.dart
View file @
44048e79
import
'package:flutter/material.dart'
;
import
'package:http/http.dart'
as
http
;
import
'package:perpustakaan/models/peminjaman.dart'
;
import
'package:shared_preferences/shared_preferences.dart'
;
class
DetailPeminjaman
extends
StatelessWidget
{
class
DetailPeminjaman
extends
StatefulWidget
{
late
final
Peminjaman
detail
;
DetailPeminjaman
({
required
this
.
detail
});
DetailPeminjaman
({
required
this
.
detail
});
@override
State
<
DetailPeminjaman
>
createState
()
=>
_DetailPeminjamanState
();
}
class
_DetailPeminjamanState
extends
State
<
DetailPeminjaman
>
{
final
TextEditingController
tglKembalicontroller
=
TextEditingController
();
bool
ischecked
=
false
;
Future
<
void
>
Returned
(
BuildContext
context
)
async
{
final
String
apiUrl
=
'http://10.0.2.2:8000/api/book-loans/
${widget.detail.id}
/'
;
// Mengambil token akses dari SharedPreferences
SharedPreferences
prefs
=
await
SharedPreferences
.
getInstance
();
final
String
accessToken
=
prefs
.
getString
(
'access_token'
)
??
''
;
// Membuat header dengan menyertakan token akses
final
Map
<
String
,
String
>
token
=
{
'Authorization'
:
'Bearer
$accessToken
'
,
};
// Mengambil data dari kontroler teks
final
String
tanggal_kembali
=
tglKembalicontroller
.
text
;
final
String
status
=
ischecked
.
toString
();
final
Map
<
String
,
dynamic
>
data
=
{
'status'
:
status
,
'tanggal_kembali'
:
tanggal_kembali
,
};
// Mengirim permintaan POST ke server
final
http
.
Response
response
=
await
http
.
put
(
Uri
.
parse
(
apiUrl
),
headers:
token
,
body:
data
,
);
// Memeriksa status response
if
(
response
.
statusCode
==
200
)
{
// Data berhasil ditambahkan
print
(
'Data berhasil ditambahkan'
);
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
content:
Text
(
'Returned successfully'
),
backgroundColor:
Colors
.
green
,
),
);
}
else
{
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
content:
Text
(
'Returned failed'
),
backgroundColor:
Colors
.
red
,
),
);
// Terjadi kesalahan
print
(
'Terjadi kesalahan:
${response.statusCode}
'
);
}
}
@override
Widget
build
(
BuildContext
context
)
{
return
Scaffold
(
...
...
@@ -13,53 +74,86 @@ class DetailPeminjaman extends StatelessWidget {
),
body:
Center
(
child:
Container
(
width:
400
,
height:
400
,
decoration:
BoxDecoration
(
borderRadius:
BorderRadius
.
circular
(
10
),
color:
Colors
.
pink
.
withOpacity
(
0.3
)
),
margin:
EdgeInsets
.
all
(
10
),
width:
400
,
height:
400
,
decoration:
BoxDecoration
(
borderRadius:
BorderRadius
.
circular
(
10
),
color:
Colors
.
pink
.
withOpacity
(
0.3
)),
margin:
EdgeInsets
.
all
(
10
),
child:
Column
(
children:
[
Row
(
children:
[
Container
(
padding:
EdgeInsets
.
all
(
10
),
child:
Text
(
'Nama Peminjam:'
)
Row
(
children:
[
Container
(
padding:
EdgeInsets
.
all
(
10
),
child:
Text
(
'Nama Peminjam:'
)),
Container
(
padding:
EdgeInsets
.
all
(
10
),
child:
Text
(
widget
.
detail
.
member_nama
))
],
),
Row
(
children:
[
Container
(
padding:
EdgeInsets
.
all
(
10
),
child:
Text
(
'Judul Buku:'
)),
Container
(
padding:
EdgeInsets
.
all
(
10
),
child:
Text
(
widget
.
detail
.
buku_judul
))
],
),
Row
(
children:
[
Container
(
padding:
EdgeInsets
.
all
(
10
),
child:
Text
(
'Tanggal Pinjam'
)),
Container
(
padding:
EdgeInsets
.
all
(
10
),
child:
Text
(
widget
.
detail
.
tanggal_kembali
))
],
),
GestureDetector
(
onTap:
()
{
setState
(()
{
ischecked
=
!
ischecked
;
// Toggle the ischecked state
});
},
child:
Row
(
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
<
Widget
>[
Text
(
'Status'
),
Checkbox
(
value:
ischecked
,
onChanged:
(
value
)
{
setState
(()
{
ischecked
=
value
??
false
;
print
(
ischecked
);
// Update ischecked based on value
});
},
),
],
),
),
Container
(
padding:
EdgeInsets
.
all
(
10
),
child:
Text
(
detail
.
member_nama
)
)
],
),
Row
(
children:
[
Container
(
padding:
EdgeInsets
.
all
(
10
),
child:
Text
(
'Judul Buku:'
)
child:
TextField
(
decoration:
InputDecoration
(
labelText:
'Tanggal Pengembalian'
,
border:
OutlineInputBorder
()),
),
Container
(
padding:
EdgeInsets
.
all
(
10
),
child:
Text
(
detail
.
buku_judul
)
)
],
),
SizedBox
(
height:
20
),
ElevatedButton
(
onPressed:
(){
Returned
(
context
);
},
child:
Text
(
'Pengembalian'
),
style:
ElevatedButton
.
styleFrom
(
backgroundColor:
Colors
.
grey
,
foregroundColor:
Colors
.
purpleAccent
),
),
Row
(
children:
[
Container
(
padding:
EdgeInsets
.
all
(
10
),
child:
Text
(
'Tanggal Pinjam'
)
),
Container
(
padding:
EdgeInsets
.
all
(
10
),
child:
Text
(
'peminjaman.tanggal_pinjam'
)
)
],
),
],
)),
)),
),
);
}
...
...
lib/pages/home.dart
View file @
44048e79
...
...
@@ -4,7 +4,7 @@ import 'package:perpustakaan/pages/book_loans_near_overdue.dart';
import
'package:perpustakaan/pages/book_loans_overdue.dart'
;
import
'package:perpustakaan/pages/change-data.dart'
;
import
'package:perpustakaan/pages/change-password.dart'
;
import
'package:perpustakaan/pages/detail_peminjaman.dart'
;
//
import 'package:perpustakaan/pages/detail_peminjaman.dart';
import
'package:perpustakaan/pages/search_book.dart'
;
import
'package:perpustakaan/providers/api_authenticated.dart'
;
import
'package:perpustakaan/providers/api_category.dart'
;
...
...
@@ -21,15 +21,16 @@ class HomeScreen extends StatefulWidget {
class
_HomeScreenState
extends
State
<
HomeScreen
>
{
late
String
_role
=
''
;
ApiUser
UserApi
=
ApiUser
();
ApiBook
BookApi
=
ApiBook
();
ApiCategory
CategoryApi
=
ApiCategory
();
@override
void
initState
()
{
super
.
initState
();
_loadUserData
();
}
ApiUser
UserApi
=
ApiUser
();
ApiBook
BookApi
=
ApiBook
();
ApiCategory
CategoryApi
=
ApiCategory
();
Future
<
void
>
_loadUserData
()
async
{
SharedPreferences
prefs
=
await
SharedPreferences
.
getInstance
();
setState
(()
{
...
...
@@ -174,7 +175,7 @@ class _HomeScreenState extends State<HomeScreen> {
?
Column
(
children:
[
ListTile
(
leading:
Icon
(
Icons
.
info
),
leading:
Icon
(
Icons
.
calendar_month_rounded
),
title:
Text
(
"Book Loans Near Overdue"
),
onTap:
()
{
Navigator
.
push
(
...
...
@@ -185,7 +186,7 @@ class _HomeScreenState extends State<HomeScreen> {
},
),
ListTile
(
leading:
Icon
(
Icons
.
info
),
leading:
Icon
(
Icons
.
calendar_view_month
),
title:
Text
(
"Book Loans Overdue"
),
onTap:
()
{
Navigator
.
push
(
...
...
@@ -195,6 +196,17 @@ class _HomeScreenState extends State<HomeScreen> {
);
},
),
ListTile
(
leading:
Icon
(
Icons
.
info
),
title:
Text
(
"Change Password"
),
onTap:
()
{
Navigator
.
push
(
context
,
MaterialPageRoute
(
builder:
(
context
)
=>
ChangePassword
()),
);
},
),
ListTile
(
leading:
Icon
(
Icons
.
logout
),
title:
Text
(
"Logout"
),
...
...
@@ -213,4 +225,3 @@ class _HomeScreenState extends State<HomeScreen> {
);
}
}
lib/pages/loginpages.dart
View file @
44048e79
...
...
@@ -4,9 +4,15 @@ import 'package:perpustakaan/pages/register.dart';
import
'dart:convert'
;
import
'package:shared_preferences/shared_preferences.dart'
;
class
LoginScreen
extends
StatelessWidget
{
class
LoginScreen
extends
StatefulWidget
{
@override
State
<
LoginScreen
>
createState
()
=>
_LoginScreenState
();
}
class
_LoginScreenState
extends
State
<
LoginScreen
>
{
final
TextEditingController
usernameController
=
TextEditingController
();
final
TextEditingController
passwordController
=
TextEditingController
();
bool
_obscureText
=
true
;
Future
<
void
>
loginUser
(
BuildContext
context
)
async
{
final
String
apiUrl
=
'http://10.0.2.2:8000/api/login/'
;
...
...
@@ -34,7 +40,8 @@ class LoginScreen extends StatelessWidget {
final
String
token
=
responseData
[
'access'
];
final
String
role
=
responseData
[
'user'
][
'role'
];
print
(
'Token:
$token
'
);
print
(
'Token:
$role
'
);
print
(
'Token:
$token
'
);
print
(
'Token:
$role
'
);
// Simpan token ke SharedPreferences
SharedPreferences
prefs
=
await
SharedPreferences
.
getInstance
();
prefs
.
setString
(
'access_token'
,
token
);
...
...
@@ -59,7 +66,7 @@ class LoginScreen extends StatelessWidget {
Widget
build
(
BuildContext
context
)
{
return
Scaffold
(
appBar:
AppBar
(
title:
Text
(
'Login'
),
title:
Center
(
child:
Text
(
'LOGIN'
)
),
),
body:
Center
(
child:
Column
(
...
...
@@ -70,9 +77,8 @@ class LoginScreen extends StatelessWidget {
height:
300
,
width:
350
,
decoration:
BoxDecoration
(
borderRadius:
BorderRadius
.
circular
(
10
),
color:
Colors
.
grey
,
),
borderRadius:
BorderRadius
.
circular
(
10
),
color:
Colors
.
pink
.
withOpacity
(
0.5
)),
child:
Padding
(
padding:
EdgeInsets
.
all
(
16.0
),
child:
Column
(
...
...
@@ -82,28 +88,28 @@ class LoginScreen extends StatelessWidget {
TextField
(
controller:
usernameController
,
decoration:
InputDecoration
(
labelText:
'Username'
,
labelStyle:
TextStyle
(
color:
Colors
.
pink
,
),
focusedBorder:
OutlineInputBorder
(
borderSide:
BorderSide
(
color:
Colors
.
pink
,
)),
),
labelText:
'Username'
,
labelStyle:
TextStyle
(
color:
Colors
.
white
),
border:
OutlineInputBorder
()),
),
SizedBox
(
height:
20
),
TextField
(
obscureText:
_obscureText
,
controller:
passwordController
,
obscureText:
true
,
decoration:
InputDecoration
(
labelStyle:
TextStyle
(
color:
Colors
.
white
),
labelText:
'Password'
,
labelStyle:
TextStyle
(
color:
Colors
.
pink
,
border:
OutlineInputBorder
(),
suffixIcon:
IconButton
(
icon:
Icon
(
_obscureText
?
Icons
.
visibility
:
Icons
.
visibility_off
),
onPressed:
()
{
setState
(()
{
_obscureText
=
!
_obscureText
;
});
},
),
focusedBorder:
OutlineInputBorder
(
borderSide:
BorderSide
(
color:
Colors
.
pink
,
)),
),
),
SizedBox
(
height:
20
),
...
...
lib/pages/register.dart
View file @
44048e79
import
'package:flutter/material.dart'
;
import
'package:http/http.dart'
as
http
;
class
RegisterPage
extends
StatelessWidget
{
class
RegisterPage
extends
StatefulWidget
{
@override
State
<
RegisterPage
>
createState
()
=>
_RegisterPageState
();
}
class
_RegisterPageState
extends
State
<
RegisterPage
>
{
final
TextEditingController
firstNameController
=
TextEditingController
();
final
TextEditingController
lastNameController
=
TextEditingController
();
final
TextEditingController
emailController
=
TextEditingController
();
final
TextEditingController
usernameController
=
TextEditingController
();
final
TextEditingController
passwordController
=
TextEditingController
();
bool
_obscureText
=
true
;
Future
<
void
>
RegisterUser
(
BuildContext
context
)
async
{
final
String
apiUrl
=
'http://10.0.2.2:8000/api/registration/'
;
// Mengambil data dari kontroler teks
final
String
first_name
=
firstNameController
.
text
;
final
String
last_name
=
lastNameController
.
text
;
final
String
email
=
emailController
.
text
;
final
String
username
=
usernameController
.
text
;
final
String
password
=
passwordController
.
text
;
// Membuat payload data untuk permintaan login
final
Map
<
String
,
String
>
data
=
{
'first_name'
:
first_name
,
'last_name'
:
last_name
,
'email'
:
email
,
'username'
:
username
,
'password'
:
password
,
};
...
...
@@ -28,7 +47,7 @@ class RegisterPage extends StatelessWidget {
if
(
response
.
statusCode
==
201
)
{
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
content:
Text
(
'
Login Gagal. Periksa kembali username dan password.
'
),
content:
Text
(
'
Registration Successfuly
'
),
backgroundColor:
Colors
.
green
,
duration:
Duration
(
seconds:
3
),
),
...
...
@@ -40,7 +59,7 @@ class RegisterPage extends StatelessWidget {
// Menampilkan SnackBar jika login gagal
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
content:
Text
(
'regis
Gagal
. Periksa kembali username dan password.'
),
content:
Text
(
'regis
Failed
. Periksa kembali username dan password.'
),
backgroundColor:
Colors
.
red
,
),
);
...
...
@@ -62,11 +81,11 @@ class RegisterPage extends StatelessWidget {
crossAxisAlignment:
CrossAxisAlignment
.
center
,
children:
[
Container
(
height:
5
00
,
height:
6
00
,
width:
350
,
decoration:
BoxDecoration
(
borderRadius:
BorderRadius
.
circular
(
10
),
color:
Colors
.
grey
,
color:
Colors
.
pink
.
withOpacity
(
0.5
)
,
),
child:
Padding
(
padding:
EdgeInsets
.
all
(
16.0
),
...
...
@@ -74,6 +93,26 @@ class RegisterPage extends StatelessWidget {
mainAxisAlignment:
MainAxisAlignment
.
center
,
crossAxisAlignment:
CrossAxisAlignment
.
center
,
children:
[
TextField
(
controller:
firstNameController
,
decoration:
InputDecoration
(
labelText:
'Fisrt Name'
,
border:
OutlineInputBorder
()),
),
SizedBox
(
height:
20
),
TextField
(
controller:
lastNameController
,
decoration:
InputDecoration
(
labelText:
'Last Name'
,
border:
OutlineInputBorder
()),
),
SizedBox
(
height:
20
),
TextField
(
controller:
emailController
,
decoration:
InputDecoration
(
labelText:
'Email'
,
border:
OutlineInputBorder
()),
),
SizedBox
(
height:
20
),
TextField
(
controller:
usernameController
,
decoration:
InputDecoration
(
...
...
@@ -83,10 +122,21 @@ class RegisterPage extends StatelessWidget {
SizedBox
(
height:
20
),
TextField
(
controller:
passwordController
,
obscureText:
true
,
obscureText:
_obscureText
,
decoration:
InputDecoration
(
labelText:
'Password'
,
border:
OutlineInputBorder
()),
labelText:
'Password'
,
border:
OutlineInputBorder
(),
suffixIcon:
IconButton
(
icon:
Icon
(
_obscureText
?
Icons
.
visibility
:
Icons
.
visibility_off
),
onPressed:
()
{
setState
(()
{
_obscureText
=
!
_obscureText
;
});
},
),
),
),
SizedBox
(
height:
20
),
ElevatedButton
(
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment