flutter遇到问题及解决方案

news2024/9/20 17:23:01

目录

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没有


1、easy_refresh相关问题

a. 仅有下拉刷新,viewModel可以不需要控制刷新状态。不用传controller

b. 传controller,在请求成功和失败后,都需要自行去管理刷新状态

问题一:我的出价多次快速切换按钮,调用下拉刷新,onRefresh方法不回调

解决方案:

controller.callRefresh(duration: const Duration(milliseconds: 1), force: true);

问题二:下拉刷新,添加筛选项,回到列表页,上划列表,请求被取消  

原因:ClassicHeader和ClassicFooter 有   triggerOffset, ///触发器任务的偏移量  和 maxOverOffset, ///最大超限偏移,将不再滚动

 解决方案:将两个值设置成相同,则会在滑到 “松开刷新” 的状态时,松手的一刻就回调   onRefresh 和 onLoad 方法。

triggerOffset: 100,  ///触发器任务的偏移量
maxOverOffset: 100,  ///最大超限偏移,将不再滚动

问题三:列表请求下一页,去重后数据少于1条,底部显示加载完成,且上拉加载无效,列表下滑一点再上拉才可以。

解决方案:关闭无限滚动 infiniteOffset设为null,默认值70

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初始化时,且仅获取一次(判空逻辑改为copyWith应该也行)

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() && BoostNavigator.instance.isTopPage(context)) {
        onPageShow();
      }
      onFirstFrame();
    });
    super.initState();
  }

方案二: 改用全局弹窗,router:custom_dialog,present一个半透明弹窗,可以遮盖tabbar

参考 放弃收购弹窗。

遇到问题一: 弹窗pop后,前一个页面loading卡帧,无法消失

解决方案:push.then 后移除loading

建议使用方案二,但不要认为方案二遇到的问题会比方案一少,需要注意flutter各种奇奇怪怪的问题

7. 倒计时优化

a. 列表使用的全局定时器,widget频繁监听,影响性能

解决方案:pageHide移除监听,列表倒计时结束移除监听。

b. 报错Bad state: Cannot use "ref" after the widget was disposed.

原因: 列表快速滚动,调用ref代码时widget已经被释放了

解决方案:onPageShow调用ref前先判断ref.context.mounted为true。(未从根源上解决问题)

mounted解释说明:

在Flutter中,`mounted`是一个布尔类型的变量,它表示当前State对象是否已经被插入到树中去了。当这个State对象被添加到树中时,`mounted`变量就会被设置为`true`。如果State对象被删除,那么`mounted`变量就会被设置为`false`。

开发者可以使用`mounted`变量来判断当前的State对象是否还有效,如果`mounted`为`true`,则可以安全地调用`setState()`方法进行状态更新。如果`mounted`为`false`,则不应该调用`setState()`,因为这个State对象已经被从树中删除了,状态更新将不会生效。

参考 BidHallItemChildCountDown

@override
void watchGenerateViewModel(WidgetRef ref) {
  super.watchGenerateViewModel(ref);
  remainSeconds = model.awayFromEnd! - DateTime.now().millisecondsSinceEpoch ~/ 1000;
  /// 监听定时器刷新 PageHide不监听
  if (ref.watch(shouldWatchTimerProvider) && remainSeconds > 0) {
    ref.watch(commonTimer);
  }
}

@override
void onPageHide() {
  super.onPageHide();
  ref.read(bidHallItemViewModelProvider).updateShouldWatchTimer(false);
}

@override
void onPageShow() {
  super.onPageShow();
  if (ref.context.mounted){
    ref.read(bidHallItemViewModelProvider).updateShouldWatchTimer(true);
  }
}

@override
bool needPageObserver() {
  return true;
}

根本原因是生命周期未成对出现,渲染帧调度监听添加mounted判断后再触发onPageShow,同6-原因二,优化后onPageShow不需要再判断mounted

8. scrollController.offset报错

a.scrollController加到了easy_refresh的scrollController上,应该是widget的controller

b.列表加了scrollController,但是空视图页面没有加scrollController

9. 断点不走

检查下新加的代码,有可能在断点前面的代码抛异常了

10.我的出价报红

报错日志:如下图所示

flutter: The following assertion was thrown:
flutter: Tried to change the number of overrides. This is not allowed – overrides cannot be removed/added,
flutter: they can only be updated.
flutter: 'package:riverpod/src/framework/container.dart':
flutter: Failed assertion: line 373 pos 7: '_debugOverridesLength == overrides.length'

原因

issue 链接: "Tried to change the number of overrides" when running golden tests on multiple widgets with different ProviderScopes · rrousselGit/riverpod · Discussion #2804 · GitHub

解决方案:给ProviderScope添加key

ListView.builder(
    controller: viewModel.scrollController,
    itemCount: itemVMList.length,
    itemBuilder: (BuildContext context, int position) {
      return _buildChildItemProvider(itemVMList, position);
    }),


DealerItemProvider? _buildChildItemProvider( List<DealerItemViewModel> myPriceList, int position) {
  if (widget.myPriceType == Const.BIDING) {  ///竞拍中
    if (myPriceList[position] is ItemBiddingChildVM) {
      return DealerItemProvider(
        key: const Key('ItemBidding'), ///需要设置不同key
        itemOverrides: overrideItemBiddingChildVM(
            model: myPriceList[position] as ItemBiddingChildVM,
            index: position),
        child: ItemBiddingChild(),
      );
    } else if (myPriceList[position] is CommonRecommendTitleViewModel) {
      return DealerItemProvider(
          key: const Key('CommonRecommend'), ///需要设置不同key
          itemOverrides: overrideCommonRecommendTitleViewModel(
              model: myPriceList[position] as CommonRecommendTitleViewModel,
              index: position),
          child: CommonRecommendTitleWidget());
    } else if (myPriceList[position] is BidHallItemViewModel) {
      return DealerItemProvider(
          key: const Key('CommonRecommend'), ///需要设置不同key
          itemOverrides: overrideBidHallItemViewModel(
              model: myPriceList[position] as BidHallItemViewModel,
              index: position),
          child: BidHallItem());
    }
  }
  return null;
}

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

a. 折叠效果通过NestedScrollView实现,列表刷新数据后滚动到顶部是在list添加scrollController实现,二者相冲突,只有一个生效

b. 列表请求多页数据,筛选第一页数据后,最下面显示加载完成,无法上拉加载。

解决方案: NestedScrollView添加key,触发请求前调用NestedScrollView滚动到顶部的方法

注意:调用innerController.jumpTo(0) 固定收起折叠样式。调用outerController.jumpTo(0); 固定展开折叠样式。因此需判断当前折叠状态。

final GlobalKey<NestedScrollViewState> scrollKey = GlobalKey<NestedScrollViewState>();
/// 触发下拉刷新 手动滚动到顶部
void refreshDataWithAnimate() {
  if (pageState != ViewState.BUSY){
    if (collapsedState){
      scrollKey.currentState?.innerController.jumpTo(0);
    }else{
      scrollKey.currentState?.outerController.jumpTo(0);
    }
  }

  refreshData();
}

c. 偶现 首次初始化列表 折叠区域(豆腐块),一直处于折叠状态,无法展开。

原因:静态常量声明使用了.w, 初始化时,scaleWidth有概率为0。原因是screenUtil初始化落后于静态常量初始化导致的

解决方案: 暂时这里不使用静态常量 

根本解决方案:

I. 静态常量不使用.w

II. 更改定义方案,改为变量属性,总之让调用.w晚于screenUtil初始化

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

​
flutter: ══╡ EXCEPTION CAUGHT BY FLUTTER FRAMEWORK ╞═════════════════════════════════════════════════════════
flutter: The following StateError was thrown:
flutter: Bad state: Failed to load https://pic4.zhimg.com/100/v2-1c0788ea29fe3adaa98ff4ac0.jpg.
flutter:
flutter: When the exception was thrown, this was the stack
flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════
flutter: Another exception was thrown: Bad state: Failed to load https://pic4.zhimg.com/100/v2-1c0788ea29fe3adaa98ff4ac0.jpg.

原因: 加载图片ExtendedImage.network,页面返回时,重新调用了load方法,报错,且会有堆栈上传。

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

 [SmartDialog] 'package:flutter/src/widgets/routes.dart': 
Failed assertion: line 1579 pos 12: '_scopeKey.currentState != null': 
Tried to add a willPop callback to a route that is not currently in the tree.

原因:withContainer为false时,不新开container,页面创建太快,立刻点击返回,触发willpop,而此时树中还没有这个路由,因此报错(若解释不对请修正)

解决方案:push flutter页面withContainer改为true。

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

列表为空数组,调用first方法会崩溃。

列表调用firstWhere 找不到数据也会崩溃。

建议使用列表扩展中的safeFirst 和safeFirstWhere方法。

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

原因:Tabbar->TabBarView->pageController(PageView->controller) 滚动有动画,时间300ms,滑动切换tab后,动画还没停止,上滑的时候,动作依然被pageController接管,导致上滑触发了左右滑动。

解决方案: 使用ExtendedTabBarView

/// 构建我的出价 子页面
Widget _buildChildList() {
  return Container(
    color: themeColors.common_bg2_color,
    padding: EdgeInsets.only(bottom: Platform.isAndroid ? 90.w : 0),
    child: ExtendedTabBarView(
      physics: const LessSpringClampingScrollPhysics(),
      shouldIgnorePointerWhenScrolling:false,
      link: false,
      controller: viewModel.tabController,
      children: _getTabKeepAliveList(),
    ),
  );
}

16. 禁用侧滑

方式一:路由push增加参数  'disablePopGesture': true,

方式二:动态禁用侧滑

final PageInfo? pageInfo = RouteNavigator.getPageInfoByContext(ref.context);
BoostChannel.instance.disablePopGesture(containerId: pageInfo?.uniqueId ?? '');

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

原因: iOS底部有安全距离,安卓没有,原因代码如下:

解决方案:ListView设置padding为zero

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2149505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4、(PCT)Point Cloud Transformer

4、&#xff08;PCT&#xff09;Point Cloud Transformer 论文链接&#xff1a;PCT论文链接 本篇论文介绍Transformer在3D点云领域的应用&#xff0c;Transformer在NLP领域和图像处理领域都得到了广泛的应用&#xff0c;特别是近年来在图像领域的应用&#xff0c;本篇论文主要…

希亦超声波清洗机值得购买吗?百元清洁技术之王,大揭秘!

现代社会的高速发展&#xff0c;很多人由于工作繁忙的原因&#xff0c;根本没有时间去清洗自己的日常物品&#xff0c;要知道这些日常物品堆积灰尘之后是很容易就滋生细菌的&#xff0c;并且还会对人体的健康造成一定的危害&#xff01;这个时候很多人就会选择购买一台超声波清…

耐高温滑环的应用场景及市场前景分析

耐高温滑环是一种重要的电气连接装置&#xff0c;广泛应用于需要传递电力和信号的旋转设备中。随着工业技术的发展&#xff0c;对耐高温滑环的需求不断增加&#xff0c;尤其是在极端温度环境下的应用场合&#xff0c;耐高温滑环展现出其独特的优势。 耐高温滑环在工业自动化领…

全国网安众测招募计划启动啦,欢迎加入~

在数字化时代&#xff0c;网络安全已成为维护社会稳定、促进经济发展的基石。为了积极响应国家关于加强网络安全工作的号召&#xff0c;确保某区域关键信息系统的稳固运行&#xff0c;我们特此启动一项网络安全众测活动。该活动旨在通过汇聚业界有经验的网络安全攻防人才&#…

【小程序 - 大智慧】深入微信小程序的渲染周期

目录 前言应用生命周期页面的生命周期组件的生命周期渲染顺序页面路由运行机制更新机制同步更新异步更新 前言 跟 Vue、React 框架一样&#xff0c;微信小程序框架也存在生命周期&#xff0c;实质也是一堆会在特定时期执行的函数。 小程序中&#xff0c;生命周期主要分成了三…

使用 VSCode 在 Python 中创建项目环境

了解如何管理 Python 项目的不同环境&#xff0c;欢迎来到雲闪世界。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 介绍 创建数据科学项目非常简单。如今&#xff0c;有了众多资源&#xff0c;您只需选择开发工具并启动项目即可。 除了多个人工智能机…

24.9.16数据结构|平衡二叉树

一、理解逻辑 平衡二叉是有限制的二叉搜索树&#xff0c;满足平衡因子绝对值小于1的二叉搜索树是平衡二叉树。 平衡指的是树的左右两边的节点左右高度平衡&#xff0c;要求平衡因子处于规定范围 平衡因子&#xff1a;该节点的左高度-右高度&#xff0c;绝对值小于1 如何平衡化&…

2024年9月20日历史上的今天大事件早读

公元前480年9月20日 希腊人在爱琴海萨拉米海战中击败了波斯人 383年9月20日 发生“淝水之战” 1013年9月20日 《君臣事迹》书成&#xff0c;赐名《册府元龟》 1519年9月20日 葡萄牙航海家麦哲伦环球航行 1644年9月20日 清顺治帝驾车由盛京出发&#xff0c;迁都北平&#xf…

在SpringCloud中实现服务熔断与降级,保障系统稳定性

在分布式系统中&#xff0c;微服务架构的应用越来越受欢迎。然而&#xff0c;由于各个微服务之间的依赖关系和网络通信的不稳定性&#xff0c;一个不稳定的服务可能会对整个系统产生连锁反应&#xff0c;导致系统崩溃。为了保障系统的稳定性&#xff0c;我们需要一种机制来处理…

FB FC里调用全局变量注意事项

PLC编程基础之数据类型、变量声明、全局变量和I/O映射 PLC编程基础之数据类型、变量声明、全局变量和I/O映射(CODESYS篇 )_codesys全局变量如何映射写入-CSDN博客文章浏览阅读6.3k次,点赞2次,收藏4次。本文介绍了CODESYS编程的基础知识,包括数据类型、变量声明、全局变量、…

Unity 设计模式 之 结构型模式 -【适配器模式】【桥接模式】 【组合模式】

Unity 设计模式 之 结构型模式 -【适配器模式】【桥接模式】 【组合模式】 目录 Unity 设计模式 之 结构型模式 -【适配器模式】【桥接模式】 【组合模式】 一、简单介绍 二、适配器模式 (Adapter Pattern) 1、什么时候使用适配器模式 2、使用适配器模式的好处 3、适配器…

Active Directory 实验室设置第一部分- AD林安装

在之前的文章中&#xff0c;已经讨论了活动目录的基本知识。在这篇文章中&#xff0c;我们将讨论如何设置和配置环境&#xff0c;以便我们可以使用它来执行各种攻击方案和检测。我们将讨论如何通过GUI和CLI方式完成。 # 1、Active Directory 设置 让我们从活动目录实验室设置…

【JAVA开源】基于Vue和SpringBoot的校园美食分享平台

本文项目编号 T 033 &#xff0c;文末自助获取源码 \color{red}{T033&#xff0c;文末自助获取源码} T033&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

docker-compose 部署 flink [支持pyflink]

下载 flink 镜像 [rootlocalhost ~]# docker pull flink Using default tag: latest latest: Pulling from library/flink 762bedf4b1b7: Pull complete 95f9bd9906fa: Pull complete a880dee0d8e9: Pull complete 8c5deab9cbd6: Pull complete 56c142282fae: Pull comple…

python安装-升级

这里写自定义目录标题 欢迎使用Markdown编辑器 欢迎使用Markdown编辑器 运行python 或pycharm时报错 [notice] A new release of pip is available: 23.1.2 -> 24.2 [notice] To update, run: python.exe -m pip install --upgrade pipCMD 进入 DOS C:\Users\wang>pyt…

深度学习:(五)初识神经网络

&#xff08;一&#xff09;神经网络的层数 除去输入层&#xff0c;但包括输出层&#xff0c;每一层都有自己的参数。 输入层称为第零层。 &#xff08;二&#xff09;最简单的神经网络&#xff08;逻辑回归&#xff09; 下图中的小圆圈&#xff0c;代表了一种运算。且一个小…

手撕小顶堆

1. 抛砖引玉 给定两个以升序排列的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff0c;第二个元素来自 nums2 。 请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。 分析 大根堆&#xff08;大顶堆&#x…

vue无法通过页面路径访问提示404,通过nginx配置处理

部署vue项目时&#xff0c;可以通过IP的方式访问主页&#xff0c;当进入特定页面在刷新时&#xff0c;因为浏览器通过URL地址进行请求&#xff0c;就提示404错误。 每次都需要重新从主页进入&#xff0c;这里是因为nginx配置的问题&#xff0c;在nginx里增加一行重定向的设置 …

如何使用淘宝API获取买家秀数据?一份详细指南

什么是淘宝买家秀API&#xff1f; 淘宝买家秀API是淘宝开放平台提供的一种接口&#xff0c;它允许开发者通过编程方式获取淘宝商品的买家秀信息&#xff0c;包括买家上传的图片、视频、评论等内容。 为什么需要使用淘宝买家秀API&#xff1f; 提升商品质量&#xff1a;通过分…

什么是CSRF攻击,该如何防护CSRF攻击

CSRF攻击&#xff08;跨站请求伪造&#xff0c;Cross-Site Request Forgery&#xff09;是一种网络攻击手段&#xff0c;攻击者利用已通过身份验证的用户&#xff0c;诱导他们在不知情的情况下执行未授权操作。这种攻击通常发生在用户登录到可信网站并且有活动的会话时&#xf…