flutter遇到问题及解决方案

目录

1. easy_refresh相关问题

2. 父子作用域关联问题

3. 刘海屏底部安全距离

4. 了解保证金弹窗 iOS端闪退 (待优化)

5. loading无法消失

6. dialog蒙版问题

7. 倒计时优化

8. scrollController.offset报错

9. 断点不走

10.我的出价报红

11. 竞拍大厅折叠效果与滚动冲突 & 加载完成状态无法上拉加载

12. 加载网络图片失败的页面返回报错(未解决)

13. flutter页面进入后快速返回 报错

14. list. first 或 firstWhere报错 List firstWhere Bad state: No element

15. 我的出价页面滑动太灵敏

16. 禁用侧滑

17. ListView底部 iOS有间距,但Android没有

18. 回到指定tab

19.  image在页面切换会闪一下的问题


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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值