首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用image.file加载图像

如何用image.file加载图像
EN

Stack Overflow用户
提问于 2018-04-14 19:58:53
回答 13查看 116.9K关注 0票数 49

我似乎不能简单地将图像从硬盘加载到屏幕上。Image.network看起来很简单。但我不知道如何使用图像或Image.file。图像似乎需要一个流,所以我不认为这是我正在寻找的。

代码语言:javascript
运行
复制
import 'package:flutter/material.dart';
import 'dart:io';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
    File file = new File("Someimage.jpeg");
    @override
    Widget build(BuildContext context) {
        return new MaterialApp(
            home: new Image.file(file),  //doesn't work, but no errors
        );
    }
}

我将Someimage添加到pubspec.yaml文件中,但这也不起作用:

代码语言:javascript
运行
复制
assets:
    - Someimage.jpeg

有人能给我举个例子来说明这是怎么做到的吗?谢谢。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2018-04-15 17:13:24

下面是另一个使用jpg作为背景图像的示例。它还将不透明度应用于图像。

代码语言:javascript
运行
复制
import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new Scaffold(
        resizeToAvoidBottomPadding: false,
        appBar: new AppBar(
          title: new Text("test"),
        ),
        body: new Container(
          decoration: new BoxDecoration(
            image: new DecorationImage(
              colorFilter: new ColorFilter.mode(Colors.black.withOpacity(0.6), BlendMode.dstATop),
              image: new AssetImage("assets/images/keyboard.jpg"),
              fit: BoxFit.cover,
            ),
          ),
        ),
      ),
    );
  }
}
票数 20
EN

Stack Overflow用户

发布于 2019-06-03 16:57:02

ImageImageProvider的区别与联系

Image

创建一个显示图像的小部件。 要显示来自网络的映像或资产包,请考虑分别使用新的Image.network和新的Image.asset。

所以Image是一个小部件。就像html中的<img>标记。

ImageProvider

标识图像,而不提交到精确的最终资产。这允许识别一组图像,然后根据环境(例如,设备像素比)对精确图像进行解析。

因此,ImageProvider就像Imagesrc属性。

现在,Image采用了一个参数image,这是一个ImageProvider。有四种获取ImageProvider的方法

  • AssetImage: 用于加载与apk一起打包的预定义图像集。 例如,为了显示横幅图像,一些自定义图标。
  • NetworkImage: 用于从互联网上加载动态图像。
  • FileImage: 用于从目标设备中的文件系统加载图像。 显示新下载的图像。
  • MemoryImage: 用于从内存中加载原始图像。 例如,获取用户的壁纸并将其加载到小部件中。

现在他们都是ImageProviders了。它们中的任何一个都可以用作image小部件的Image属性。flutter社区将扩展类添加到Image小部件本身,从而简化了语法。

所以

  • Image.asset(name)本质上是Image(image: AssetImage(name))
  • Image.file(path)本质上是Image(image: FileImage(File(path)))
  • Image.network(url)本质上是Image(image: NetworkImage(url))
  • Image.memory(list)本质上是Image(image: MemoryImage(list))

现在应该清楚的是

  • apk大小随资产映像数的增加而增加。
  • 它们的加载时间(用户所看到的)通常按顺序排列。 NetworkImage > FileImage > AssetImage > MemoryImage
票数 121
EN

Stack Overflow用户

发布于 2018-04-16 18:13:41

下面是使用Image.file的一个示例。这不是推荐的方法,但是如果您通过http下载了应用程序中的映像,然后想要显示映像(例如,在安装过程中图像没有存储在资产中),则用例可能是这样的。

在您的pubspec.yaml中添加:

代码语言:javascript
运行
复制
path_provider: ^0.2.2

代码:

代码语言:javascript
运行
复制
import 'dart:io';
import 'dart:async';
import 'package:path_provider/path_provider.dart';
import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {

  Future<File> _getLocalFile(String filename) async {
    String dir = (await getApplicationDocumentsDirectory()).path;
    File f = new File('$dir/$filename');
    return f;
  }

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        title: 'Flutter Demo',
        home: new FutureBuilder(
            future: _getLocalFile("flutter_assets/image.png"),
            builder: (BuildContext context, AsyncSnapshot<File> snapshot) {
              return snapshot.data != null ? new Image.file(snapshot.data) : new Container();
            })
    );
  }
}

要模拟下载映像,可以使用亚行推送映像:

代码语言:javascript
运行
复制
adb push image.png /data/data/com.example.imagetest/app_flutter/flutter_assets/
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49835623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档