使用Dart(Flutter)和SQFLite登录功能



我是flutter的新手(学习了一个月(,我不知道如何制作一个函数来验证密码和用户是否在我的数据库中注册。

我使用SQFLite和Path作为包,我可以在数据库中存储数据,但我不知道如何为我的loggin按钮创建函数。我有5个文件,main、login_page、home_page、user和database_helper。你们能救我一命吗?我挣扎了两天,我已经读了文件,但很难。这是我的代码:

login_page.dart

import 'package:login_page/app/db/database_helper.dart';
class LoginPage extends StatelessWidget {
var dataHelp;
final dbHelper = DatabaseHelper.instance;
final userController = TextEditingController();
final passController = TextEditingController();
LoginPage({Key? key}) : super(key: key);
@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'),
),
),
const SizedBox(height: 50),
ElevatedButton(
onPressed: () {
_insert();
},
child: const Text('Login'),
),
const SizedBox(height: 50),
ElevatedButton(
onPressed: () {
_consult();
},
child: const Text('Consulta'),
),
],
),
),
));
}
void _insert() async {
Map<String, dynamic> row = {
DatabaseHelper.columnUser: userController.text,
DatabaseHelper.columnPass: passController.text
};
final id = await dbHelper.insert(row);
print('Adicionado $id');
}
void _consult() async {
final todasLinhas = await dbHelper.queryAllRows();
print('Consulta todas as linhas:');
for (var row in todasLinhas) {
print(row);
}
}
}

database_helper.dart

import 'package:flutter/material.dart';
import 'package:login_page/app/db/database_helper.dart';
class LoginPage extends StatelessWidget {
var dataHelp;
final dbHelper = DatabaseHelper.instance;
final userController = TextEditingController();
final passController = TextEditingController();
LoginPage({Key? key}) : super(key: key);
@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'),
),
),
const SizedBox(height: 50),
ElevatedButton(
onPressed: () {
_insert();
},
child: const Text('Login'),
),
const SizedBox(height: 50),
ElevatedButton(
onPressed: () {
_consult();
},
child: const Text('Consulta'),
),
],
),
),
));
}
void _insert() async {
Map<String, dynamic> row = {
DatabaseHelper.columnUser: userController.text,
DatabaseHelper.columnPass: passController.text
};
final id = await dbHelper.insert(row);
print('Adicionado $id');
}
void _consult() async {
final todasLinhas = await dbHelper.queryAllRows();
print('Consulta todas as linhas:');
for (var row in todasLinhas) {
print(row);
}
}
}

这是我的user.dart,在模型文件夹中:

import 'dart:convert';
// ignore_for_file: public_member_api_docs, sort_constructors_first
class User {
final int? id;
final String user;
final String password;
User({
this.id,
required this.user,
required this.password,
});
Map<String, dynamic> toMap() {
return <String, dynamic>{
'id': id,
'user': user,
'password': password,
};
}
factory User.fromMap(Map<String, dynamic> map) {
return User(
id: map['id'] != null ? map['id'] as int : null,
user: map['user'] as String,
password: map['password'] as String,
);
}
String toJson() => json.encode(toMap());
factory User.fromJson(String source) =>
User.fromMap(json.decode(source) as Map<String, dynamic>);
}

登录不是从Flutter获得的,因此您不会直接在文档中找到任何内容。有些套餐像Beamer一样为您提供这一点,但对于香草Flutter,您需要自己动手。基本上:你可以在Flutter中为路线提供建设者(点击此处阅读更多(

在main.dart中,或者在配置需要保护路由的任何位置,如果用户当前已登录,则必须检查应用程序状态。如果是,则显示受保护的内容。如果没有,则向用户显示登录表单。

对于一个简单的登录系统,服务类中某个地方的布尔值isLoggedIn就足够了。您的注册页面会将此字段更新为true,然后重定向用户,路由生成器会发现isLoggedIn现在为true,并向用户显示安全内容。

最新更新