image
alpha

代码写的好,bug改到老

Flutter安装与调试记录

alpha    2019-08-18 10:51


1. Fluter是什么?

Flutter是Google发布的一个用于创建跨平台、高性能移动应用的框架。Flutter和QT mobile一样,都没有使用原生控件,相反都实现了一个自绘引擎,使用自身的布局、绘制系统。那么,我们会担心,QT mobile面对的问题Flutter是否也一样,Flutter会不会步入QT mobile后尘,成为另一个烈士?要回到这个问题,我们先来看看Flutter诞生过程:

  • 2017 年 Google I/O 大会上,Google 首次推出了一款新的用于创建跨平台、高性能的移动应用框架——Flutter。
  • 2018年2月,Flutter发布了第一个Beta版本,同年五月, 在2018年Google I/O 大会上,Flutter 更新到了 beta 3 版本。
  • 2018年6月,Flutter发布了首个预览版本,这意味着 Flutter 进入了正式版(1.0)发布前的最后阶段。

观其发展,在2018年5月份,Flutter 进入了 GitHub stars 排行榜前 100 名,已有 27k star。而今天(2019年5月29日),已经有65K的Star。经历了短短2年多的时间,Flutter 生态系统得以快速增长,由此可见,Flutter在开发者中受到了热烈的欢迎,其未来发展值得期待!

现在,我们来和QT mobile做一个对比:

  1. 生态;从Github上来看,目前Flutter活跃用户正在高速增长。从Stackoverflow上提问来看,Flutter社区现在已经很庞大。Flutter的文档、资源也越来越丰富,开发过程中遇到的很多问题都可以在Stackoverflow或其github issue中找到答案。
  2. 技术支持;现在Google正在大力推广Flutter,Flutter的作者中很多人都是来自Chromium团队,并且github上活跃度很高。另一个角度,从今年上半年Flutter频繁的版本发布也可以看出Google对Flutter的投入的资源不小,所以在官方技术支持这方面,大可不必担心。
  3. 开发效率;Flutter的热重载可帮助开发者快速地进行测试、构建UI、添加功能并更快地修复错误。在iOS和Android模拟器或真机上可以实现毫秒级热重载,并且不会丢失状态。这真的很棒如果你是一名原生开发者,体验了Flutter开发流后,很可能就不想重新回去做原生了,毕竟很少有人不吐槽原生开发的编译速度。
2. 安装
首先安装git,(如果已经安装,课忽略)下载地址:https://dl.softmgr.qq.com/original/Development/Git-2.22.0-64-bit.exe
然后,下载flutter的git资源
git clone -b stable https://github.com/flutter/flutter.git
如果没有翻墙条件可以使用下面的命令代替:
git clone -b stable https://gitee.com/mirrors/Flutter.git

启动flutter.
 
 
配置环境变量:
 
FLUTTER_STORAGE_BASE_URL
https://storage.flutter-io.cn
 

 
PUB_HOSTED_URL
https://pub.flutter-io.cn
 



 

在VS code中安装Flutter插件。

ctrl + shift + P 输入
Flutter:  Run Flutter Doctor
 
 
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, v1.7.8+hotfix.4, on Microsoft Windows [Version 10.0.17134.950], locale zh-CN)
[X] Android toolchain - develop for Android devices
    X Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.dev/setup/#android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, set ANDROID_HOME to that location.
      You may also want to add it to your PATH environment variable.

[!] Android Studio (not installed)
[!] Connected device
    ! No devices available

! Doctor found issues in 3 categories.
exit code 0


提示需要下载 android studio
https://developer.android.com/studio/index.html

下载速度还蛮快的。下载好了之后使用管理员身份安装。
 
 
 
 

提示连不上安卓SDK

Cancel了,然后继续,弹出下载组件。

一顿下载完成之后:

再次Run Flutter Doctor,提示:
 
flutter doctor --android-licenses
                                                                                Warning: File C:\Users\admin\.android\repositories.cfg could not be loaded.
6 of 6 SDK package licenses not accepted. 100% Computing updates...
Review licenses that have not been accepted (y/N)? y

打开个终端 (cmd.exe),输入:
flutter doctor --android-licenses
接受各种协议。这回解决了两个问题,还有两个问题。
[flutter] flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, v1.7.8+hotfix.4, on Microsoft Windows [Version 10.0.17134.950], locale zh-CN)
[√] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[!] Android Studio (version 3.4)
    X Flutter plugin not installed; this adds Flutter specific functionality.
    X Dart plugin not installed; this adds Dart specific functionality.
[!] Connected device
    ! No devices available

! Doctor found issues in 2 categories.
exit code 0
打开android studio,找到plugins:
 


安装flutter,之后提示重启。


安装个虚拟环境吧。
 

这下没问题了。

 
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, v1.7.8+hotfix.4, on Microsoft Windows [Version 10.0.17134.950], locale zh-CN)
[√] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[√] Android Studio (version 3.4)
[√] Connected device (1 available)
安装好了之后,按照惯例,看看版本吧:
PS C:\Users\admin\Desktop\xxx> flutter --version
Flutter 1.7.8+hotfix.4 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 20e59316b8 (4 weeks ago) • 2019-07-18 20:04:33 -0700
Engine • revision fee001c93f
Tools • Dart 2.4.0
PS C:\Users\admin\Desktop\xxx>

以下是常用命令:

常用命令 含义
--version 查看Flutter版本
-h或者--help 打印所有命令行用法信息
analyze 分析项目的Dart代码。
build Flutter构建命令。
channel 列表或开关Flutter通道。
clean 删除构建/目录。
config 配置Flutter设置。
create 创建一个新的Flutter项目。
devices 列出所有连接的设备。
doctor 展示了有关安装工具的信息。
drive 为当前项目运行Flutter驱动程序测试。
format 格式一个或多个Dart文件。
fuchsia_reload 在Fuchsia上进行热重载。
help 显示帮助信息的Flutter。
install 在附加设备上安装Flutter应用程序。
logs 显示用于运行Flutter应用程序的日志输出。
packages 命令用于管理Flutter包。
precache 填充了Flutter工具的二进制工件缓存。
run 在附加设备上运行你的Flutter应用程序。
screenshot 从一个连接的设备截图。
stop 停止在附加设备上的Flutter应用。
test 对当前项目的Flutter单元测试。
trace 开始并停止跟踪运行的Flutter应用程序。
upgrade 升级你的Flutter副本。

在Android Studio上创建一个Flutter Application.
 

又是一顿安装,完事儿是这样婶儿的:
Launching lib\main.dart on Android SDK built for x86 in debug mode...
Initializing gradle...
Resolving dependencies...
Running Gradle task 'assembleDebug'...
Built build\app\outputs\apk\debug\app-debug.apk.
Installing build\app\outputs\apk\app.apk...
Syncing files to device Android SDK built for x86...
D/EGL_emulation( 6525): eglMakeCurrent: 0xd21184e0: ver 3 0 (tinfo 0xd214e510)
D/eglCodecCommon( 6525): setVertexArrayObject: set vao to 0 (0) 1 0
I/OpenGLRenderer( 6525): Davey! duration=1388ms; Flags=1, IntendedVsync=767311754706, Vsync=767311754706, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=767313860720, AnimationStart=767313922630, PerformTraversalsStart=767314007330, DrawStart=768615831020, SyncQueued=768616881010, SyncStart=768618180580, IssueDrawCommandsStart=768619574470, SwapBuffers=768631024220, FrameCompleted=768701229580, DequeueBufferDuration=68667000, QueueBufferDuration=162000, 
I/Choreographer( 6525): Skipped 82 frames!  The application may be doing too much work on its main thread.
D/EGL_emulation( 6525): eglMakeCurrent: 0xd2118c60: ver 3 0 (tinfo 0xd214e6d0)
D/eglCodecCommon( 6525): setVertexArrayObject: set vao to 0 (0) 1 0
模拟器中出现了:


运行一个Github上的例子,发现提示错误:
Using hardware rendering with device Android SDK built for x86. If you get graphics artifacts, consider enabling software rendering with "--enable-software-rendering".
Launching lib/main.dart on Android SDK built for x86 in debug mode...
Initializing gradle...                                              0.6s
Resolving dependencies...                                           2.1s

Compiler message:
file:///C:/Users/admin/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/photo_view-0.0.11/lib/photo_view.dart:163:24: Error: The argument type 'Null Function(ImageInfo, bool)' can't be assigned to the parameter type 'ImageStreamListener'.
 - 'ImageInfo' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/Free/flutter/packages/flutter/lib/src/painting/image_stream.dart').
 - 'ImageStreamListener' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/Free/flutter/packages/flutter/lib/src/painting/image_stream.dart').
Try changing the type of the parameter, or casting the argument to 'ImageStreamListener'.
    stream.addListener(listener);
                       ^
file:///C:/Users/admin/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/photo_view-0.0.11/lib/photo_view.dart:165:29: Error: The argument type 'Null Function(ImageInfo, bool)' can't be assigned to the parameter type 'ImageStreamListener'.
 - 'ImageInfo' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/Free/flutter/packages/flutter/lib/src/painting/image_stream.dart').
 - 'ImageStreamListener' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/Free/flutter/packages/flutter/lib/src/painting/image_stream.dart').
Try changing the type of the parameter, or casting the argument to 'ImageStreamListener'.
      stream.removeListener(listener);
                            ^
Compiler failed on C:\Users\admin\Desktop\FlutterGank\lib/main.dart

FAILURE: Build failed with an exception.

* Where:
Script 'C:\Free\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 665

* What went wrong:
Execution failed for task ':app:compileflutterBuildDebugX86'.
> Process 'command 'C:\Free\flutter\bin\flutter.bat'' finished with non-zero exit value 1

* 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

BUILD FAILED in 5s
Running Gradle task 'assembleDebug'...
Running Gradle task 'assembleDebug'... Done                         5.9s
Gradle task assembleDebug failed with exit code 1


解决办法:
将file:///C:/Free/flutter/packages/flutter/lib/src/painting/image_stream.dart文件 (路径请自己对应,我的Flutter放在C盘Free文件夹下了)的163行~165行修改为由:
    stream.addListener(listener);
    completer.future.then((_) {
      stream.removeListener(listener);
    });

替换为如下内容:
    stream.addListener(ImageStreamListener(listener));
    completer.future.then((_) {
      stream.removeListener(ImageStreamListener(listener));
    });
注:在VS Code中使用,在终端运行 
flutter run --debug
即可。前提是在Android Studio中配置好了模拟器或测试机环境。
问题:
Launching lib/main.dart on PRA TL10 in debug mode...
Initializing gradle...                                              0.6s
Resolving dependencies...                                           2.5s

Compiler message:
file:///C:/Users/admin/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/cached_network_image-0.5.1/lib/cached_network_image.dart:199:38: Error: The argument type 'void Function(ImageInfo, bool)' can't be assigned to the parameter type 'ImageStreamListener'.
 - 'ImageInfo' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/Free/flutter/packages/flutter/lib/src/painting/image_stream.dart').
 - 'ImageStreamListener' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/Free/flutter/packages/flutter/lib/src/painting/image_stream.dart').
Try changing the type of the parameter, or casting the argument to 'ImageStreamListener'.
      oldImageStream?.removeListener(_handleImageChanged);
                                     ^
file:///C:/Users/admin/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/cached_network_image-0.5.1/lib/cached_network_image.dart:200:32: Error: The argument type 'void Function(ImageInfo, bool)' can't be assigned to the parameter type 'ImageStreamListener'.
 - 'ImageInfo' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/Free/flutter/packages/flutter/lib/src/painting/image_stream.dart').
 - 'ImageStreamListener' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/Free/flutter/packages/flutter/lib/src/painting/image_stream.dart').
Try changing the type of the parameter, or casting the argument to 'ImageStreamListener'.
      _imageStream.addListener(_handleImageChanged);
                               ^
file:///C:/Users/admin/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/cached_network_image-0.5.1/lib/cached_network_image.dart:210:34: Error: The argument type 'void Function(ImageInfo, bool)' can't be assigned to the parameter type 'ImageStreamListener'.
 - 'ImageInfo' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/Free/flutter/packages/flutter/lib/src/painting/image_stream.dart').
 - 'ImageStreamListener' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/Free/flutter/packages/flutter/lib/src/painting/image_stream.dart').
Try changing the type of the parameter, or casting the argument to 'ImageStreamListener'.
    _imageStream?.removeListener(_handleImageChanged);
                                 ^
file:///C:/Users/admin/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/cached_network_image-0.5.1/lib/cached_network_image.dart:465:31: Error: The argument type 'Null Function(StringBuffer)' can't be assigned to the parameter type 'Iterable<DiagnosticsNode> Function()'.
 - 'StringBuffer' is from 'dart:core'.
 - 'Iterable' is from 'dart:core'.
 - 'DiagnosticsNode' is from 'package:flutter/src/foundation/diagnostics.dart' ('file:///C:/Free/flutter/packages/flutter/lib/src/foundation/diagnostics.dart').
Try changing the type of the parameter, or casting the argument to 'Iterable<DiagnosticsNode> Function()'.
        informationCollector: (StringBuffer information) {
                              ^
Compiler failed on C:\Users\admin\Desktop\Flutter_ZhiHu-master\lib/main.dart

FAILURE: Build failed with an exception.

* Where:
Script 'C:\Free\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 665

* What went wrong:
Execution failed for task ':app:compileflutterBuildDebugArm64'.
> Process 'command 'C:\Free\flutter\bin\flutter.bat'' finished with non-zero exit value 1

* 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

BUILD FAILED in 5s
Running Gradle task 'assembleDebug'...
Running Gradle task 'assembleDebug'... Done                         6.0s
Gradle task assembleDebug failed with exit code 1
解决办法(
file:///C:/Users/admin/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/cached_network_image-0.5.1/lib/cached_network_image.dart:199):
    if (_imageStream.key != oldImageStream?.key) {
      oldImageStream?.removeListener(ImageStreamListener(_handleImageChanged));
      _imageStream.addListener(ImageStreamListener(_handleImageChanged));
    }
  }





 
Last Modified: 2020-12-14 13:55
Views: 3.9K

[[total]] comments

Post your comment
  1. [[item.time]]
    [[item.user.username]] [[item.floor]]Floor
  2. Click to load more...
  3. Post your comment