使用本地数据库的 Flutter 自动登录

Flutter Auto Login using local database

我是 flutter 的新手,正在尝试创建一个登录应用程序。

我有 2 个屏幕。

我正在尝试实现自动登录,即当用户在未注销的情况下关闭应用程序时,应用程序应自动导航到主页,而无需在应用程序重新打开时再次登录。

我的逻辑: 如果用户输入有效凭据,请清除数据库 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();
                     }
                }
           },
    );
  }
}