native_secured_storage 1.0.0
native_secured_storage: ^1.0.0 copied to clipboard
A Flutter plugin for securely storing primitive data types using Android Keystore and iOS Keychain.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:native_secured_storage/native_secured_storage.dart';
import 'package:flutter/material.dart';
import 'package:native_secured_storage/native_secured_storage.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Native Secured Storage Example',
theme: ThemeData(primarySwatch: Colors.blue),
home: SecureStorageDemo(),
);
}
}
class SecureStorageDemo extends StatefulWidget {
@override
_SecureStorageDemoState createState() => _SecureStorageDemoState();
}
class _SecureStorageDemoState extends State<SecureStorageDemo> {
final TextEditingController _keyController = TextEditingController();
final TextEditingController _valueController = TextEditingController();
String? _retrievedValue;
Future<void> _saveValue() async {
final key = _keyController.text;
final value = _valueController.text;
if (key.isEmpty || value.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Key and value cannot be empty')),
);
return;
}
// Detect value type for saving
dynamic parsedValue;
if (value.toLowerCase() == 'true' || value.toLowerCase() == 'false') {
parsedValue = value.toLowerCase() == 'true';
} else if (double.tryParse(value) != null) {
parsedValue = value.contains('.') ? double.parse(value) : int.parse(value);
} else {
parsedValue = value;
}
try {
await NativeSecuredStorage.save(key, parsedValue);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Value saved successfully')),
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error saving value: $e')),
);
}
}
Future<void> _retrieveValue() async {
final key = _keyController.text;
if (key.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Key cannot be empty')),
);
return;
}
try {
final value = await NativeSecuredStorage.retrieve(key);
setState(() {
_retrievedValue = value?.toString();
});
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Value retrieved successfully')),
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error retrieving value: $e')),
);
}
}
Future<void> _deleteValue() async {
final key = _keyController.text;
if (key.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Key cannot be empty')),
);
return;
}
try {
await NativeSecuredStorage.delete(key);
setState(() {
_retrievedValue = null;
});
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Value deleted successfully')),
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error deleting value: $e')),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Secure Storage Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextField(
controller: _keyController,
decoration: InputDecoration(labelText: 'Key'),
),
TextField(
controller: _valueController,
decoration: InputDecoration(labelText: 'Value'),
),
SizedBox(height: 16),
Row(
children: [
ElevatedButton(
onPressed: _saveValue,
child: Text('Save'),
),
SizedBox(width: 8),
ElevatedButton(
onPressed: _retrieveValue,
child: Text('Retrieve'),
),
SizedBox(width: 8),
ElevatedButton(
onPressed: _deleteValue,
child: Text('Delete'),
),
],
),
SizedBox(height: 16),
if (_retrievedValue != null)
Text('Retrieved Value: $_retrievedValue'),
],
),
),
);
}
}