【问题标题】:error when using File with ImagePicker Flutter将 File 与 ImagePicker Flutter 一起使用时出错
【发布时间】:2021-06-19 06:44:12
【问题描述】:

错误在于这一行:File selectedImage

我只导入了 dart.io,甚至没有 dart.html,所以我不确定为什么会出现这个错误。

这是一段较长的代码

import 'dart:io';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:random_string/random_string.dart';
import 'package:tennis_event_app/services/crud.dart';

class CreateBlog extends StatefulWidget {
  @override
  _CreateBlogState createState() => _CreateBlogState();
}

class _CreateBlogState extends State<CreateBlog> {
  late String pass, authorName, title, desc;

  File selectedImage;
  final picker = ImagePicker();

  bool _isLoading = false;

  CrudMethods crudMethods = new CrudMethods();

  Future getImage() async {
    final pickedFile = await picker.getImage(source: ImageSource.gallery);

    setState(() {
      if (pickedFile != null) {
        selectedImage = File(pickedFile.path);
      } else {
        print('No image selected.');
      }
    });
  }

(这不是完整的代码,只是一个更大的部分)

【问题讨论】:

    标签: flutter dart visual-studio-code


    【解决方案1】:

    你得到了什么确切的错误?

    建议 请务必将setState((){...}); 放入 if 语句中,如下所示:

    if(pickedFile != null){
       setState((){
          selectedImage = File(pickedFile.path);
       });
    }else{
       print('No image selected');
    }
    

    热重载。

    查看适合我的完整解决方案

    class _ImageSelectorState extends State<ImageSelector> {
      var imageFile;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(),
          body: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Container(
                width: 200.0,
                height: 200.0,
                color: Colors.grey.shade300,
                child: imageFile != null
                    ? Image.file(imageFile)
                    : Icon(
                        Icons.image,
                      ),
              ),
              SizedBox(height: 20.0),
              //Button
              Center(
                child: ElevatedButton(
                  onPressed: _pickImage,
                  child: Text('Upload Image'),
                ),
              ),
            ],
          ),
        );
      }
    
      _pickImage() async {
        try {
          final picker = await ImagePicker().getImage(
            source: ImageSource.gallery,
          );
    
          if (picker != null) {
            setState(() {
              imageFile = File(picker.path);
            });
          }
        } catch (e) {
          print(e);
        }
      }
    }
    
    

    结果

    【讨论】:

    • 错误信息是“不可为空的实例字段'selectedImage'必须被初始化。
    • 我也收到两个警告。他们都说“操作数不能为空,所以条件必须为真”,这和问题有关系吗?
    • 为什么不将selectedImage文件变量设为var?我将使用我编写的代码来更新我的答案以测试它并且它有效。
    • 这可行,但我似乎无法实际将 selectedImage 文件上传到 Firebase 存储,这可能与变量是 var 而不是文件有关,或者这只是一个不相关的问题?
    • 我认为这是一个不相关的问题。你有任何错误吗?拜托,让我们看看日志
    【解决方案2】:

    我使用的解决方案:

    我最终将File selectedImage; 更改为File ? selectedImage;

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 2020-12-18
      • 1970-01-01
      • 2016-11-05
      • 2021-12-06
      • 2015-07-15
      • 2016-05-04
      • 2014-02-10
      • 2016-04-03
      相关资源
      最近更新 更多