Khi làm việc với các phiên đăng nhập cho người dùng sẽ rất phiền phức nếu như mỗi lần vào app lại đăng nhập lại. Điều đó thật sự phiền phức. Vì vậy hiện nay hầu hết các ứng dụng đều chỉ đăng nhập một lần cho tới khi nào thực hiện logout. Ở bài số #5 Xử lý LOGIN và LOGOUT như thế nào cho LIKE A BOSS ? và bài số #6: Xử lí Dark Mode real-time, mình có đề cập tới vấn đề này. Và hôm nay mình sẽ chia sẽ cách mình đã làm.

Cách mình làm rất đơn giản đó là lưu lại token của người dùng vào bộ nhớ máy và mỗi lần khởi động app mình sẽ kiểm tra biết đó có giá trị hay là không! Nói thì đơn giản nhưng làm rồi mới biết có đơn giản hay không nhé!
Đầu tiên mình sử dụng các package Path Provider để hỗ trợ cho việc ghi và đọc file.
Tạo ra file IO.dart để thực hiện viết các hàm đọc và ghi file.
Đầu tiên cần phải lấy được đường dẫn của hệ thống thông qua biến get sau:

Tất cả các hàm tiếp theo đều nằm trong class IO
Để thực hiện lấy một file với một tên file bất kì ta dùng hàm như sau.

Tiếp theo, để ghi một giá trị vào một file nào đó, ta dùng hàm sau:

Trong ứng dụng của mình, mình tạo ra nhiều hàm ghi với nhiều mục đích khác nhau và mã hoá từng tên file đó. Ví dụ mình dùng file để lưu user id thì mình sẽ viết tên file đó sẽ là AFK6GML.txt chẳng hạn. Mục đích viết như vậy để người dùng có vào hệ thống folder bằng các ứng dụng cho phép đọc toàn bộ tệp tin thì củng không dám xoá hoặc các hacker củng sẽ không biết đó là tệp lưu thông tin gì.
Khi mình có nhiều file cần xử lý, mình tạo ra một class để chứa các tên file đó giống như hình bên dưới.

Tiếp theo, ta tạo ra hàm saveUserId để thực hiện lưu. Ta chỉnh sửa lại hàm writeFile thành hàm saveUserId.

Sau khi lưu xong, ta cần hàm để đọc được giá trị trong biến đó lên. Ta dùng hàm như sau:

Quay trở lại phần xử lý logic, khi đăng nhập thành công, các bạn cần lưu tại thời điểm đó. Các bạn có thể xem đoạn code dưới đây. Nếu các bạn khó hiểu về các đoạn code dưới đây, các bạn hãy nên đọc qua chuỗi bài viết về provider của mình!

Sau khi đăng nhập và trả về User, sau đó sẽ lưu lại các giá trị tại hàm saveLastLogin trong pagemodel.

Biến _io là biến private đc khởi tạo trong hàm khởi tạo của page model.

Như vậy là thành công ở bước lưu rồi. Tiếp theo ta cần xử lý bước đọc dữ liệu. Có rất nhiều nơi để có thể đọc được dữ liệu đã login hay chưa. Tuỳ vào yêu cầu các bạn sẽ phải để đoạn mã xử lý ở nơi phù hợp.
Trong hàm init state của LoginPage mình sẽ check thông tin này.


Ở đây, nếu như userID đó có giá trị thì sẽ là login thành công và ngược lại. Khi đó sẽ cập nhật biến loginSuccess bên trong hàm và widget sẽ thay chuyển sang màn hình tiếp theo.

Hàm notifyListeners() sẽ báo sự thanh đổi ra ngoài.

Các bạn chú ý trong ô màu đỏ đó là nơi mà logic được xử lý!
Như vậy mình đã chia sẽ cho bác bạn cách mình đã làm như thế nào để giải quyết được vấn đề login one time củng như là config darkmode hoặc nhiều thứ khác nữa! Có thể sẽ có nhiều cách khác hay hơn. Các bạn chia sẽ cho mình với nhé!
One Comment
Trương Nhựt Tân
không biết shared reference với cách này cách nào hay hơn nhỉ?