settings_page.dart (3840B)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:creekui/ui/styles/variables.dart'; import 'package:creekui/ui/pages/image_analysis_page.dart'; import 'package:creekui/ui/widgets/primary_button.dart'; import 'package:creekui/ui/widgets/app_bar.dart'; import 'package:creekui/ui/widgets/text_field.dart'; class SettingsPage extends StatefulWidget { const SettingsPage({super.key}); @override State<SettingsPage> createState() => _SettingsPageState(); } class _SettingsPageState extends State<SettingsPage> { final TextEditingController _nameController = TextEditingController(); bool _isLoading = true; String _originalName = ''; @override void initState() { super.initState(); _loadUserData(); } Future<void> _loadUserData() async { final prefs = await SharedPreferences.getInstance(); String name = prefs.getString('user_name') ?? 'Alex'; if (name.trim().isEmpty) name = 'Alex'; setState(() { _nameController.text = name; _originalName = name; _isLoading = false; }); } Future<void> _saveUserName() async { final newName = _nameController.text.trim(); if (newName.isEmpty) return; final prefs = await SharedPreferences.getInstance(); await prefs.setString('user_name', newName); setState(() => _originalName = newName); if (mounted) FocusScope.of(context).unfocus(); } @override void dispose() { _nameController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final bool hasChanges = _nameController.text.trim() != _originalName; return Scaffold( backgroundColor: Colors.white, appBar: const CommonAppBar(title: "Settings"), body: _isLoading ? const Center(child: CircularProgressIndicator()) : Padding( padding: const EdgeInsets.all(24.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( "Profile Settings", style: TextStyle( fontFamily: 'GeneralSans', fontSize: 18, fontWeight: FontWeight.w600, color: Variables.textPrimary, ), ), const SizedBox(height: 16), CommonTextField( label: "Your Name", hintText: "Enter your name", controller: _nameController, onChanged: (val) => setState(() {}), suffixIcon: hasChanges ? IconButton( icon: const Icon( Icons.check, color: Variables.textPrimary, ), onPressed: _saveUserName, tooltip: 'Save Name', ) : null, ), const Spacer(), // Test Analysis PrimaryButton( text: "Test Image Analysis", onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (_) => const ImageAnalysisPage(), ), ); }, ), const SizedBox(height: 20), ], ), ), ); } } |