feat: 修复MainView Tab切换问题并优化MeView逻辑
- 新增MainView Tab切换问题分析文档,详细描述问题原因及解决方案。 - 优化BottomTabView的绑定逻辑,简化状态管理,确保Tab切换时状态正确更新。 - 在MeView中实现用户信息加载逻辑调整,确保动态列表仅在首次进入时加载,并添加错误处理视图。 - 创建EmptyStateView组件,提供统一的空状态展示和重试功能。 - 增强调试信息输出,便于后续问题排查和用户体验提升。
This commit is contained in:
@@ -26,6 +26,19 @@ struct MainFeature {
|
||||
debugInfoSync("🏗️ MainFeature 初始化")
|
||||
debugInfoSync(" accountModel.uid: \(accountModel?.uid ?? "nil")")
|
||||
debugInfoSync(" 转换后的uid: \(uid)")
|
||||
|
||||
// 如果没有传入accountModel,尝试从Keychain获取
|
||||
if accountModel == nil {
|
||||
debugInfoSync(" 🔍 尝试从Keychain获取AccountModel")
|
||||
Task {
|
||||
if let savedAccountModel = await UserInfoManager.getAccountModel() {
|
||||
debugInfoSync(" ✅ 从Keychain获取到AccountModel: \(savedAccountModel.uid ?? "nil")")
|
||||
} else {
|
||||
debugInfoSync(" ⚠️ 从Keychain未获取到AccountModel")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var meState = MeFeature.State(displayUID: uid > 0 ? uid : nil)
|
||||
if uid > 0 {
|
||||
meState.uid = uid // 确保uid与displayUID一致
|
||||
@@ -73,15 +86,34 @@ struct MainFeature {
|
||||
await send(.accountModelLoaded(accountModel))
|
||||
}
|
||||
case .selectTab(let tab):
|
||||
debugInfoSync("🎯 MainFeature selectTab: \(tab)")
|
||||
debugInfoSync(" 当前selectedTab: \(state.selectedTab)")
|
||||
debugInfoSync(" 新selectedTab: \(tab)")
|
||||
|
||||
// 避免重复设置相同的tab
|
||||
guard state.selectedTab != tab else {
|
||||
debugInfoSync(" ⚠️ 重复设置相同tab,忽略")
|
||||
return .none
|
||||
}
|
||||
|
||||
state.selectedTab = tab
|
||||
state.navigationPath = []
|
||||
if tab == .other, let uidStr = state.accountModel?.uid, let uid = Int(uidStr), uid > 0 {
|
||||
if state.me.displayUID != uid {
|
||||
state.me.displayUID = uid
|
||||
state.me.uid = uid // 同步更新uid
|
||||
state.me.isFirstLoad = true
|
||||
debugInfoSync(" ✅ selectedTab已更新为: \(state.selectedTab)")
|
||||
|
||||
// 切换到MeView时,确保有有效的uid并触发数据加载
|
||||
if tab == .other {
|
||||
if let uidStr = state.accountModel?.uid, let uid = Int(uidStr), uid > 0 {
|
||||
if state.me.displayUID != uid {
|
||||
state.me.displayUID = uid
|
||||
state.me.uid = uid // 同步更新uid
|
||||
state.me.isFirstLoad = true
|
||||
debugInfoSync(" 🔄 更新MeFeature状态,uid: \(uid)")
|
||||
}
|
||||
debugInfoSync(" 📱 切换到MeView,触发数据加载")
|
||||
return .send(.me(.onAppear))
|
||||
} else {
|
||||
debugInfoSync(" ⚠️ 切换到MeView但uid无效,等待AccountModel加载")
|
||||
}
|
||||
return .send(.me(.onAppear))
|
||||
}
|
||||
return .none
|
||||
case .feedList(.testButtonTapped):
|
||||
@@ -97,14 +129,31 @@ struct MainFeature {
|
||||
return .none
|
||||
case let .accountModelLoaded(accountModel):
|
||||
state.accountModel = accountModel
|
||||
// 如果当前选中的是 MeView 标签页,且有有效的 uid,则触发数据加载
|
||||
if state.selectedTab == .other, let uidStr = accountModel?.uid, let uid = Int(uidStr), uid > 0 {
|
||||
debugInfoSync("📦 MainFeature: AccountModel已加载")
|
||||
debugInfoSync(" uid: \(accountModel?.uid ?? "nil")")
|
||||
|
||||
// 更新MeFeature状态
|
||||
if let uidStr = accountModel?.uid, let uid = Int(uidStr), uid > 0 {
|
||||
if state.me.displayUID != uid {
|
||||
state.me.displayUID = uid
|
||||
state.me.uid = uid // 同步更新uid
|
||||
state.me.isFirstLoad = true
|
||||
debugInfoSync(" 🔄 更新MeFeature状态,uid: \(uid)")
|
||||
}
|
||||
return .send(.me(.onAppear))
|
||||
|
||||
// 如果当前选中的是 MeView 标签页,则触发数据加载
|
||||
if state.selectedTab == .other {
|
||||
debugInfoSync(" 📱 当前在MeView,触发数据加载")
|
||||
return .send(.me(.onAppear))
|
||||
}
|
||||
|
||||
// 如果当前选中的是 FeedView 标签页,则触发数据加载
|
||||
if state.selectedTab == .feed {
|
||||
debugInfoSync(" 📱 当前在FeedView,触发数据加载")
|
||||
return .send(.feedList(.checkAuthAndLoad))
|
||||
}
|
||||
} else {
|
||||
debugInfoSync(" ⚠️ AccountModel中uid无效")
|
||||
}
|
||||
return .none
|
||||
case .me(.settingButtonTapped):
|
||||
|
Reference in New Issue
Block a user