AtmoSphere/lib/screens/settings_screen.dart
2026-01-16 18:22:32 +08:00

388 lines
12 KiB
Dart

import 'package:flutter/material.dart';
import '../constants.dart';
import '../services/share_service.dart';
import '../tools/app_ads_managers.dart';
import 'city_management_screen.dart';
import 'about_screen.dart';
import 'feedback_screen.dart';
class SettingsScreen extends StatefulWidget {
const SettingsScreen({super.key});
@override
State<SettingsScreen> createState() => _SettingsScreenState();
}
class _SettingsScreenState extends State<SettingsScreen> {
bool _notificationsEnabled = true;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
kDarkPurple,
kDarkPurple.withOpacity(0.95),
Colors.black.withOpacity(0.9),
],
stops: const [0.0, 0.5, 1.0],
),
),
child: CustomScrollView(
slivers: [
SliverAppBar(
expandedHeight: 120.0,
floating: false,
pinned: true,
elevation: 0,
backgroundColor: Colors.transparent,
flexibleSpace: FlexibleSpaceBar(
title: const Text(
'Settings',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 28,
letterSpacing: 0.5,
),
),
centerTitle: true,
titlePadding: const EdgeInsets.only(bottom: 16.0),
),
),
SliverPadding(
padding: const EdgeInsets.fromLTRB(16.0, 8.0, 16.0, 24.0),
sliver: SliverList(
delegate: SliverChildListDelegate([
_SettingsSection(
title: 'General',
icon: Icons.settings_outlined,
children: [
_StyledSwitchListTile(
title: 'Enable Notifications',
subtitle: 'Receive weather alerts',
value: _notificationsEnabled,
onChanged: (bool value) {
setState(() {
_notificationsEnabled = value;
});
},
icon: Icons.notifications_outlined,
iconColor: Colors.orangeAccent,
),
_StyledListTile(
title: 'Manage Locations',
subtitle: 'Add or remove cities',
icon: Icons.location_city_outlined,
iconColor: Colors.blueAccent,
onTap: () async {
InterstitialAdManager.instance.showAd(InterstitialAdType.third,onAdCompleted: (){
});
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
const CityManagementScreen(),
),
);
},
),
],
),
const SizedBox(height: 24),
_SettingsSection(
title: 'Share & Support',
icon: Icons.favorite_outline,
children: [
_StyledListTile(
title: 'Share App',
subtitle: 'Share AtmoSphere with friends',
icon: Icons.share_outlined,
iconColor: Colors.greenAccent,
onTap: () async {
final shareService = ShareService();
await shareService.shareApp();
},
),
_StyledListTile(
title: 'Feedback',
subtitle: 'Send us your feedback',
icon: Icons.feedback_outlined,
iconColor: Colors.purpleAccent,
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const FeedbackScreen(),
),
);
},
),
],
),
const SizedBox(height: 24),
_SettingsSection(
title: 'About',
icon: Icons.info_outline,
children: [
_StyledListTile(
title: 'About AtmoSphere',
subtitle: 'Version 1.1.0',
icon: Icons.info_outlined,
iconColor: Colors.cyanAccent,
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const AboutScreen(),
),
);
},
),
],
),
]),
),
),
],
),
),
);
}
}
class _StyledListTile extends StatelessWidget {
final String title;
final String subtitle;
final IconData icon;
final Color? iconColor;
final VoidCallback onTap;
const _StyledListTile({
required this.title,
required this.subtitle,
required this.icon,
this.iconColor,
required this.onTap,
});
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16.0),
color: Colors.white.withOpacity(0.05),
),
child: Material(
color: Colors.transparent,
child: InkWell(
borderRadius: BorderRadius.circular(16.0),
onTap: onTap,
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16.0,
vertical: 12.0,
),
child: Row(
children: [
Container(
padding: const EdgeInsets.all(10.0),
decoration: BoxDecoration(
color: (iconColor ?? Colors.blueAccent).withOpacity(0.2),
borderRadius: BorderRadius.circular(12.0),
),
child: Icon(
icon,
color: iconColor ?? Colors.blueAccent,
size: 22,
),
),
const SizedBox(width: 16.0),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: Colors.white,
letterSpacing: 0.2,
),
),
const SizedBox(height: 4.0),
Text(
subtitle,
style: TextStyle(
fontSize: 13,
color: Colors.white.withOpacity(0.6),
letterSpacing: 0.1,
),
),
],
),
),
Icon(
Icons.chevron_right_rounded,
color: Colors.white.withOpacity(0.4),
size: 24,
),
],
),
),
),
),
);
}
}
class _StyledSwitchListTile extends StatelessWidget {
final String title;
final String subtitle;
final bool value;
final ValueChanged<bool> onChanged;
final IconData icon;
final Color? iconColor;
const _StyledSwitchListTile({
required this.title,
required this.subtitle,
required this.value,
required this.onChanged,
required this.icon,
this.iconColor,
});
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16.0),
color: Colors.white.withOpacity(0.05),
),
child: Material(
color: Colors.transparent,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12.0),
child: Row(
children: [
Container(
padding: const EdgeInsets.all(10.0),
decoration: BoxDecoration(
color: (iconColor ?? Colors.orangeAccent).withOpacity(0.2),
borderRadius: BorderRadius.circular(12.0),
),
child: Icon(
icon,
color: iconColor ?? Colors.orangeAccent,
size: 22,
),
),
const SizedBox(width: 16.0),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: Colors.white,
letterSpacing: 0.2,
),
),
const SizedBox(height: 4.0),
Text(
subtitle,
style: TextStyle(
fontSize: 13,
color: Colors.white.withOpacity(0.6),
letterSpacing: 0.1,
),
),
],
),
),
Transform.scale(
scale: 0.9,
child: Switch(
value: value,
onChanged: onChanged,
activeColor: Colors.blueAccent,
activeTrackColor: Colors.blueAccent.withOpacity(0.5),
inactiveThumbColor: Colors.grey[600],
inactiveTrackColor: Colors.grey[800]!.withOpacity(0.3),
),
),
],
),
),
),
);
}
}
class _SettingsSection extends StatelessWidget {
final String title;
final IconData? icon;
final List<Widget> children;
const _SettingsSection({
required this.title,
this.icon,
required this.children,
});
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(left: 8.0, bottom: 12.0),
child: Row(
children: [
if (icon != null) ...[
Icon(icon, size: 18, color: Colors.white.withOpacity(0.7)),
const SizedBox(width: 8.0),
],
Text(
title.toUpperCase(),
style: TextStyle(
color: Colors.white.withOpacity(0.7),
fontWeight: FontWeight.w700,
fontSize: 13,
letterSpacing: 1.2,
),
),
],
),
),
Container(
decoration: BoxDecoration(
color: kCardBackground,
borderRadius: kCardBorderRadius,
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.3),
blurRadius: 10,
offset: const Offset(0, 4),
),
],
),
child: Column(children: children),
),
],
);
}
}