You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Dart(Flutter)与SQFLite的登录验证功能实现求助

解决Flutter中SQFlite登录验证问题

首先注意到你粘贴的database_helper.dart内容和login_page.dart重复了,先把数据库操作类修正为正确版本,再实现登录验证逻辑。


1. 修正DatabaseHelper类

替换database_helper.dart内容为以下代码,实现数据库初始化、用户插入和登录验证查询功能:

import 'dart:async';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import '../model/user.dart';

class DatabaseHelper {
  // 单例模式保证全局唯一数据库实例
  static final DatabaseHelper instance = DatabaseHelper._init();
  static Database? _database;

  DatabaseHelper._init();

  Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await _initDB('users.db');
    return _database!;
  }

  // 初始化数据库文件
  Future<Database> _initDB(String filePath) async {
    final dbPath = await getDatabasesPath();
    final path = join(dbPath, filePath);

    return await openDatabase(path, version: 1, onCreate: _createDB);
  }

  // 创建用户表
  Future _createDB(Database db, int version) async {
    const idType = 'INTEGER PRIMARY KEY AUTOINCREMENT';
    const textType = 'TEXT NOT NULL';

    await db.execute('''
      CREATE TABLE users (
        id $idType,
        user $textType,
        password $textType
      )
    ''');
  }

  // 插入新用户(注册用)
  Future<int> insertUser(User user) async {
    final db = await instance.database;
    return await db.insert('users', user.toMap());
  }

  // 核心:根据用户名和密码查询匹配用户
  Future<User?> validateUser(String username, String password) async {
    final db = await instance.database;

    final result = await db.query(
      'users',
      where: 'user = ? AND password = ?',
      whereArgs: [username, password],
    );

    return result.isNotEmpty ? User.fromMap(result.first) : null;
  }

  // 查询所有用户(测试用)
  Future<List<User>> queryAllUsers() async {
    final db = await instance.database;
    final rows = await db.query('users');
    return rows.map((row) => User.fromMap(row)).toList();
  }
}

2. 更新LoginPage实现登录验证

修改login_page.dart,添加登录验证函数,调整按钮逻辑:

import 'package:flutter/material.dart';
import 'package:login_page/app/db/database_helper.dart';
import 'package:login_page/app/model/user.dart';

class LoginPage extends StatelessWidget {
  final dbHelper = DatabaseHelper.instance;
  final userController = TextEditingController();
  final passController = TextEditingController();

  LoginPage({Key? key}) : super(key: key);

  // 登录验证逻辑
  Future<void> _handleLogin(BuildContext context) async {
    final username = userController.text.trim();
    final password = passController.text.trim();

    // 先做非空校验
    if (username.isEmpty || password.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('用户名和密码不能为空')),
      );
      return;
    }

    // 查询数据库匹配用户
    final user = await dbHelper.validateUser(username, password);

    if (user != null) {
      // 验证成功,跳转首页
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('登录成功,欢迎${user.user}!')),
      );
      // 替换为你的首页跳转逻辑
      Navigator.pushReplacementNamed(context, '/home');
    } else {
      // 验证失败,提示错误
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('用户名或密码错误')),
      );
    }
  }

  // 注册用户(原_insert逻辑调整)
  Future<void> _handleRegister() async {
    final username = userController.text.trim();
    final password = passController.text.trim();

    if (username.isEmpty || password.isEmpty) {
      print('用户名和密码不能为空');
      return;
    }

    final user = User(user: username, password: password);
    final id = await dbHelper.insertUser(user);
    print('用户注册成功,ID: $id');
  }

  // 查询所有用户(测试用)
  Future<void> _consultUsers() async {
    final users = await dbHelper.queryAllUsers();
    print('所有用户列表:');
    for (var user in users) {
      print('ID: ${user.id}, 用户名: ${user.user}');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Simple Login Page'),
      ),
      body: Center(
        child: SingleChildScrollView(
          child: Column(
            children: [
              Container(
                padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 30),
                child: TextFormField(
                  controller: userController,
                  decoration: const InputDecoration(hintText: 'Usuário'),
                ),
              ),
              Container(
                padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 30),
                child: TextFormField(
                  controller: passController,
                  decoration: const InputDecoration(hintText: 'Password'),
                  obscureText: true, // 密码框隐藏输入内容
                ),
              ),
              const SizedBox(height: 50),
              ElevatedButton(
                onPressed: () => _handleLogin(context),
                child: const Text('Login'),
              ),
              const SizedBox(height: 20),
              ElevatedButton(
                onPressed: _handleRegister,
                child: const Text('Register'),
              ),
              const SizedBox(height: 20),
              ElevatedButton(
                onPressed: _consultUsers,
                child: const Text('Consulta'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

关键说明

  • 验证核心:DatabaseHelper中的validateUser方法通过WHERE条件精准查询匹配用户名和密码的记录,返回User对象或null,以此判断登录是否合法。
  • 逻辑拆分:把原有的_insert改为注册逻辑,登录按钮绑定专门的验证函数,避免功能混淆。
  • 安全提示:实际项目中不要明文存储密码,建议使用crypto包对密码进行哈希处理后再存入数据库。

内容的提问来源于stack exchange,提问作者Vaansuit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:03:27