使用本地数据库的 Flutter 自动登录
Flutter Auto Login using local database
我是 flutter 的新手,正在尝试创建一个登录应用程序。
我有 2 个屏幕。
- 登录(如果用户输入正确的凭据,将用户信息存储到本地数据库(sqflite)并导航到主页)。
- 主页(有注销选项)。
我正在尝试实现自动登录,即当用户在未注销的情况下关闭应用程序时,应用程序应自动导航到主页,而无需在应用程序重新打开时再次登录。
我的逻辑:
如果用户输入有效凭据,请清除数据库 table 并插入新输入的凭据。
自动登录 - 当应用程序启动时,检查数据库中的记录数 table 是否为 1,然后导航到 home else login.
这是我试过的代码:
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final dbHelper = DatabaseHelper.instance;
bool logged = false;
@override
void initState() {
super.initState();
autoLogIn();
}
void autoLogIn() async {
if (await dbHelper.queryRowCount() == 1) {
setState(() {
logged = true;
});
return;
}
}
@override
Widget build(BuildContext context) {
return logged ? HomeScreen(): LoginScreen();
}
}
这让我觉得,小部件是在记录状态更改之前构建的。
假设数据库(sqflite)实现没有问题,我如何实现自动登录。
我使用了 SharedPreferences 而不是本地数据库并且有效。
下面是最小的实现
import 'package:IsBuddy/Screens/Dashboard/dashboard.dart';
import 'package:IsBuddy/Screens/Login/login_screen.dart';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class AutoLogin extends StatefulWidget {
@override
_AutoLoginState createState() => _AutoLoginState();
}
class _AutoLoginState extends State<AutoLogin> {
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
Future<bool> logged;
@override
void initState() {
logged = _prefs.then((SharedPreferences prefs) {
return (prefs.getBool('logged') ?? false);
});
super.initState();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: logged,
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Container(
child: Center(
child: CircularProgressIndicator(),
));
default:
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
return snapshot.data ? Dashboard() : LoginScreen();
}
}
},
);
}
}
我是 flutter 的新手,正在尝试创建一个登录应用程序。
我有 2 个屏幕。
- 登录(如果用户输入正确的凭据,将用户信息存储到本地数据库(sqflite)并导航到主页)。
- 主页(有注销选项)。
我正在尝试实现自动登录,即当用户在未注销的情况下关闭应用程序时,应用程序应自动导航到主页,而无需在应用程序重新打开时再次登录。
我的逻辑: 如果用户输入有效凭据,请清除数据库 table 并插入新输入的凭据。 自动登录 - 当应用程序启动时,检查数据库中的记录数 table 是否为 1,然后导航到 home else login.
这是我试过的代码:
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final dbHelper = DatabaseHelper.instance;
bool logged = false;
@override
void initState() {
super.initState();
autoLogIn();
}
void autoLogIn() async {
if (await dbHelper.queryRowCount() == 1) {
setState(() {
logged = true;
});
return;
}
}
@override
Widget build(BuildContext context) {
return logged ? HomeScreen(): LoginScreen();
}
}
这让我觉得,小部件是在记录状态更改之前构建的。 假设数据库(sqflite)实现没有问题,我如何实现自动登录。
我使用了 SharedPreferences 而不是本地数据库并且有效。
下面是最小的实现
import 'package:IsBuddy/Screens/Dashboard/dashboard.dart';
import 'package:IsBuddy/Screens/Login/login_screen.dart';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class AutoLogin extends StatefulWidget {
@override
_AutoLoginState createState() => _AutoLoginState();
}
class _AutoLoginState extends State<AutoLogin> {
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
Future<bool> logged;
@override
void initState() {
logged = _prefs.then((SharedPreferences prefs) {
return (prefs.getBool('logged') ?? false);
});
super.initState();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: logged,
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Container(
child: Center(
child: CircularProgressIndicator(),
));
default:
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
return snapshot.data ? Dashboard() : LoginScreen();
}
}
},
);
}
}