前言
写这篇文章是为了记录平时在使用flutter时遇到的问题,及解决方案,方便再次遇到时能够快速解决。
问题及解决
问题1
真机运行项目,在构建时提示
Running Gradle task 'assembleDebug'... 41.8s
[!] App requires Multidex supportMultidex support is required for your android app to build since the number of methods has exceeded 64k. You may pass the --no-multidex flagto 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
在程序中如何监听某一个变量是否发生了改变
ValueNotifier<int> count = ValueNotifier(0);// 注册监听器
count.addListener(() {print("Count changed: ${count.value}");
});// 修改变量的值
count.value = 1; // Count changed: 1
模拟请求超时
在dio
中可以判断是否请求超时,最近在做一个功能,需要模拟请求超时。
有时候程序一直在等待执行结果,如果执行时间比较久,就会影响到后续的执行。通过模拟请求超时,来出现长时间的等待问题。
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_handler
和 EasyLoading
两个插件来实现,关于这两个插件的基本使用见:
Flutter:视频下载案例
Flutter:EasyLoading(loading加载、消息提示)
代码如下,需要在main.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);}}Widget build(BuildContext context) {// 进行权限请求requestMultiplePermissions(context);return MaterialApp(// 应用的主题、页面等配置home: MyHomePage(),);}
}