1. GradleException报红
解决方法:将GradleException改为Exception
android\app\build.gradle
if (flutterRoot == null) {
// throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
throw new Exception("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
2. 打包时gradle版本报错
android\build.gradle
这里的版本要和Android Studio一致
dependencied {
classpath 'com.android.tools.build:gradle:4.1.0'
…
}
gradle版本低报错:Minimum supported Gradle version is 6.5. Current version is 5.6.2
在android/gradle/wrapper/gradle-wrapper.properties中更改gradle版本
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
3. 远程仓库JCenter下载慢
使用阿里云的maven镜像
/android/build.gradle
repositories {
// google()
// jcenter()
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/public' }
}
4. ListView嵌套高度问题
在ListView.build的外层Container外层添加Expanded层,如果有RefreshIndicator(下拉刷新)组件,那就将RefreshIndicator的外层嵌套Expanded组件
return Column(
children: [
Container(
height: 50,
child: TextField(),
),
Expanded(
child: Container(
child: ListView.builder(...),
),
],
);
5. FutureBuilder的使用
调用接口方法:
Future<List> _getData() async {
var dio = Dio();
Response response = await dio
.get(接口地址url);
print(response.data['rows']);
if (response.data['code'] == 200) {
return response.data['rows'];
} else {
// 无结果则返回一个空数组
return new List();
}
}
FutureBuilder的使用(在body中)
FutureBuilder(
future: _getData(),
// ignore: missing_return
builder: (BuildContext context, AsyncSnapshot snapshot) {
switch (snapshot.connectionState) {
// 等待状态
case ConnectionState.waiting:
return Center(
child: CupertinoActivityIndicator(
radius: 15,
),
);
// 完成状态
case ConnectionState.done:
// TODO: Handle this case.
if (snapshot.hasError) {
return new Center(
child: Container(
margin: EdgeInsets.all(5),
child: Column(
children: [
Icon(
Icons.warning_rounded,
color: Colors.red,
),
Text(
'抱歉,发生了一点错误',
style: TextStyle(color: Colors.red),
),
Text(
'${snapshot.error}',
style: TextStyle(color: Colors.red),
),
],
),
),
);
} else {
return ListView.builder(
// 接口的返回值为snapshot.data
itemCount: snapshot.data.length,
itemBuilder: (context, index) {...}
);
}
break;
// 其他状态
default:
return Center(
child: Text('暂无数据'),
);
}
},
),
6. FormData接口上传图片
- 选取图片组件:
image_picker: ^0.6.7+14
- 接口请求库:
dio: ^3.0.10
定义用来存储图片的数组和初始变量:
List<File> _viewImages = new List<File>();
final picker = ImagePicker();
调用相机拍摄图片:
Future<void> _getImagebyCamera() async {
final pickedFile = await picker.getImage(source: ImageSource.camera);
setState(() {
if (pickedFile != null) {
_viewImages.add(File(pickedFile.path));
} else {
print('No image selected.');
}
});
}
从相册中选取图片(只能单选):
Future<void> _getImagebyGallery() async {
final pickedFile = await picker.getImage(source: ImageSource.gallery);
setState(() {
if (pickedFile != null) {
_viewImages.add(File(pickedFile.path));
} else {
print('No image selected.');
}
});
}
请求接口:
Response response;
Dio dio = Dio();
// 先存入除文件外的其它参数
FormData formData = FormData.fromMap({
"name": _name, // 图片名字
"id": _num, // 图片编号
});
// 再循环从图片数组中加入图片
for (var img in _viewImages) {
formData.files.add(MapEntry(
// MapEntry(K key, V value)
"images", // 文件对应的字段名
MultipartFile.fromFileSync(img.path),
));
}
response = await dio.post("接口地址url", data: formData)