Flutter使用问题整理

前言

写这篇文章是为了记录平时在使用flutter时遇到的问题,及解决方案,方便再次遇到时能够快速解决。

问题及解决

问题1

真机运行项目,在构建时提示

Running Gradle task 'assembleDebug'...                             41.8s
[!] App requires Multidex support
    Multidex support is required for your android app to build since the number of methods has exceeded 64k. You may pass the --no-multidex flag
    to skip Flutter's multidex support to use a manual solution.

解决方案:

参考:https://docs.flutter.dev/deployment/android#enabling-multidex-support

在终端上执行 flutter run --debug,当出现Do you want to continue with adding multidex support for Android? [yln]提示时,选择y

问题2

在程序中如何监听某一个变量是否发生了改变

dart 复制代码
ValueNotifier<int> count = ValueNotifier(0);

// 注册监听器
count.addListener(() {
  print("Count changed: ${count.value}");
});

// 修改变量的值
count.value = 1; // Count changed: 1

模拟请求超时

dio中可以判断是否请求超时,最近在做一个功能,需要模拟请求超时。

有时候程序一直在等待执行结果,如果执行时间比较久,就会影响到后续的执行。通过模拟请求超时,来出现长时间的等待问题。

dart 复制代码
Future<int> performTask() async {
  await Future.delayed(Duration(seconds: 3)); // 模拟一个耗时的异步操作

  return 42; // 返回执行结果
}

void main() {
  performTask().timeout(Duration(seconds: 2), onTimeout: () {
    return -1; // 在超时时返回-1
  }).then((result) {
    print('执行结果:$result');
  }).catchError((error) {
    print('发生错误:$error');
  });

 // 或者
 int res = await performTask().timeout(Duration(seconds: 2), onTimeout: () {
    return -1; // 在超时时返回-1
  }).then((result) {
    print('执行结果:$result');
    return result;
  }).catchError((error) {
    print('发生错误:$error');
  });
}

问题3

在使用Android Studio的Device Explorer 向外到处文件时提示:

Error opening contents of device file "hello.txt": Cannot create directory C:\Users\octop\Documents\AndroidStudio\DeviceExplorer\emulator-5554\sdcard\Download\hello

解决方案:在终端里运行 adb root

如果提示'adb' 不是内部或外部命令,也不是可运行的程序或批处理文件",那么就需要配置环境变量。

1、找到sdk所在的文件夹

2、在sdk目录里找到adb.exe文件

3、选择系统变量,在path添加adb程序所在路径

4、执行完adb root后,重启Android studio后可以顺利到处文件

问题4

在访问http开头的网络时,报错提示:

WebResourceError{description: net::ERR_CLEARTEXT_NOT_PERMITTED, type: UNKNOWN}

原因是:从Android 9(API级别28)开始,默认情况下,Android应用程序不允许加载不安全的非加密网络资源。这意味着如果你的应用程序尝试加载使用HTTP协议的资源,将会引发net::ERR_CLEARTEXT_NOT_PERMITTED错误。

解决:打开android/app/src/main/AndroidManifest.xml 文件,添加 android:usesCleartextTraffic="true" 再重新编译程序

问题5

有时候会遇到这样的app,在启动时需要授予权限,当拒绝授予权限后,app会自动退出。这个功能可以基于permission_handlerEasyLoading 两个插件来实现,关于这两个插件的基本使用见:

Flutter:视频下载案例

Flutter:EasyLoading(loading加载、消息提示)

代码如下,需要在main.dart里使用

dart 复制代码
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 应用权限请求
  void requestMultiplePermissions(BuildContext context) async {
    Map<Permission, PermissionStatus> status = await [
      // 网络权限
      Permission.storage,
    ].request();
    // 判断是否存在权限未授予的情况
    bool hasPermission = status.values.every((status) => status.isGranted);
    if (!hasPermission) {
      EasyLoading.showToast("获取权限失败,应用无法正常运行");
      await Future.delayed(const Duration(seconds: 2));
      exit(0);
    }
  }

  @override
  Widget build(BuildContext context) {
    // 进行权限请求
    requestMultiplePermissions(context);

    return  MaterialApp(
      // 应用的主题、页面等配置
      home: MyHomePage(),
    );
  }
}
相关推荐
许进进17 小时前
FlutterWeb渲染模式及提速
android·flutter·web
喵个咪18 小时前
Flutter 使用 RxDart & Streams 实现 BLoC模式
前端·flutter·reactivex
iFlyCai1 天前
Flutter本地数据持久化的几种方式
flutter
snwrking2 天前
各个版本Android上的Location与Notification权限的问题
android·flutter
头好晕呀2 天前
Flutter+WebRTC开发点对点加密即时通讯APP--好友列表界面实现
android·前端·flutter
coder_pig3 天前
跟🤡杰哥一起学Flutter (十九、Flutter混编杂谈[Android]😫)
android·flutter·harmonyos
鳄鱼不怕_牙医不怕4 天前
Flutter 源码梳理系列(十):BuildOwner class
flutter·源码阅读
甜瓜看代码4 天前
让你的切换丝滑起来,Hero animations的介绍
flutter
啊猪是的读来过倒4 天前
Vue 全局状态管理新宠:Pinia实战指南
前端·vue.js·flutter·pinia·全局状态管理
偷野的程咬金5 天前
了解flutter中SingleTickerProviderStateMixin的使用
flutter