Flutter常见问题

Flutter常见问题

facebook等海外资源, 使用pod获取时如果有自己的私有库,翻墙后二者不可得兼时, 可以先去.cocoapods中删除私有库(后者压缩之后保存, 待海外包拉取完毕之后再放进去)

Flutter报错之Waiting for another flutter command to release the startup lock

  1. 打开flutter安装目录/bin/cache, 如果找不到执行 ` where flutter` 命令

  2. flutter sdk的目录下面的bin/cache

  3. 删除lockfile文件

若删除不掉,需要在进程管理器中停止 dart.exe的进程,然后再次尝试进行删除

此时可在命令行再执行flutter相关命令,完美解决

运行Flutter项目执行pod install:

1
[!] The 'Pods-Runner' target has transitive dependencies that include statically linked binaries: (/Users/hello/Desktop/xzlcorp/AndroidStudioProjects/flutter_app/ios/Pods/LuakitPod/lib/libLuakit.a and /Users/hello/Desktop/xzlcorp/AndroidStudioProjects/flutter_app/ios/Pods/curl/lib/libcurl.a)

解决办法: 打开iOS目录下的Podfile,删除掉use_frameworks! 重新build即可。

类型转换是报错: flutter type ‘_InternalLinkedHashMap<Object?, Object?>’ is not a subtype of

flutter工程跑安卓时指定java路径(注意mac和windows路径不一样, 所以不方便git管理)

在gradle.properties文件中指定:

1
org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home

flutter工程跑android报错:

Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.

解决办法:https://blog.csdn.net/vitaviva/article/details/116080977

flutter编译报错如下:

Unhandled Exception: FormatException: Unexpected extension byte (at offset 5)

解决办法:

  1. 多编译几次, 如果不行执行
  2. 如果步骤1不管用,flutter clean 然后再执行步骤1
  3. 如果步骤2不行, 执行 flutter pub cache clean;flutter pub get;,然后再执行步骤1

flutter编译报错如下:

1
warning: The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 14.0.99. (in target 'flutter_local_notifications' from project 'Pods')

解决办法如下:

注释如下代码:

1
2
3
4
5
6
## 注释掉
#post_install do |installer|
#  installer.pods_project.targets.each do |target|
#    flutter_additional_ios_build_settings(target)
#  end
#end

添加如下代码:

1
2
3
4
5
6
7
post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0'
        end
    end
end

原生的界面在flutter上显示会自动添加一个黑色的线框

多个可滑动的tab组成页面时,并且都带下拉刷新,使用mvp模式开发, 切换页面卡顿

在切换动画过程中,页面乜有完全显示之前会触发页面的build方法, 如果此时存在网络请求,并且网络请求在页面还没有完全展示(切花到一半)时已经返回,再次出发了页面的重构,那么会造成页面卡顿解决方法有二:

解决方法一: 等页面完全展示之后发动网络请求

解决方法二:延时网络请求

flutter键盘无法顶起输入框(遮挡输入框)

嵌套在scafford组件中

setState() or markNeedsBuild() called during build.

原因是因为控件还没有构建完毕,

解决方案一: 如果你想在initState的时候调用这个组件,那么就需要等父组件创建完成后再去创建小组件, 官方提供了一个组件创建完成的回调通知方法

1
2
3
   WidgetsBinding.instance.addPostFrameCallback((_) {
       //需要创建的小组件
 });

解决方案二: 延时加载即可解决问题

setState() called after dispose()

网络请求成功前退出了页面,该 State 被从对象树卸载掉,而这时回调了网络请求的方法,方法中带有 setState 的调用,也就导致了该问题。

问题原因

State 对象被从对象数卸载释放之后再次调用 setState 就会报 setState() called after dispose()。

解决方案

1
2
3
 if (mounted) {
      setState(fn);
    }

Flutter侧边返回手势事件监听

使用WillPopScope包裹一下即可,点击导航栏返回按钮和侧滑手势都会走到onWillPop回调里面去, 代码如下:

1
2
3
4
5
6
7
8
9
WillPopScope(//使用此包裹之后侧滑返回手势不生效,正是要这个效果
  onWillPop: (){
    Log.d('pop');
    //如果需要传参那么使用这种方式
     Navigator.of(context).pop({'type':0});
    return Future.value(false);
  },
  child: ...
  )

flutter和原生交互时flutter传递给原生的回调只能执行一次(这是flutter的机制)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 __weak __typeof(self) weakSelf = self;
    // 要与main.dart中一致
    NSString *channelName = @"com.123";
    FlutterMethodChannel *messageChannel = [FlutterMethodChannel methodChannelWithName:channelName binaryMessenger:self];
    [messageChannel setMethodCallHandler:^(FlutterMethodCall* _Nonnull call, FlutterResult  _Nonnull result) {
        // call.method 获取 flutter 给回到的方法名,要匹配到 channelName 对应的多个 发送方法名,一般需要判断区分
        // call.arguments 获取到 flutter 给到的参数,(比如跳转到另一个页面所需要参数)
        // result 是给flutter的回调, 该回调只能使用一次
        NSLog(@"flutter 给到我:\nmethod=%@ \narguments = %@",call.method,call.arguments);
        
        if([call.method isEqualToString:@"iOSFlutter"]) {
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"flutter回调" message:[NSString stringWithFormat:@"%@",call.arguments] delegate:self cancelButtonTitle:@"确定"otherButtonTitles:nil];
            [alertView show];
            // 回调给flutter
            if (result) {
                result(@1000);
            }
        } else {
            result(FlutterMethodNotImplemented);
        }
    }];

1. Flutter Text 文字下有黄色下划线

导致原因

导致这种情况发生的原因是因为,Text widget 隶属于Material 风格下的组件,如果根节点不是Material 相关组件,则会使用默认带黄色下划线的格式。如果根节点是Material 容器组件,则会采用其Material风格的样式(即不带有下换线)。

解决方式

  1. 采用根节点为脚手架Scaffold组件
Scaffold(body: content,);
  1. 采用根节点为Material 组件
Material(child: content);
  1. 逐个修改Text 组件的style 下的decoration为TextDecoration.none
1
2
3
4
5
6
7
8
9
10
11
child: Text(
                      "专栏的文章",
                      overflow: TextOverflow.ellipsis,
                      style: TextStyle(
                        decoration: TextDecoration.none,
                        color: Color(0xFF888888),
                        fontSize: 14,
                        fontWeight: FontWeight.bold,
                        fontFamily: defaultFontFamily,
                      ),
                    )