210 lines
6.2 KiB
Dart
210 lines
6.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_common/utils/date_utils.dart';
|
|
import 'package:flutter_common/utils/sp_utils.dart';
|
|
import 'package:flutter_common/widget/common_widget.dart';
|
|
import 'package:flutter_common/widget/dialog_widget.dart';
|
|
import 'package:food_hub_app/config/app_config.dart';
|
|
import 'package:food_hub_app/models/session.dart';
|
|
import 'package:food_hub_app/provider/user_provider.dart';
|
|
import 'package:food_hub_app/widgets/common/index.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:tdesign_flutter/tdesign_flutter.dart';
|
|
|
|
class ProfilePage extends StatefulWidget {
|
|
const ProfilePage({super.key});
|
|
|
|
@override
|
|
State<ProfilePage> createState() => ProfilePageState();
|
|
}
|
|
|
|
class ProfilePageState extends State<ProfilePage> {
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
|
|
// 初始化加载数据
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
context.read<UserProvider>().refreshUser(SPUtil.getInt('userId'));
|
|
});
|
|
}
|
|
|
|
Widget _buildAvatar(User user) {
|
|
if (user.avatar!.isEmpty) {
|
|
return TDAvatar(
|
|
size: TDAvatarSize.large,
|
|
type: TDAvatarType.customText,
|
|
shape: TDAvatarShape.circle,
|
|
backgroundColor: Theme.of(context).colorScheme.primary,
|
|
text: user.username.isNotEmpty ? user.username[0] : '?',
|
|
);
|
|
} else {
|
|
return TDAvatar(
|
|
size: TDAvatarSize.large,
|
|
type: TDAvatarType.normal,
|
|
fit: BoxFit.contain,
|
|
avatarUrl: '${AppConfig.imageBaseUrl}/${user.avatar}',
|
|
);
|
|
}
|
|
}
|
|
|
|
Widget _buildInfoItem({required IconData icon, required String text}) {
|
|
final colors = Theme.of(context).colorScheme;
|
|
return Row(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Icon(icon, size: 16, color: colors.primary),
|
|
const SizedBox(width: 6),
|
|
Text(text),
|
|
],
|
|
);
|
|
}
|
|
|
|
Widget _buildFunctionButton({
|
|
required IconData icon,
|
|
required String text,
|
|
required VoidCallback onTap,
|
|
}) {
|
|
final colors = Theme.of(context).colorScheme;
|
|
return ListTile(
|
|
contentPadding: EdgeInsets.zero,
|
|
leading: Icon(icon, color: colors.primary),
|
|
title: Text(text),
|
|
trailing: Icon(Icons.arrow_forward_ios, size: 16, color: colors.primary),
|
|
onTap: onTap,
|
|
);
|
|
}
|
|
|
|
Widget _buildBasicInfo(User user) {
|
|
return CommonCard(
|
|
child: Column(
|
|
children: [
|
|
_buildAvatar(user),
|
|
const SizedBox(height: 8),
|
|
Text(
|
|
user.username,
|
|
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
|
|
),
|
|
const SizedBox(height: 8),
|
|
if (user.tags != null && user.tags!.isNotEmpty)
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children:
|
|
user.tags!.map((tag) => buildTag(context, tag)).toList(),
|
|
),
|
|
if (user.tags != null && user.tags!.isNotEmpty)
|
|
const SizedBox(height: 8),
|
|
Wrap(
|
|
spacing: 8,
|
|
runSpacing: 8,
|
|
children: [
|
|
if (user.area != null && user.area!.length >= 2)
|
|
_buildInfoItem(
|
|
icon: Icons.location_on,
|
|
text: '${user.area![0]}-${user.area![1]}',
|
|
),
|
|
if (user.birthDate != null)
|
|
_buildInfoItem(
|
|
icon: Icons.cake,
|
|
text: formatDate(user.birthDate!),
|
|
),
|
|
if (user.job != null && user.job!.isNotEmpty)
|
|
_buildInfoItem(icon: Icons.work, text: user.job!),
|
|
if (user.phoneNumber != null && user.phoneNumber!.isNotEmpty)
|
|
_buildInfoItem(
|
|
icon: Icons.phone_android,
|
|
text: user.phoneNumber!,
|
|
),
|
|
if (user.email != null && user.email!.isNotEmpty)
|
|
_buildInfoItem(icon: Icons.email, text: user.email!),
|
|
],
|
|
),
|
|
if (user.description != null && user.description!.isNotEmpty)
|
|
const SizedBox(height: 8),
|
|
if (user.description != null && user.description!.isNotEmpty)
|
|
Text(user.description!),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
void _onTapMoment() {
|
|
Navigator.pushNamed(context, '/momentUser');
|
|
}
|
|
|
|
Widget _buildFunctionButtons() {
|
|
return CommonCard(
|
|
child: Column(
|
|
children: [
|
|
_buildFunctionButton(
|
|
icon: Icons.account_circle,
|
|
text: '基本资料',
|
|
onTap: () {
|
|
// 跳转到编辑资料页面
|
|
// LogUtils.i('点击编辑资料');
|
|
},
|
|
),
|
|
const Divider(height: 1),
|
|
_buildFunctionButton(
|
|
icon: Icons.group_outlined,
|
|
text: '朋友圈',
|
|
onTap: _onTapMoment,
|
|
),
|
|
const Divider(height: 1),
|
|
_buildFunctionButton(
|
|
icon: Icons.favorite,
|
|
text: '我的收藏',
|
|
onTap: () {
|
|
// 跳转到浏览历史页面
|
|
// LogUtils.i('点击浏览历史');
|
|
},
|
|
),
|
|
const Divider(height: 1),
|
|
_buildFunctionButton(
|
|
icon: Icons.lock,
|
|
text: '更改密码',
|
|
onTap: () {
|
|
// 跳转到帮助与反馈页面
|
|
// LogUtils.i('点击帮助与反馈');
|
|
},
|
|
),
|
|
const Divider(height: 1),
|
|
_buildFunctionButton(
|
|
icon: Icons.exit_to_app,
|
|
text: '退出登录',
|
|
onTap: () {
|
|
showConfirmDialog(context, '确认要退出吗?');
|
|
},
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _buildContent(UserProvider provider) {
|
|
final user = provider.currentUser;
|
|
return Column(
|
|
children: [
|
|
SizedBox(width: double.infinity, child: _buildBasicInfo(user)),
|
|
const SizedBox(height: 16),
|
|
_buildFunctionButtons(),
|
|
],
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final provider = context.watch<UserProvider>();
|
|
|
|
return Stack(
|
|
children: [
|
|
if (provider.isLoading)
|
|
buildLoadingIndicator()
|
|
else if (provider.error.isNotEmpty)
|
|
Text(provider.error)
|
|
else
|
|
_buildContent(provider),
|
|
],
|
|
);
|
|
}
|
|
}
|