Flutter 开发问题记录

1.google订阅测试要把账号加到测试组。
2.SingleChildScrollView不起作用,外面包一层expanded.
3. canvas的大小可以由外层的SizedBox决定。
4. 用Spacer可以撑开布局。
5.  EasyLoading.dismiss();不起作用,是因为在异步函数里面, 必须加上await,await EasyLoading.dismiss();
6. Flutter app 版本号:1.0.0+1,  1.0.0是version name, +1是version code. 根据经验,version code最好和version name保持一致的格式。比如 1.0.0+10000。
抽象的说是因为version code和version name逻辑上是强关联的,形式上也要强关联,不然就会出现问题。 具体的问题就是,pubyaml文件经常会出现没递交的情况, 上一次打包的人没递交,然请假了,别人打包的时候,一下子不知道version code是什么了。

7. pod install 解决版本不存在的问题.
mac上临时设置代理:

export http_proxy=“http://xn--proxy-xxxxx-ck3f
export https_proxy=“https://proxy-XXXXX:”

临时取消代理:

unset http_proxy

unset https_proxy

查看代理:
env | grep xxx

8. ios UI上显示购买成功但实际失败。
Also double-check to make sure your in-app purchases are approved and active - they go through a separate app review process and they have to be approved (you will know if they are not approved, it will say “waiting for review” or “ready to submit” or something similar.)
要先approved and active。app要先上线。
9. ios修改了版本号,但是依旧不变的时候, 用android stuido debug跑一遍就好了。
10. styledtext需要更新到7.0.0以上, 不然ios上不能显示。
11. 当canvas的内容保存成图片时。 颜色样式要成RawRGBA, 不然ios上会有蓝色蒙层。 另外, 最新版的Image4.0库, 需要加上numChannels的值, RGBA是4.
    final byteData =
        await img.toByteData(format: UI.ImageByteFormat.rawrgba);
12. EasyLoading.dismiss();不起作用,是因为在异步函数里面, 必须加上await,await EasyLoading.dismiss();
13. ipad 分享没反应的问题,需要再包装一个Builder,另外一定要用上sharePositionOrigin。如下:
 Builder(
  builder: (BuildContext context) {
    return ElevatedButton(
      onPressed: () => _onShare(context),
          child: const Text('Share'),
     );
),

// _onShare method:
final box = context.findRenderObject() as RenderBox?;

await Share.share(
  text,
  subject: subject,
  sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
);
14. google广告错误(code: 3, domain: com.google.android.gms.ads, message: Ad unit doesn't match format.) 是因为配错广告了,比如:Rewarded和Rewarded Interstitial搞错了。
15. 瀑布流列表控件, 存在内容需要网络加载时, 会存在上下拉跳跃的问题。是因为移出屏幕可视区的时候,就会被回收。再加载时,由于不知道实际内容的高度,最终加载出来的时候就会出现跳的情况。
比如,图片加载问题。 解决这个问题需要事先知道图片的宽高比,因为宽度是知晓的,根据宽高比来算出高度。
16. google store和apple store包含广告前, 都必须事先正式上架。
17. ios 配置deeplink,  用最新的URLSchma方式, 不需要用老的方式在服务器配置。
18. 相机竖屏拍摄的照片通常带有角度, 要去掉角度可以使用image4.0以上的库,
代码: final img.Image capturedImage = img.decodeImage(await File(path).readAsBytes());
final img.Image orientedImage = img.bakeOrientation(capturedImage);
19. navigation 的页面, 切换显示, 最好使用offstage, 否则会再次加载。导致莫名其妙的显示问题。
20. 一些大图加载显示慢的时候, 可以用percacheImage(), 在显示页前的那一页先加载好。
21. ios可以包含多套app icon, 在xcode里增加就好了。
22. flutter 中类似fragment之间如何通信?
23. flutter_launcher_icons 这个库,只要一张大于1024的图, 就可以一次性搞定androi/ios的各种大小图。
24. Text未自动换行。限制高度,和行数。
25. Get.dialog可以在任何地方打开一个自定义的对话框。关闭是goBack(). 可以通过Get.isDialogOpen来判断对话框是否打开, 可以在deactive()或者onclosed里面关闭。
26. ClipRRect设置图片圆角没有效果。  是因为外层需要指定宽高。
27. ios开发。 NSURL initFileURLWithPath:]: nil string parameter,  可能是没有上传资源文件, 通常是图片。异常的意思是找不到文件。
28. ExpandablePageView中内容总是被撑满, 用wrap可以让子组件按照自身的大小。
29. initState 只能执行同步方法。所以一些需要异步加载的资源就无法顺利加载。 解决方法就是:

  bool hasInit = false;
  @override
  void initState() {
    super.initState();
    hasInit = false;
    Future.delayed(Duration.zero, () async {
      //do load init data.
      hasInit = true;

      setState(() {});
    });
  }
  
    @override
  Widget build(BuildContext context) {
    if (!hasInit) {
      return Container();
    }
    
    // return real ui.
}

30. 一个widget触发事件,事件里触发别的widget的事件。怎么处理。 组件间如何通信问题。 使用streamController.
  late Stream _stream;

  Stream get stream => _stream;
  _streamController = StreamController();
  _stream = _streamController.stream.asBroadcastStream();
  
31. 判断文件是否存在。  当android12以上,返回Content://这种mediaostore uri 的时候,先转换成file path, 再用file.exist判断是否存在。
  static Future exist(String pathOrUri) async{
    String? filePath = pathOrUri;
    if(Platform.isAndroid){
      if(pathOrUri.startsWith("content://")){
        filePath = await LecleFlutterAbsolutePath.getAbsolutePath(uri:pathOrUri); //第三方插件,用于转换成绝对路径。
      }
    }

    if(filePath!=null && filePath.isNotEmpty) {
      return File(filePath!).exists();
    }

    return false;
  } 
  32. ios 删除图片。不是马上删除的,会放到垃圾箱, 只有当垃圾箱中也删除的时候,File().exists()才会返回false.
  33, ClipPath通过重写Clipper就可以裁剪,不同形状的图形。
  34, WidgetsBindingObserver可以在app层面监听app的生命周期, 还有多语言的切换。
  35,Locale是由lanugageCode, countryCode, ScriptCode组成的, 而Getx的国际化是对lanugageCode_countryCode建立的索引。所以存在一定的问题
  36, 静态数组里不要把函数作为成员, 比如不能把多语言cccc.tr这种作为数组成员。 另外,静态数组对热更新无效。
  37,flutter build apk --release --flavor flavoronline -t lib/main_android_online.dart
  38. Exception: Unsupported Android Plugin version: 4.2.2.,  是因为使用了productFlavor,  要在相应的Edit Configuration里添加渠道。
  39. spread operator (...) 类似于kotlin的×号,展开数组合作map的item. 
  40. ios打包时,遇到证书账号的问题, 在确实有的情况下, 还报错, 可能是网络问题, 重启一下电脑就好了。
  41.ios向系统分享
  42.FlutterError.onError = (FlutterErrorDetails details) {
Zone.current.handleUncaughtError(details.exception, details.stack);
};
43. flutter 提示Unsupported Android Plugin version: 4.2.2,  这是由于安卓添加了productFlavors来设置多渠道打包, 所以在调试main.dart的tab页也要加上渠道Flavors。
44. windows 校验apk文件的md5码。
cmd 
Certutil -hashfile filename MD5
Certutil -hashfile filename SHA1
Certutil -hashfile filename SHA256
45. RxDart, 当值更新的时候,如果前一个值和后一个值一样的时候,就不会触发事件, 如果要触发比需再调一下refresh.
46.   Future isReady() async{
    return false;
  } 返回值是Future, 函数体必须是async.
47. 必须设置NDK 把x86排除掉, 不然会增加apk的大小。大概6M.  Flutter app size起跳大于20M.
48. 在manifest上一定要package name,  这和纯android工程不一样.
  D:\Development\aigc-mobile\android\app\src\debug\AndroidManifest.xml Error:
    Attribute activity#com.nero.aigc.MainActivity@name value=(.MainActivity) from (unknown)
    is also present at AndroidManifest.xml:26:9-37 value=(com.xxx.aigc.MainActivity).
    Suggestion: add 'tools:replace="android:name"' to element at AndroidManifest.xml:25:5-44:16 to override.
49.   不可或缺  lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }
50. Fail to transform .jarer'n'j
51. 解决软键盘遮挡住底部按钮问题。 resizeToAvoidBottomInset = false
52. 在google广告播放完毕的回调中, 不能去调用插件方法访问原生。 
53. 不要写错事件赋值。 onTap:(){ controller.pickImage(context);},  不要直接写成onTap:controller.pickImage(context)。 会抛出异常:setState() or markNeedsBuild() called during build.

你可能感兴趣的:(flutter)