Flutter发布模式下数据不显示问题求助
Debug正常但Release版本无数据(本地Directus数据库)排查方案
1. 检查网络权限配置
- Android:确认
AndroidManifest.xml中已添加INTERNET权限,Release模式不会自动继承Debug的权限配置:
<uses-permission android:name="android.permission.INTERNET" />
- iOS:若Directus使用HTTP协议,需在
Info.plist中关闭ATS限制:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
2. 禁用或配置代码混淆
Release模式的R8/ProGuard混淆可能破坏网络请求、JSON解析相关类的逻辑:
- 临时关闭混淆测试:在
build.gradle的release配置中修改:
buildTypes { release { minifyEnabled false shrinkResources false // 其他配置 } }
- 若需保留混淆,在
proguard-rules.pro中添加类保留规则:
# 保留API响应类、实体类 -keep class com.yourpackage.models.** { *; } # 若使用Gson -keepattributes Signature -keepattributes *Annotation* -keep class com.google.gson.** { *; }
3. 验证Directus环境配置一致性
- 确认Debug和Release模式下的Directus API地址、访问Token完全一致,避免Release环境误配置导致返回空数据。
- 在Release模式下添加日志(确保未禁用日志输出),打印
response原始内容,查看Directus实际返回结果。
4. 修复数据解析逻辑
针对ViewModel中的解析代码:
_cardsList = _apiCardsResponse.data?.toJson()["cards"];
- 检查
toJson()方法在Release模式下是否正常工作,可能因混淆导致方法失效。建议直接使用原始响应数据解析,或确保实体类的序列化方法被保留。 - 添加日志打印
_apiCardsResponse.data?.toJson()的完整内容,确认是否能正确取出"cards"字段。
5. 完善异常捕获逻辑
当前try-catch仅捕获基础错误,可能遗漏异步错误或未捕获的Error:
try { dynamic response = await _homeRepository.getCards(value: value); _apiCardsResponse = ApiResponse.completed(response); _cardsList = _apiCardsResponse.data?.toJson()["cards"]; } catch (error, stackTrace) { _apiCardsResponse = ApiResponse.error(error.toString()); print("获取卡片数据错误: $error, 堆栈信息: $stackTrace"); }
6. 优化ListView空数据处理
当前代码未处理_cardsList为null的情况,建议补充空状态判断:
homeViewModel.getCardsList.isEmpty ? Center(child: Text("暂无数据")) : ListView.builder( itemCount: homeViewModel.getCardsList.length, itemBuilder: ((context, index) => CardsComponent(...)) ),
内容的提问来源于stack exchange,提问作者Marc.Msan
相关产品推荐
相关产品推荐

