uni-app switch组件android平台无限闪动bug

uni-app switch组件android平台无限闪动bug

开发环境 版本号 项目创建方式
Mac 12.0.1 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Mac

HBuilderX类型:正式

HBuilderX版本号:3.4.7

手机系统:Android

手机系统版本号:Android 10

手机厂商:小米

手机机型:k30

页面类型:nvue

vue版本:vue2

打包方式:云端

项目创建方式:HBuilderX

示例代码:

<template>  
    <view class="" style="margin-top: 100px;" >  
        <switch :checked="busyStatus" />  
        <text @click="onClick">点击</text>  
    </view>  
</template>  

<script>  
    export default {  
        components:{  
        },  
        data() {  
            return {  
                busyStatus:true  
            }  
        },  
        methods: {  
            onClick(e) {  
                this.busyStatus=!this.busyStatus  
            }  
        }  
    }  
</script>

操作步骤:

按代码执行即可

预期结果:

正常使用

实际结果:

无法正常使用

bug描述:

android,动态切换checked后,android系统无限循环闪动了,目前测试了小米,华为,vivo,都有这个问题

1652839442682116.mp4_.zip


更多关于uni-app switch组件android平台无限闪动bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

问题复现,已反馈给相关人员排查,已加分感谢反馈!

更多关于uni-app switch组件android平台无限闪动bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html


3.4.11 alpha 已修复

在 uni-app 中使用 switch 组件时,如果遇到在 Android 平台上无限闪动的问题,可能是由于以下原因导致的:

1. 数据绑定问题

  • 原因: 如果 switch 组件的 checked 属性与数据绑定不当,可能会导致状态不断切换,从而引发闪动。
  • 解决方案: 确保 checked 属性的绑定数据在切换时正确更新,并且不要在同一时间多次触发状态变化。
<template>
  <switch :checked="isChecked" @change="handleSwitchChange" />
</template>

<script>
export default {
  data() {
    return {
      isChecked: false
    };
  },
  methods: {
    handleSwitchChange(e) {
      this.isChecked = e.detail.value;
    }
  }
};
</script>

2. 异步操作导致的状态不一致

  • 原因: 如果在 switchchange 事件中执行了异步操作(如网络请求),并且异步操作完成后更新了 checked 状态,可能会导致状态不一致,从而引发闪动。
  • 解决方案: 确保异步操作完成后正确更新状态,或者在异步操作期间禁用 switch 组件。
<template>
  <switch :checked="isChecked" @change="handleSwitchChange" :disabled="isLoading" />
</template>

<script>
export default {
  data() {
    return {
      isChecked: false,
      isLoading: false
    };
  },
  methods: {
    handleSwitchChange(e) {
      this.isLoading = true;
      const newValue = e.detail.value;

      // 模拟异步操作
      setTimeout(() => {
        this.isChecked = newValue;
        this.isLoading = false;
      }, 1000);
    }
  }
};
</script>

3. 样式冲突

  • 原因: 自定义样式或第三方样式库可能与 switch 组件的默认样式冲突,导致渲染异常。
  • 解决方案: 检查并调整样式,确保不会影响 switch 组件的正常渲染。
/* 确保没有全局样式影响 switch 组件 */
switch {
  /* 自定义样式 */
}

4. uni-app 版本问题

  • 原因: 旧版本的 uni-app 可能存在 switch 组件的兼容性问题。
  • 解决方案: 更新 uni-app 到最新版本,确保使用的是最新的稳定版本。
npm update [@dcloudio](/user/dcloudio)/uni-app

5. 平台差异

  • 原因: Android 和 iOS 平台在渲染 switch 组件时可能存在差异,导致在 Android 平台上出现闪动。
  • 解决方案: 使用条件编译针对不同平台进行特殊处理。
<template>
  <switch :checked="isChecked" @change="handleSwitchChange" />
</template>

<script>
export default {
  data() {
    return {
      isChecked: false
    };
  },
  methods: {
    handleSwitchChange(e) {
      #ifdef APP-PLUS
      // 针对 Android 平台的特殊处理
      if (plus.os.name === 'Android') {
        // 添加额外的逻辑
      }
      #endif

      this.isChecked = e.detail.value;
    }
  }
};
</script>

6. 自定义组件封装问题

  • 原因: 如果 switch 组件被封装在自定义组件中,可能会导致事件传递或状态管理出现问题。
  • 解决方案: 确保自定义组件中正确传递 checked 属性和 change 事件。
<!-- CustomSwitch.vue -->
<template>
  <switch :checked="checked" @change="$emit('change', $event)" />
</template>

<script>
export default {
  props: {
    checked: Boolean
  }
};
</script>
<!-- 使用自定义组件 -->
<template>
  <custom-switch :checked="isChecked" @change="handleSwitchChange" />
</template>

<script>
import CustomSwitch from './CustomSwitch.vue';

export default {
  components: {
    CustomSwitch
  },
  data() {
    return {
      isChecked: false
    };
  },
  methods: {
    handleSwitchChange(e) {
      this.isChecked = e.detail.value;
    }
  }
};
</script>
回到顶部