Skip to content

Commit

Permalink
feat: add visualization settings provider and improve UI
Browse files Browse the repository at this point in the history
  • Loading branch information
夏一飞 authored and 夏一飞 committed Oct 30, 2024
1 parent 938b09b commit fcd68f4
Show file tree
Hide file tree
Showing 15 changed files with 586 additions and 285 deletions.
2 changes: 1 addition & 1 deletion ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ SPEC CHECKSUMS:
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
screen_brightness_ios: 7437207a2a9bc56553aa10f782afecf830b4c4e2
screen_brightness_ios: 715ca807df953bf676d339f11464e438143ee625
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe

Expand Down
4 changes: 4 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'providers/reservation_provider.dart';
import 'providers/theme_provider.dart'; // 新增
import 'providers/ride_history_provider.dart'; // 新增
import 'providers/brightness_provider.dart';
import 'providers/visualization_settings_provider.dart';
import 'screens/login/login_page.dart';
import 'screens/main/main_page.dart';
import 'package:flutter/services.dart';
Expand All @@ -29,6 +30,9 @@ void main() {
),
update: (context, auth, previous) => RideHistoryProvider(auth),
),
ChangeNotifierProvider(
create: (_) => VisualizationSettingsProvider(),
),
],
child: MyApp(),
),
Expand Down
36 changes: 36 additions & 0 deletions lib/providers/visualization_settings_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

enum TimeRange { threeMonths, sixMonths, oneYear, all }

class VisualizationSettingsProvider with ChangeNotifier {
TimeRange _selectedTimeRange = TimeRange.all;
static const String _timeRangeKey = 'selected_time_range';

TimeRange get selectedTimeRange => _selectedTimeRange;

VisualizationSettingsProvider() {
_loadSettings();
}

Future<void> _loadSettings() async {
final prefs = await SharedPreferences.getInstance();
final savedRange = prefs.getString(_timeRangeKey);
if (savedRange != null) {
_selectedTimeRange = TimeRange.values.firstWhere(
(e) => e.toString() == savedRange,
orElse: () => TimeRange.all,
);
notifyListeners();
}
}

Future<void> setTimeRange(TimeRange range) async {
if (_selectedTimeRange != range) {
_selectedTimeRange = range;
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_timeRangeKey, range.toString());
notifyListeners();
}
}
}
9 changes: 4 additions & 5 deletions lib/screens/login/login_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class LoginPageState extends State<LoginPage> {
title: Text('用户须知'),
content: SingleChildScrollView(
child: Text(
'我们将采集以SHA256加密后的用户名、版本号及设备类型,用于统计每日活跃用户数您的用户名和密码将始终安全保存在您的设备上,不会上传至服务器。',
'我们将采集以SHA256加密后的用户名、版本号及设备类型,用于统计每日活跃用户数。您的用户名和密码将始终安全保存在您的设备上,不会上传至服务器。',
),
),
actions: <Widget>[
Expand All @@ -58,14 +58,14 @@ class LoginPageState extends State<LoginPage> {
body: Center(
child: SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: 400), // 添加最大宽度约束
constraints: BoxConstraints(maxWidth: 400),
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 24.0, vertical: 16.0),
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center, // 垂直居中
crossAxisAlignment: CrossAxisAlignment.stretch, // 水平拉伸
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
'Marchkov Helper',
Expand Down Expand Up @@ -167,7 +167,6 @@ class AnimatedTermsCheckbox extends StatelessWidget {
final VoidCallback onTermsTap;

const AnimatedTermsCheckbox({
super.key, // 修改这里
required this.value,
required this.onChanged,
required this.onTermsTap,
Expand Down
22 changes: 22 additions & 0 deletions lib/screens/main/main_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import '../ride/ride_page.dart';
import '../settings/settings_page.dart';
import '../reservation/reservation_page.dart';
import 'package:flutter/services.dart'; // 新增导入
import 'package:shared_preferences/shared_preferences.dart'; // 新增

class MainPage extends StatefulWidget {
@override
Expand All @@ -13,6 +14,26 @@ class MainPage extends StatefulWidget {
class MainPageState extends State<MainPage> {
int _selectedIndex = 0;

@override
void initState() {
super.initState();
_loadSelectedIndex();
}

// 加载保存的页面索引
Future<void> _loadSelectedIndex() async {
final prefs = await SharedPreferences.getInstance();
setState(() {
_selectedIndex = prefs.getInt('selectedMainPageIndex') ?? 0;
});
}

// 保存当前页面索引
Future<void> _saveSelectedIndex(int index) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setInt('selectedMainPageIndex', index);
}

static List<Widget> _widgetOptions = <Widget>[
RidePage(),
ReservationPage(),
Expand All @@ -24,6 +45,7 @@ class MainPageState extends State<MainPage> {
setState(() {
_selectedIndex = index;
});
_saveSelectedIndex(index); // 保存选中的索引
}

@override
Expand Down
78 changes: 62 additions & 16 deletions lib/screens/reservation/bus_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ class BusList extends StatelessWidget {
final Function(Map<String, dynamic>) showBusDetails;
final Map<String, dynamic> reservedBuses;
final Map<String, String> buttonCooldowns;
final bool isRefreshing;

const BusList({
super.key,
Expand All @@ -15,28 +16,73 @@ class BusList extends StatelessWidget {
required this.showBusDetails,
required this.reservedBuses,
required this.buttonCooldowns,
this.isRefreshing = false,
});

@override
Widget build(BuildContext context) {
return ListView(
padding: EdgeInsets.only(top: 8),
final theme = Theme.of(context);

return Stack(
children: [
BusSection(
title: '去燕园',
buses: _getBusesByDirection('去燕园'),
onBusCardTap: onBusCardTap,
showBusDetails: showBusDetails,
reservedBuses: reservedBuses,
buttonCooldowns: buttonCooldowns, // 传递 Map<String, String>
ListView(
padding: EdgeInsets.only(top: 24),
children: [
BusSection(
title: '去燕园',
buses: _getBusesByDirection('去燕园'),
onBusCardTap: onBusCardTap,
showBusDetails: showBusDetails,
reservedBuses: reservedBuses,
buttonCooldowns: buttonCooldowns,
),
BusSection(
title: '去昌平',
buses: _getBusesByDirection('去昌平'),
onBusCardTap: onBusCardTap,
showBusDetails: showBusDetails,
reservedBuses: reservedBuses,
buttonCooldowns: buttonCooldowns,
),
],
),
BusSection(
title: '去昌平',
buses: _getBusesByDirection('去昌平'),
onBusCardTap: onBusCardTap,
showBusDetails: showBusDetails,
reservedBuses: reservedBuses,
buttonCooldowns: buttonCooldowns, // 传递 Map<String, String>
Positioned(
top: 12,
left: 16,
right: 16,
child: AnimatedSwitcher(
duration: Duration(milliseconds: 300),
child: isRefreshing
? Container(
height: 2,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(1),
gradient: LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [
theme.colorScheme.primary.withOpacity(0),
theme.colorScheme.primary.withOpacity(0.5),
theme.colorScheme.primary,
theme.colorScheme.primary.withOpacity(0.5),
theme.colorScheme.primary.withOpacity(0),
],
stops: [0.0, 0.25, 0.5, 0.75, 1.0],
),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(1),
child: LinearProgressIndicator(
backgroundColor: Colors.transparent,
valueColor: AlwaysStoppedAnimation<Color>(
theme.colorScheme.primary.withOpacity(0.3),
),
minHeight: 2,
),
),
)
: SizedBox(height: 2),
),
),
],
);
Expand Down
Loading

0 comments on commit fcd68f4

Please sign in to comment.