flutter踩坑记录(持续更新中)

版权声明:本文为博主原创文章,转载请注明出处(www.huangjie.name),保护原创,从我做起.


文章首发于我的简书,本处只做整理归档用

Flutter编译问题

1.Flutter编译时一直卡在”Resolving dependencies”

原因:国内被墙的原因

解决方案1:
配置系统环境变量:

解决方案2:
android目录的build.gradle下添加阿里镜像代理:

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
buildscript {
repositories {
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
google()
jcenter()
}

dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
}
}

allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
google()
jcenter()
}
}

解决方案3:
使用翻墙工具构建

2.运行一些开源的项目编辑报错提示Finished with error: FormatException: Bad UTF-8 encoding 0xc3 (at offset 169)

原因:app的release版本找不到keystore文件
解决方案:
找到android->app目录下的build.gradle,找到buildTypes,修改releasesigningConfigs.releasedebug:

1
2
3
4
5
6
7
8
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
signingConfig signingConfigs.debug
}
}

或者自己重新配置release的签名

3.第一次构建Flutter项目一直卡在Initializing gradle…

结合网上博客总结,有两种解决方案

1.修改镜像
博客地址:
Flutter 运行 一直Initializing gradle…,和模拟器运行白屏问题

本人测试发现没有效果,于是找到了第二种解决方案,亲测有效

2.修改gradle下载地址
找到项目中的android->gradle->wrapper->gradle-wrapper.properties:

1
2
3
4
5
6
#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-4.10.2-all.zip

修改distributionUrl,可以先看一下你本地能运行的项目的gradle的配置,如果没有,可以修改为:

1
distributionUrl=https://services.gradle.org/distributions/gradle-4.6-all.zip

低版本是不行的,flutter需要的gradle版本需要4.6或更高才行,所以你本地如果比这个低也需要改成更高的。

我猜测是因为这个地址在本地是没有的,所以需要到gradle官网上去下载,而在中国下载是巨慢的,所以会一直卡在那里,如果换成本地的就不需要去下载了,直接使用本地的gradle,所以就变快了。

Flutter开发问题

1.使用Navigator.push()跳转界面报错:

1
2
3
'Navigator operation requested with a context that does not include a Navigator.n'
'The context used to push or pop routes from the Navigator must be that of a '
'widget that is a descendant of a Navigator widget.'

原因:传入的context不支持堆栈管理,比如一个类直接继承自StatelessWidgetStatefulWidget,而它本身或父类没有堆栈管理功能。那么这个类是不支持页面跳转的,所以就会报错。要查看是否支持页面跳转,直接进入源码,比如MaterialApp类,它是支持的,那么它的源码里会有对应的功能介绍:

1
2
3
4
5
6
7
8
9
10
11
/// See also:
///
/// * [Scaffold], which provides standard app elements like an [AppBar] and a [Drawer].
/// * [Navigator], which is used to manage the app's stack of pages. //这里做了对应的介绍
/// * [MaterialPageRoute], which defines an app page that transitions in a material-specific way.
/// * [WidgetsApp], which defines the basic app elements but does not depend on the material library.
/// * The Flutter Internationalization Tutorial,
/// <https://flutter.io/tutorials/internationalization/>.
class MaterialApp extends StatefulWidget {
.....
}

放一个报错的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {

@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Welcome to Flutter',
home: new Scaffold(
body:Container(
child: FlatButton(onPressed:(){
var push = Navigator.push(context,MaterialPageRoute(builder: (BuildContext context) {
return new OtherPager("我是从main传过去的值");
}));
push.then((value){
print("我是从上个页面传递回来的值$value");
});
}, child:new Icon(Icons.build)),
)
)
);
}
}

这里的MyApp是直接继承自StatelessWidget的,而在runApp()中直接使用了它,它没有父类而它本身也不支持界面的跳转,所以用它的context传入到Navigator中肯定是会报错的
解决方案
使用一个有堆栈管理功能的父类将MyApp类包裹,使其具有堆栈跳转功能
见如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void main() => runApp(MaterialApp(home: MyApp()));

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
body: Container(
child: FlatButton(
onPressed: () {
var push = Navigator.push(context,
MaterialPageRoute(builder: (BuildContext context) {
return new OtherPager("我是从main传过去的值");
}));
push.then((value) {
print("我是从上个页面传递回来的值$value");
});
},
child: new Icon(Icons.build)),
));
}
}

代码中将MaterialApp移出来了,直接将MyApp包裹了,那么MyAppcontext就生效了,代码也不会报错啦。

2.在pubspec.yaml申明本地图片路径报错

错误信息:

1
2
3
4
5
Error on line 29, column 4 of pubspec.yaml: Expected a key while parsing a block mapping.
assets:
^

pub get failed (65)

原因:格式不对,注意空格,与上面对齐,直接将原来的官方注释掉的解开就会出现这个错误,别问我怎么知道的!!