目录
11. 竞拍大厅折叠效果与滚动冲突 & 加载完成状态无法上拉加载
14. list. first 或 firstWhere报错 List firstWhere Bad state: No element
17. ListView底部 iOS有间距,但Android没有
1. easy_refresh相关问题
a. 仅有下拉刷新,viewModel可以不需要控制刷新状态。不用传controller
b. 传controller,在请求成功和失败后,都需要自行去管理刷新状态
问题一:我的出价多次快速切换按钮,调用下拉刷新,onRefresh方法不回调
解决方案:
controller.callRefresh(duration: const Duration(milliseconds: 1), force: true);
问题二:多次执行callRefresh,callRefresh只会走第一次
解决方案: callRefresh的同时调用接口,然后在网络请求处加防抖
问题三:列表请求下一页,去重后数据少于1条,底部显示加载完成,且上拉加载无效,列表下滑一点再上拉才可以。
解决方案:infiniteOffset 任务偏移量,默认值70,即为滚动到底部差offset时会触发load,设为null会关闭无限滚动。但是关闭无限滚动体验较差,项目中设为1。
但是快速滑动是依然有概率会卡在加载完成,项目中加了一个骚操作,去重后新数据,新数据<=1,延迟300ms响应,避免快速滑动
/// 新数据<=1,延迟300ms响应,避免快速滑动
if (bidHallItemVMList.length - oldSize <= 1 && !isRefresh && hasNext) {
await SmartDialog.showLoading(msg: '加载中...', displayTime: const Duration(milliseconds: 300));
}
这样处理后,如果去重后新增数据为空,这么处理依然会有问题,那么我们1可以增加每页返回的数据条数,减少这种情况发生,2可以递归调用请求直到有数据或nomore为止,3就是不管
2. 父子作用域关联问题
问题:AScope创建BScope,BScope中调用A的ViewModel,与AScope的ViewModel,不是同一个。
现象:竞拍大厅使用Scope,筛选后竞拍大厅未同步筛选项
解决方案:
子作用域创建时需将父作用域的container传过来,并实现parent方法,即实现了父子作用域绑定关系
3. 刘海屏底部安全距离
a. ScreenUtil().bottomBarHeight 获取到的值为0,建议不再使用
b. 可以使用 MediaQuery.of(context).padding.bottom, 获取的值正常
c. AppUtil中提供了safeBottom方法
由于调用该方法会监听context,当下个页面存在输入框时,拉起关闭键盘都会重新rebuild页面,导致ui闪动。因此将bottom的获取放到app初始化时,且仅获取一次
4. 了解保证金弹窗 iOS端闪退 (待优化)
a. demo中debug、profile正常运行
b. 经销商app源码接入后,正常运行
c. 经销商app framework接入后,运行闪退
调用路径:webview_flutter => plugin webview_flutter_wkwebview => native wkwebview
暂未发现经销商app影响调用功能的代码。闪退的堆栈中,number类型调用字典取值方法导致的闪退,FLTWebController为三方的plugin方法实现。为不影响上线,iOS改用原生弹窗。
5. loading无法消失
搜索页加载中侧滑返回后,loading无法消失
原因:
@override
void dispose() {
disposed = true;
CommonRequest().remove(this);
AppUtil().dismissLoading(); // 优化后代码
super.dispose();
}
dispose时移除了请求监听,导致onDone,onError没有监听回调,loading dismiss方法也就不会触发
因此在移除请求监听时,手动dismiss loading即可。
6. dialog蒙版问题
a. flutter无法给底部tab添加蒙版
解决方案:增加plugin方法调用原生
@async void setTabBarMasker(bool hidden);
b. 弹窗后触发引导切换到其他tab, 蒙版无法消失
c. 多级flutter页面 iOS侧滑后,弹窗在前一个页面未dismiss
解决方案:增加flutter plugin :
void dismissSmartDialog();
/// tab切换 dismiss已弹出的dialog
@override
Future<void> dismissSmartDialog() async {
await SmartDialog.dismiss();
await SmartDialog.dismiss();
await SmartDialog.dismiss();
}
原生切换tab,或flutter页面侧滑时,移除dialog(一般不会超过三个,容错移除三次,简单粗暴)
遇到问题:首次进入app,快速切换底部tab,蒙层不消失
原因一 猜您喜欢请求有滞后,切换到其他tab后,请求才成功并触发原生弹出蒙层。
解决方案:添加pageshow provider,同时监听pageshow provider和引导显示的provider
visible: ref.watch(showGuideOfGuessLikeProvider) && ref.watch(isPageShowProvider),
原因二:生命周期未成对出现。
页面首次创建时并没有执行pageShow,pageShow方法是我们自己添加的渲染帧调度监听触发的。
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
if (!mounted) {
return;
}
if (needPageObserver() &a