当前位置:   article > 正文

Flutter开发常见问题,解决小技巧_exception: gradle build failed to produce an .apk

exception: gradle build failed to produce an .apk file. it's likely that thi

1.Android Studio 4.0 以上打包编译报错;

Execution failed for task ':app:lintVitalRelease'.
> Could not resolve all artifacts for configuration ':app:debugRuntimeClasspath'.
   > Failed to transform libs.jar to match attributes {artifactType=processed-jar, org.gradle.libraryelements=jar, org.gradle.usage=java-runtime}.
      > Execution failed for JetifyTransform: E:\FlutterSpace\xxxx\build\app\intermediates\flutter\debug\libs.jar.
         > Transform's input file does not exist: E:\FlutterSpace\xxxx\build\app\intermediates\flutter\debug\libs.jar. (See https://issuetracker.google.com/
issues/158753935)

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

1.在子build.gradle添加以下代码:

android{
	lintOptions { checkReleaseBuilds false }
}
  
  • 1
  • 2
  • 3
  • 4

解决方案:原文地址:https://my.oschina.net/u/4364921/blog/4725237

2.Exception: Gradle build failed to produce an .apk file. It’s likely that this file was generated under /build, but the tool couldn’t find it.

打包时找不到渠道包名导致;

1.通过VSCode找到项目当中有一 launch.json 文件

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
            {
                    "name": "YOUR_PROJECT_NAME",//你项目的名称
                    "program": "lib/main.dart",
                    "request": "launch",
                    "type": "dart",
                    "args": [
                            "--flavor",
                            "ADD_YOUR_FLAVOR_NAME_HERE" //配置你的渠道包名
                        ]
            }
    ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

2.通过Andorid Studio 找到子build.gradle文件添加渠道配置;

android {
    compileOptions {
        targetCompatibility JavaVersion.VERSION_1_8
        sourceCompatibility JavaVersion.VERSION_1_8
    }

    android.applicationVariants.all {
        variant ->
            variant.outputs.all {
                //在这里修改apk文件名
                outputFileName = "-v${variant.versionName}-${variant.productFlavors[0].name}-release.apk"
            }
    }

    productFlavors {
        pgyer {}   // 蒲公英
        huawei {}       // 华为商店
        baidu {}        // 百度手机助手
        yinyongbao {}   // 应用宝
        xiaomi {}   // 小米
        oppo {}   // OPPO
        vivo {}   // VIVO
        s360 {}   // 360
        lenovo {}   // 联想
        aliuc {}   // 阿里UC
    }

    // 批量渠道包值替换(有些第三方库中需要用到渠道名)
    productFlavors.all { flavor ->
        // 友盟推送渠道包, UMENG_CHANNEL_VALUE 是根据你AndroidManifest.xml来配置的,请看下面。
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
    //解决打包异常的问题
    lintOptions { checkReleaseBuilds false }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

解决方案:https://stackoverflow.com/questions/59732883/flutter-gradle-build-failed-to-produce-an-apk-file-its-likely-that-this-file

3._positions.isNotEmpty, ‘ScrollController not attached to any scroll views.’

具体报错问题;

The following assertion was thrown building Swiper(state: _SwiperState#e86c5):
ScrollController not attached to any scroll views.
'package:flutter/src/widgets/scroll_controller.dart':
Failed assertion: line 108 pos 12: '_positions.isNotEmpty'
  • 1
  • 2
  • 3
  • 4

解决方案:https://blog.csdn.net/youtiankeng/article/details/107419322

4.Android studio Flutter 开发快捷键

https://flutter.cn/docs/development/tools/android-studio

5.Flutter WebView js交互

html 测试代码块

<html>
<head>
    <title>Js调用Flutter</title>
    <script>
     function Close() {
        AppWndClose.postMessage("JS调用了Flutter");
    }
    </script>
</head>

<body>
<br>
<input type="button" value="关闭" onclick="Close()"/>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

flutter 测试代码块

WebView(
     javascriptChannels: <JavascriptChannel>[ 
        JavascriptChannel(
      name: 'AppWndClose',
      onMessageReceived: (JavascriptMessage message) {
        showToast(message.message);
      })
   ].toSet(),
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

我们要注意的是代码里面使用的都是AppWndClose ;这个是我们要注意到的;
参考地址:https://zhuanlan.zhihu.com/p/124797055

6.Flutter WebView跳转dart界面

  1. 通过js的方法进行调用;
class CustomWebViewPage extends StatefulWidget {
  final String url;

  CustomWebViewPage({
    Key key,
    @required this.url,
  });

  @override
  createState() => _PageState();
}

class _PageState extends State<CustomWebViewPage> with WidgetsBindingObserver {
  _PageState();

  FlutterWebviewPlugin _webViewPlugin = FlutterWebviewPlugin();

  double lineProgress = 0.0;

  bool loadError = false;

  HomeModel homeModel;

  initState() {
    super.initState();
    _webViewPlugin.onProgressChanged.listen((progress) {
      print(progress);
      setState(() {
        lineProgress = progress;
      });
    });
    _webViewPlugin.onHttpError.listen((progress) {
      setState(() {
        loadError = true;
      });
    });
    _webViewPlugin.onStateChanged.listen((event) {
      if (event.type == WebViewState.finishLoad) {}
      setState(() {});
    });
    WidgetsBinding.instance.addObserver(this);
    EventBus.getDefault().register(this, (data) {
      if (data is PublishPostsEvent || data == 'tabRankList') {
        _webViewPlugin.evalJavascript("RefreshMissionList()").then((res) {
          print("evaluateJavascript-res: ${res}");
        });
      }
    });
    _wlakPermission(false);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    print("-didChangeAppLifecycleState-" + state.toString());
    switch (state) {
      case AppLifecycleState.inactive: // 处于这种状态的应用程序应该假设它们可能在任何时候暂停。
        break;
      case AppLifecycleState.resumed: //从后台切换前台,界面可见
        _webViewPlugin.evalJavascript("AppOnShow()").then((res) {
          print("evaluateJavascript-res: ${res}");
        });
        break;
      case AppLifecycleState.paused: // 界面不可见,后台
        _webViewPlugin.evalJavascript("AppOnHide()").then((res) {
          print("evaluateJavascript-res: ${res}");
        });
        ;
        break;
      case AppLifecycleState.detached: // APP结束时调用
        break;
    }
  }

  @override
  Widget build(BuildContext context) {
    homeModel = Provider.of<HomeModel>(context);
    return WebviewScaffold(
        url: widget.url,
        mediaPlaybackRequiresUserGesture: false,
        withZoom: false,
        withJavascript: true,
        clearCookies: true,
        hidden: true,
        javascriptChannels: <JavascriptChannel>[
          JavascriptChannel(
              name: "AppWndClose",
              onMessageReceived: (JavascriptMessage message) {
                NavigatorUtils.goBack(context);
              }),
          _postThread(),
          _partInTopic(),
        ].toSet(),
        initialChild: Container(
          child: Stack(
            children: [
              Center(
                  child: StateLayout(
                type: loadError ? StateType.network : StateType.loading,
              )),
              _setTitle(context),
            ],
          ),
        ));
  }

  _postThread() {
    return JavascriptChannel(
        name: "eventPostThread",
        onMessageReceived: (JavascriptMessage message) {
          _webViewPlugin.hide();
          print("参数: ${message.message}");
          NavigatorUtils.push(context, ProfileRouter.publishPosts)
              .then((value) {
            _webViewPlugin.show();
            _webViewPlugin.evalJavascript("RefreshMissionList()").then((res) {
              print("evaluateJavascript-res: ${res}");
            });
          });
        });
  }


  _partInTopic() {
    return JavascriptChannel(
        name: "eventTaskPartinTopic",
        onMessageReceived: (JavascriptMessage message) {
    // 因为flutter_webview_plugin 是浮在flutterUI上的一层视图,它不在widget树中,跳转到dart页面时,需要隐藏掉web页面
          _webViewPlugin.hide();
          NavigatorUtils.push(context, TopicRouter.topic).then((value) {
          //再跳回来时再显示web页面
            _webViewPlugin.show();
            _webViewPlugin.evalJavascript("RefreshMissionList()").then((res) {
            //同时调用web端接口进行刷新操作;
            });
          });
        });
  }


  _setTitle(context) {
    return Positioned(
      left: 15,
      top: MediaQuery.of(context).padding.top + 5,
      child: BackButton(
        onPressed: () {
          NavigatorUtils.goBack(context);
        },
      ),
    );
  }

  _progressBar(double progress, BuildContext context) {
    return Offstage(
        offstage: progress == 1.0,
        child: Container(
          child: LinearProgressIndicator(
            backgroundColor: Colors.blueAccent.withOpacity(0),
            value: progress == 1.0 ? 0 : progress,
            valueColor: new AlwaysStoppedAnimation<Color>(Colors.lightBlue),
          ),
          height: 2,
        ));
  }

  @override
  void dispose() {
    _webViewPlugin.dispose();
    WidgetsBinding.instance.removeObserver(this);
    EventBus.getDefault().unregister(this);
    super.dispose();
  }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  1. 通过加载URL的形式进行监听响应跳转;

///省略上面代码;

  @override
  void initState() {
    super.initState();

    flutterWebviewPlugin.onUrlChanged.listen((loadUrl){
      //WebviewScaffold 加载的url变化时触发此方法
      // print('===>>当前 url:$loadUrl');

      // h5 点退出按钮,关闭webView
      if (loadUrl.endsWith('/backapp')){
        flutterWebviewPlugin.close();
        pop();
      }
      // 跳转到dart页面
      else if (loadUrl.endsWith('/policy')){
        // 因为flutter_webview_plugin 是浮在flutterUI上的一层视图,它不在widget树中,跳转到dart页面时,需要隐藏掉web页面,再跳回来时再显示web页面
        flutterWebviewPlugin.hide(); 
        routePush(ClassRoomPage()).then((value) {
          flutterWebviewPlugin.show();
          flutterWebviewPlugin.reloadUrl(widget.url);
        });

//跳转到dart页面时,也可以关闭掉web页面,再跳回来时再创建一个web页面
        // flutterWebviewPlugin.close();
        // routePush(ClassRoomPage()).then((value){
        //   flutterWebviewPlugin.launch(widget.url,
        //     rect: new Rect.fromLTWH( // 设置web页面的尺寸
        //       0.0,
        //       _navBarHeight,
        //       MediaQuery.of(_context).size.width,
        //       MediaQuery.of(_context).size.height-_navBarHeight,
        //     ),
        //   );
        // });
      }
    });

    //加载错误时监听
    // flutterWebviewPlugin.onHttpError.listen((error){
    //   print('加载错误:${error.code}  ${error.url}');
    // });

    //加载状态变化监听
    // flutterWebviewPlugin.onStateChanged.listen((state){
    //   print('状态监听:${state.type.toString()}');
    // });
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

参考文章:flutter_webview_plugin 与dart页面跳转使用

7. cmdline-tools component is missing Run path/to/sdkmanager --install "cmdline-tools;latest"

参考文章:https://blog.csdn.net/weixin_41824429/article/details/118942087

8.android studio安装和flutter project创建卡住问题解决

参考文章:https://blog.csdn.net/lucynie/article/details/106928231

9. Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses

参考文章:https://www.jianshu.com/p/4feeec038482

10.Flutter Getx 结合 TabView

参考文章:https://stackoverflow.com/questions/63924491/how-to-build-a-tabview-using-flutter-getx

11. Flutter 项目window应用鼠标无法滚动


const Set<PointerDeviceKind> _kTouchLikeDeviceTypes = <PointerDeviceKind>{
  PointerDeviceKind.touch,
  PointerDeviceKind.mouse,
  PointerDeviceKind.stylus,
  PointerDeviceKind.invertedStylus,
  PointerDeviceKind.unknown
};

MaterialApp(
    ...
    scrollBehavior: const MaterialScrollBehavior().copyWith(
      scrollbars: true,
      dragDevices: _kTouchLikeDeviceTypes
    ),
    ...
);

//如果你使用的是Getx框架同上,有相同的属性;scrollBehavior

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

参考文章:https://www.cnblogs.com/yangyxd/p/15080537.html

12. Flutter 项目window应用运行异常

问题:

CMake Error at CMakeLists.txt:2 (project):
  Generator

    Visual Studio 16 2019

  could not find any instance of Visual Studio.

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

具体解决方法:

https://stackoverflow.com/questions/69944913/cmake-error-while-running-flutter-desktop-application/69951396#69951396 。 Flutter 2.9 版支持 VS 2022,而您使用的 2.8.1 版仅支持 VS 2019。只需安装 2019 并试一试。
如果你想在 2.8.1 版本中使用 VS 2022,这里是解决方法。 stackoverflow.com/a/69951396/6566310 我想这个解决方法是值得的。
感谢您提供这两种解决方案。但我确实选择了第一个,现在它正在工作。

解决方案:https://www.likecs.com/ask-5954170.html

12. Flutter创建本地 Library 工具类

解决方案:https://www.jianshu.com/p/70f874765965

13. Unsupported class file major version 59

解决方案:https://github.com/grpc/grpc-java/issues/8264

14. Lint infrastructure error

解决方案:https://juejin.cn/post/7037307560977760292

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/515283
推荐阅读
相关标签
  

闽ICP备14008679号