- 首先,我們需要在項目中添加
get和flutter_secure_storage依賴。在pubspec.yaml文件中添加以下內(nèi)容:
dependencies:
flutter:
sdk: flutter
get: ^4.5.1
flutter_secure_storage: ^4.2.0
- 在我們的應(yīng)用程序中,我們需要創(chuàng)建一個
UserController類來處理用戶身份驗證。在lib/controllers/user_controller.dart文件中添加以下內(nèi)容:
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:get/get.dart';
class UserController extends GetxController {
final storage = FlutterSecureStorage();
String _token;
String get token => _token;
Future login(String email, String password) async {
// 這里寫登錄邏輯
// 成功登錄后,保存 token
_token = "xxxxxxxxxxxxxx";
await storage.write(key: "token", value: _token);
return true;
}
Future logout() async {
// 刪除 token
await storage.delete(key: "token");
_token = null;
}
Future checkLogin() async {
// 從 storage 中獲取 token,判斷是否已登錄
_token = await storage.read(key: "token");
return _token != null;
}
}
- 創(chuàng)建
LoginPage頁面,用于用戶登錄。在lib/pages/login_page.dart文件添加以下內(nèi)容:
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:getx_login_demo/controllers/user_controller.dart';
class LoginPage extends StatelessWidget {
final UserController _userController = Get.put(UserController());
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar( title: Text("登錄"), ),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
margin: EdgeInsets.symmetric(horizontal: 20),
child: TextFormField(
decoration: InputDecoration( labelText: "郵箱", ),
validator: (value) {
if (value.isEmpty) {
return "郵箱不能為空";
}
return null;
},
),
),
SizedBox( height: 10, ),
Container(
margin: EdgeInsets.symmetric(horizontal: 20),
child: TextFormField(
obscureText: true,
decoration: InputDecoration( labelText: "密碼", ),
validator: (value) {
if (value.isEmpty) {
return "密碼不能為空";
}
return null;
},
),
),
SizedBox( height: 20, ),
ElevatedButton(
onPressed: () async {
var email = "test@test.com";
var password = "123456";
bool success = await _userController.login(email, password);
if (success) {
Get.offAllNamed("/");
} else {
Get.snackbar("錯誤", "登錄失敗");
}
},
child: Text("登錄"),
),
],
),
),
);
}
}
- 創(chuàng)建
HomePage頁面,用于已登錄用戶。在lib/pages/home_page.dart文件添加以下內(nèi)容:
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:getx_login_demo/controllers/user_controller.dart';
class HomePage extends StatelessWidget {
final UserController _userController = Get.find();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("首頁"),
actions: [
IconButton(
icon: Icon(Icons.logout),
onPressed: () async {
await _userController.logout();
Get.offAllNamed("/login");
},
),
],
),
body:
Center(
child: Text("歡迎回來!"),
),
);
}
}
- 最后,在
lib/main.dart中添加以下內(nèi)容:
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:getx_login_demo/pages/home_page.dart';
import 'package:getx_login_demo/pages/login_page.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
initialRoute: "/",
getPages: [
GetPage(name: "/", page: () => HomePage()),
GetPage(name: "/login", page: () => LoginPage()),
],
);
}
}
現(xiàn)在,我們可以運(yùn)行應(yīng)用程序,并嘗試登錄。當(dāng)我們成功登錄后,我們將被重定向到主頁。當(dāng)我們點(diǎn)擊主頁上的“退出”按鈕時,我們將被重定向到登錄頁面。