feat:增加查询朋友朋友圈功能

This commit is contained in:
2025-11-25 19:16:53 +08:00
parent 8cff5228ae
commit ed0ceb29d3
10 changed files with 374 additions and 135 deletions

View File

@@ -1,14 +1,11 @@
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/app_provider.dart';
import 'package:food_hub_app/provider/user_provider.dart';
import 'package:food_hub_app/widgets/common/index.dart';
import 'package:food_hub_app/widgets/profile/basic_info.dart';
import 'package:provider/provider.dart';
import 'package:tdesign_flutter/tdesign_flutter.dart';
class ProfilePage extends StatefulWidget {
const ProfilePage({super.key});
@@ -28,37 +25,6 @@ class ProfilePageState extends State<ProfilePage> {
});
}
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,
@@ -74,59 +40,6 @@ class ProfilePageState extends State<ProfilePage> {
);
}
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');
}
@@ -168,25 +81,51 @@ class ProfilePageState extends State<ProfilePage> {
},
),
const Divider(height: 1),
_buildFunctionButton(icon: Icons.message, text: '反馈意见', onTap: () {}),
const Divider(height: 1),
_buildFunctionButton(icon: Icons.refresh, text: '检查更新', onTap: () {}),
const Divider(height: 1),
_buildFunctionButton(
icon: Icons.exit_to_app,
text: '退出登录',
onTap: () {
showConfirmDialog(context, '确认要退出吗?');
},
onTap: _onTapLogout,
),
],
),
);
}
void _onTapLogout() async {
final result = await showConfirmDialog(context, '确认要退出吗?');
if (result == true) {
SPUtil.remove('token');
Navigator.pop(context);
Navigator.pushNamed(context, '/login');
}
}
Widget _buildVersionInfo() {
final provider = context.read<AppProvider>();
return Text(
'版本 v${provider.fullVersion}',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 12,
color: Theme.of(context).colorScheme.primary,
),
);
}
Widget _buildContent(UserProvider provider) {
final user = provider.currentUser;
return Column(
children: [
SizedBox(width: double.infinity, child: _buildBasicInfo(user)),
SizedBox(width: double.infinity, child: ProfileInfo(user: user)),
const SizedBox(height: 16),
_buildFunctionButtons(),
const SizedBox(height: 8),
_buildVersionInfo(),
],
);
}