flutter) 使用imagePicker有问题

flutter) There's a problem with using imagePicker

我使用的是 sdk 2.12.0 和 image_picker 0.8.4 版本。

我要去 link 我的画廊获取图像。 但是,当我在我的应用程序上按下“添加图像”按钮时,该应用程序立即关闭。

这是我使用的 image_picker 的代码。

class CreatePage extends StatefulWidget {
  const CreatePage({Key? key, required this.user}) : super(key: key);
  final User user;

  @override
  _CreatePageState createState() => _CreatePageState();
}

class _CreatePageState extends State<CreatePage> {

  //ImagePicker
  final ImagePicker _picker = ImagePicker();
  File? _imageFile; 

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: _buildAppbar(),

      body: _buildBody(), 
      floatingActionButton: FloatingActionButton(
        onPressed: _getImage,
        backgroundColor: Colors.blue,
        child: Icon(Icons.add_a_photo),
      ),
    );
  }

  Future<void> _getImage() async {
    //ImagePiker
    var image = await _picker.pickImage(source: ImageSource.gallery);

    setState(() {
      _imageFile = File(image!.path);
    });
  }

这是我关于此页面的完整代码。 (包括 Firebase 代码)

import 'dart:io';
import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart'; 
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_storage/firebase_storage.dart'; 
import 'package:cloud_firestore/cloud_firestore.dart'; 

class CreatePage extends StatefulWidget {
  //user info
  const CreatePage({Key? key, required this.user}) : super(key: key);
  final User user;

  @override
  _CreatePageState createState() => _CreatePageState();
}

class _CreatePageState extends State<CreatePage> {
  //input text
  final TextEditingController createText = TextEditingController();

  //ImagePicker
  final ImagePicker _picker = ImagePicker();
  File? _imageFile; 


  //_createPageState가 제거될 때 호출됨
  @override
  void dispose() {
    // TODO: implement dispose
    createText.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: _buildAppbar(),

      body: _buildBody(), 
      floatingActionButton: FloatingActionButton(
        onPressed: _getImage,
        backgroundColor: Colors.blue,
        child: Icon(Icons.add_a_photo),
      ),
    );
  }

  _buildAppbar() {
    return AppBar(
      actions: [
        IconButton(
          icon: Icon(Icons.send),
          onPressed: () {
            _uploadPost(context);
          },
        ),
      ],
    );
  }

  _buildBody() {
    return SingleChildScrollView( 
      child: Column(
        children: [
          _imageFile == null ? Text("No Image") : Image.file(_imageFile!),

          TextField(
            controller: createText,
            decoration: InputDecoration(
              hintText: "내용을 입력하세요", 
            ),
          )
        ],
      ),
    );
  }

  //gallery image
  Future<void> _getImage() async {
    var image = await _picker.pickImage(source: ImageSource.gallery);

    setState(() {
      _imageFile = File(image!.path);
    });
  }

  Future _uploadPost(BuildContext context) async {
    final firebaseStorageRef = FirebaseStorage.instance
    .ref() 
    .child('post') 
    .child('${DateTime.now().microsecondsSinceEpoch}.png');

    final task = await firebaseStorageRef.putFile(
        _imageFile!, SettableMetadata(contentType: "image/png")
    );

    final uri = await task.ref.getDownloadURL();

    //database document
    final doc = FirebaseFirestore.instance.collection('post').doc();
    //json type
    await doc.set({
      'id': doc.id,
      'photoUrl': uri.toString(), //storage file url
      'contents': createText, //user input text
      'email': widget.user.email, //user email
      'displayName': widget.user.displayName, //user name
      'userPhotoUrl': widget.user.photoURL, //user profile image
    });

    //return page
    Navigator.pop(context);
  }
}

按下 floatingActionButton 关闭应用程序并输出以下错误。

 Lost connection to device.

请问这是什么原因?

提前致谢。

我的猜测是您无权访问设备上的媒体,因此在您尝试这样做时中止了该应用程序。查看 permission handler package.

尝试添加依赖 image_picker: ^0.8.3+2

import 'package:image_picker/image_picker.dart';

然后添加此代码

String url = "";
ImagePicker image = ImagePicker();
File ? file;

getImage() async {

    var img = await image.pickImage(source: ImageSource.gallery);
    setState(() {
        file = File(img!.path);
    });

}

并添加:

onTap: () {
    getImage();
},

添加代码:

child: file != null ?
    Column(
        children: [
            Padding(
                padding: const EdgeInsets.all(20.0),
                    child: Container(
                        color: Colors.black,
                        margin: EdgeInsets.only(top: 80),
                        width: double.infinity,
                        height: 250,
                        child: Image.file(
                            file!,
                            fit: BoxFit.contain,
                        ),
                    ),
            ),