import 'package:permission_handler/permission_handler.dart';
import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter/src/widgets/placeholder.dart';
import 'package:minwentaryzacja/common/permission.dart';
import 'package:minwentaryzacja/common/textFormField.dart';
import 'package:minwentaryzacja/common/toastHelper.dart';
import 'package:minwentaryzacja/databaseHandler/dbHelper.dart';
import 'package:minwentaryzacja/screens/signupForm.dart';
import 'package:minwentaryzacja/widget/inwentaryzacje.dart';
class LoginForm extends StatefulWidget {
const LoginForm({super.key, required this.title});
final String title;
@override
State<LoginForm> createState() => _LoginFormState();
}
class _LoginFormState extends State<LoginForm> {
bool _obscureText = true;
final _formKey = new GlobalKey<FormState>();
final _conUserId = TextEditingController();
final _conPassword = TextEditingController();
var dbHelper = DbHelper();
@override
void dispose() {
_conUserId.dispose();
_conPassword.dispose();
super.dispose();
}
@override
void initState() {
super.initState();
dbHelper = DbHelper();
}
void login() async {
final form = _formKey.currentState;
String uid = _conUserId.text;
String password = _conPassword.text;
print(uid);
print(password);
if (uid.isEmpty) {
showSnackBarDialog(context, "Podaj Użytkownika");
} else if (password.isEmpty) {
showSnackBarDialog(context, "Podaj Hasło");
} else {
await dbHelper.getLoginUser(uid, password).then((userData) {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (_) => Inwentaryzacje()),
(Route<dynamic> route) => false);
}).catchError((error) =>
{print(error), showSnackBarDialog(context, "Error, błąd logowania")});
}
}
void _toggle() {
setState(() {
_obscureText = !_obscureText;
});
}
@override
Widget build(BuildContext context) {
return Container(
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/images/background.png"),
fit: BoxFit.cover)),
child: Scaffold(
backgroundColor: Colors.transparent,
// appBar: AppBar(
// title: Text(widget.title),
// ),
body: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Container(
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SizedBox(
height: 30.0,
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
// Expanded(
// child: SizedBox(
// width: 10.0,
// )),
Padding(
padding: EdgeInsets.only(left: 20, top: 20),
child: Image.asset(
"assets/images/logo.png",
width: 100,
),
),
Expanded(
child: SizedBox(
width: 10.0,
)),
],
),
SizedBox(
height: 80.0,
),
Text(
"Inwentaryzacja",
style: TextStyle(
fontWeight: FontWeight.bold,
color: Theme.of(context).primaryColor,
fontSize: 45),
),
SizedBox(
height: 70.0,
),
Text(
"Logowanie",
style: TextStyle(
fontWeight: FontWeight.normal,
color: Theme.of(context).primaryColor,
fontSize: 25.0),
),
SizedBox(
height: 10,
),
getTextFormField(
controller: _conUserId,
hintName: "Użytkownik",
icon: Icons.person,
),
SizedBox(
height: 10,
),
// getTextFormField(
// controller: _conUserId,
// hintName: "Hasło",
// icon: Icons.person,
// isobscureText: true,
// ),
// Container(
// margin: EdgeInsets.only(left: 50, right: 50),
// child: TextFormField(
// obscureText: _obscureText,
// decoration: InputDecoration(
// border: InputBorder.none,
// enabledBorder: OutlineInputBorder(
// borderRadius: BorderRadius.all(Radius.circular(20)),
// borderSide: BorderSide(color: Colors.transparent)),
// focusedBorder: OutlineInputBorder(
// borderRadius: BorderRadius.all(Radius.circular(20)),
// ),
// prefixIcon: Icon(Icons.lock),
// suffixIcon: IconButton(
// onPressed: _toggle,
// icon: Icon(_obscureText
// ? Icons.visibility
// : Icons.visibility_off),
// ),
// hintText: "Hasło",
// fillColor: Colors.grey[200],
// filled: true),
// ),
// ),
getTextFormField(
controller: _conPassword,
hintName: "Hasło",
icon: Icons.lock,
isobscureText: true,
),
Container(
width: double.infinity,
margin: EdgeInsets.only(top: 30, left: 50, right: 50),
child: TextButton(
child: Text(
"Zaloguj",
style:
TextStyle(color: Theme.of(context).primaryColor),
),
onPressed: login,
style: TextButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
foregroundColor: Theme.of(context).primaryColor,
padding: const EdgeInsets.all(20.0),
backgroundColor:
// Theme.of(context).colorScheme.primary,
Theme.of(context).backgroundColor,
))),
Container(
width: double.infinity,
margin: EdgeInsets.only(top: 10, left: 50, right: 50),
child: TextButton(
child: Text(
"Zgoda",
style: TextStyle(color: Theme.of(context).primaryColor),
),
onPressed: () async {
PermissionStatus _permisionStatus =
await Permission.storage.request();
if (_permisionStatus == PermissionStatus.granted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text("Permission storage")));
}
if (_permisionStatus == PermissionStatus.denied) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content:
Text("This permisison is recommended")));
}
if (_permisionStatus ==
PermissionStatus.permanentlyDenied) {
openAppSettings();
}
},
)),
Container(
width: double.infinity,
margin: EdgeInsets.only(top: 10, left: 50, right: 50),
child: TextButton(
child: Text(
"Przejdź do rejestracji",
style: TextStyle(color: Theme.of(context).primaryColor),
),
onPressed: () {
Navigator.of(context).pushNamed(SignUpForm.routeName);
},
)),
],
),
),
),
),
);
}
}
My db helper
import 'dart:io' as io;
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:minwentaryzacja/model/Adresy.dart';
import 'package:minwentaryzacja/model/JednostkiOrganizacyjne.dart';
import 'package:minwentaryzacja/model/Majatek.dart';
import 'package:minwentaryzacja/model/Odpowiedzialni.dart';
import 'package:path/path.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:typed_data';
class InwentaryzacjDbHelper {
static final _directoryPath = '/storage/emulated/0/Documents/';
static final _databaseName = 'InwentaryzacjaDane.db';
static Database? _db;
Future<Database?> get db async {
if (_db != null) return _db;
_db = await initDB();
return _db;
}
initDB() async {
try {
if (await Permission.storage.request().isGranted) {
io.Directory? dir = await getExternalStorageDirectory();
String path = join(dir!.path, _directoryPath, _databaseName);
io.File file = io.File(path);
var theDB = await openDatabase(path, version: 1);
print("Znaleziono bazę danych");
return theDB;
} else {
throw Exception("Storage permission not granted");
}
} catch (e) {
print("Błąd inicjalizacji bazy danych: $e");
rethrow;
}
}
Future<List<Odpowiedzialni>> getOdpowiedzialni() async {
var dbClient = await db;
final res1 = await dbClient!.query("Odpowiedzialni");
print(res1);
List<Map> list = await dbClient!.rawQuery('SELECT * FROM Odpowiedzialni');
List<Odpowiedzialni> odpowiedzialni = [];
for (int i = 0; i < list.length; i++) {
odpowiedzialni.add(new Odpowiedzialni(
uzytkownik: list[i]['Uzytkownik'],
nazwiskoImie: list[i]['NazwiskoImie'],
wazneOd: list[i]['WazneOd'],
wazneDo: list[i]['WazneDo'],
));
}
return odpowiedzialni;
}
}
My Error
E/SQLiteDatabase(29942): Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14 SQLITE_CANTOPEN): Could not open database
E/SQLiteDatabase(29942): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
E/SQLiteDatabase(29942): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:224)
E/SQLiteDatabase(29942): ... 15 more
I/flutter (29942): Błąd inicjalizacji bazy danych: DatabaseException(open_failed /storage/emulated/0/Documents/InwentaryzacjaDane.db)
E/flutter (29942): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: DatabaseException(open_failed /storage/emulated/0/Documents/InwentaryzacjaDane.db)
The database file is located in the directory '/storage/emulated/0/Documents/'; When the file is initialized in a different way (from data/data/com.example.minwentaryzacja/ ) Using this code io.Directory documentsDirectory = await getApplicationDocumentsDirectory(); String path = join(documentsDirectory.path, "InwentaryzacjaDane.db");
bool exists = await io.File(path).exists();
var theDB = await openDatabase(path, version: 1);
return theDB;
. Not from an external "storage" path All work fine. But unfortunately the file must necessarily be stored in external storage or on the sd card
My dependencies
dependencies: flutter: sdk: flutter path_provider: ^2.0.2 sqflite: ^2.2.6 toast: ^0.2.9 overlay_support: ^2.1.0 intl: ^0.18.1 permission_handler: ^10.0.0
How to make the file readable without any problem. ( The file is already in '/storage/emulated/0/Documents/'; ) But then I get an error when initializing the database.