如何在 flutter 中使用选取的图像作为背景图像?

how to use a picked image as background image in flutter?

我使用了 file_picker 库,因此用户可以 select 他最喜欢的图像,然后将其用作我的应用程序中的背景图像。问题是,我无法正确投射。这是一些代码:

 floatingActionButton: FloatingActionButton(
            onPressed: () async {
              final result = await FilePicker.platform.pickFiles(type: FileType.any, allowMultiple: false);
              if (result != null) {
                var fileBytes = result.files.first.bytes;
                if (fileBytes != null) {
                  blogimage = Image.memory(fileBytes);
                  setState(() {});
                }
              }
            },
            tooltip: 'Select Image',
            child: Icon(Icons.select_all),
          ),

在上面的代码中,我正在获取图像。 我正在尝试使用 blogimage 作为我的背景图片。 我已经尝试过使用容器但失败了。这是我使用的代码:

Widget build(BuildContext context) {
    return Container(
        decoration: (blogimage != null)? BoxDecoration(image: DecorationImage(image: blogimage)): null,
        child: Scaffold(
          backgroundColor: Colors.transparent,
          appBar: AppBar(
            title: Text(widget.title),
          ),
.....

收到错误:应为 'ImageProvider' 类型的值,但得到 'Image' 类型的值。

有什么想法吗? 感谢阅读。

问题在于您正在提供图像小部件,而代码需要能够提供图像的东西。像你用图片的时候,你可以这样实现

Image(
  image:AssetImage("")//This is the image provider
)

所以我们不传递小部件,而是传递提供者,在本例中是 MemoryImage

                  blogimage = MemoryImage(fileBytes);

希望对您有所帮助。另外,在这个图像的装饰中,您可能需要使用 properties

Container(
        decoration: (blogimage != null)? BoxDecoration(image: DecorationImage(image: blogimage,fit:BoxFit.cover)): null,
   constraints:BoxConstraints.expand()

)

首先,如果您想从所选图像中获取字节,则缺少一个参数

final result = await FilePicker.platform.pickFiles(type: FileType.any, allowMultiple: false, withData: true);

withData: true 将为您提供所选图像的字节数。

如果不设置为真result.files.first.bytes将为空

其次,为什么要将 blogImage 声明为 Image 类型?

改用 Uint8List 类型并在 DecorationImage 中使用 MemoryImage(blogImage)

class FilePickerTest extends StatefulWidget {
  @override
  _FilePickerTestState createState() => _FilePickerTestState();
}

class _FilePickerTestState extends State<FilePickerTest> {
  Uint8List? blogImage;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          final result = await FilePicker.platform.pickFiles(type: FileType.any, allowMultiple: false, withData: true);
          if (result != null) {
            blogImage = result.files.first.bytes;
            if (blogImage != null) {
              setState(() {});
            }
          }
        },
        tooltip: 'Select Image',
        child: Icon(Icons.select_all),
      ),
      body: Container(
        decoration: (blogImage != null) ? BoxDecoration(image: DecorationImage(image: MemoryImage(blogImage!))) : null,
        child: Scaffold(
          backgroundColor: Colors.transparent,
          appBar: AppBar(
            title: Text(widget.title),
          ),
        ),
      ),
    );
  }
}

withData: 如果你想提前将文件载入内存则为true 如果未设置,则始终 return FilePickerResult.files.bytes 空值

FilePickerResult? result = await FilePicker.platform.pickFiles(type: FileType.any, allowMultiple: false,withData: true);
      if (result != null) {
        var fileBytes = result.files.first.bytes;
        if (fileBytes != null) {
          blogimage = fileBytes;
          setState(() {});
        }
      }

使用给定 Uint8list 的 ImageProvider MemoryImage 显示图像

Container(
    decoration: (blogimage != null)? BoxDecoration(image: DecorationImage(image: MemoryImage(blogimage))): null,
    child: Scaffold(
      backgroundColor: Colors.transparent,
      appBar: AppBar(
        title: Text(widget.title),
      ),