Flutter踩坑日记

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接口上传图片

  1. 选取图片组件:image_picker: ^0.6.7+14
  2. 接口请求库: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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值