Implement local vault service with encryption key management and integrate it into the app. Add settings screen for data management and enhance home screen with new features. Update database connection for encryption support and modify repository to use the new database structure. Improve UI elements across the application for better user experience.

This commit is contained in:
2026-05-13 22:57:23 +02:00
parent 96f8f95924
commit 94fdfe51eb
16 changed files with 875 additions and 87 deletions
+77 -62
View File
@@ -6,11 +6,15 @@ class SearchAppBar extends StatefulWidget {
this.onMenuPressed,
this.onSearchChanged,
this.searchHint = 'Buscar notas...',
this.showSearch = true,
this.titleText,
});
final VoidCallback? onMenuPressed;
final ValueChanged<String>? onSearchChanged;
final String searchHint;
final bool showSearch;
final String? titleText;
@override
State<SearchAppBar> createState() => _SearchAppBarState();
@@ -35,7 +39,7 @@ class _SearchAppBarState extends State<SearchAppBar> {
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: const Color.fromRGBO(31, 32, 33, 1),
color: Colors.transparent,
border: Border(
bottom: BorderSide(
color: Colors.white.withValues(alpha: 0.12),
@@ -55,75 +59,86 @@ class _SearchAppBarState extends State<SearchAppBar> {
constraints: const BoxConstraints(minWidth: 40, minHeight: 40),
),
const SizedBox(width: 8),
// Search input (centered with max width)
Expanded(
child: Center(
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 600),
child: TextField(
controller: _searchController,
onChanged: widget.onSearchChanged,
style: const TextStyle(color: Colors.white, fontSize: 13),
cursorColor: Colors.white70,
decoration: InputDecoration(
hintText: widget.searchHint,
hintStyle: TextStyle(
color: Colors.white.withValues(alpha: 0.5),
),
prefixIcon: const Icon(
Icons.search,
color: Colors.white70,
size: 18,
),
suffixIcon: _searchController.text.isNotEmpty
? IconButton(
icon: const Icon(
Icons.clear,
color: Colors.white70,
size: 18,
child: widget.showSearch
? Center(
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 600),
child: TextField(
controller: _searchController,
onChanged: widget.onSearchChanged,
style: const TextStyle(color: Colors.white, fontSize: 13),
cursorColor: Colors.white70,
decoration: InputDecoration(
hintText: widget.searchHint,
hintStyle: TextStyle(
color: Colors.white.withValues(alpha: 0.5),
),
prefixIcon: const Icon(
Icons.search,
color: Colors.white70,
size: 18,
),
suffixIcon: _searchController.text.isNotEmpty
? IconButton(
icon: const Icon(
Icons.clear,
color: Colors.white70,
size: 18,
),
onPressed: () {
_searchController.clear();
widget.onSearchChanged?.call('');
},
constraints: const BoxConstraints(
minWidth: 36,
minHeight: 36,
),
)
: null,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide: BorderSide(
color: Colors.white.withValues(alpha: 0.2),
width: 0.5,
),
onPressed: () {
_searchController.clear();
widget.onSearchChanged?.call('');
},
constraints: const BoxConstraints(
minWidth: 36,
minHeight: 36,
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide: BorderSide(
color: Colors.white.withValues(alpha: 0.2),
width: 0.5,
),
)
: null,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide: BorderSide(
color: Colors.white.withValues(alpha: 0.2),
width: 0.5,
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide: BorderSide(
color: Colors.white.withValues(alpha: 0.4),
width: 0.5,
),
),
filled: true,
fillColor: Colors.white.withValues(alpha: 0.05),
contentPadding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 8,
),
isDense: true,
),
),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide: BorderSide(
color: Colors.white.withValues(alpha: 0.2),
width: 0.5,
)
: Align(
alignment: Alignment.centerLeft,
child: Text(
widget.titleText ?? '',
style: const TextStyle(
color: Colors.white,
fontSize: 18,
fontWeight: FontWeight.w600,
),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide: BorderSide(
color: Colors.white.withValues(alpha: 0.4),
width: 0.5,
),
),
filled: true,
fillColor: Colors.white.withValues(alpha: 0.05),
contentPadding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 8,
),
isDense: true,
),
),
),
),
),
],
),