基于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
相关产品推荐
相关产品推荐

