首页 文章

如何确定Flutter中图像的宽度和高度?

提问于
浏览
4

假设我在pubspec.yaml中声明了我的图像,如下所示:

assets:
    - assets/kitten.jpg

我的Flutter代码是这样的:

void main() {
  runApp(
    new Center(
      child: new Image.asset('assets/kitten.jpg'),
    ),
  );
}

现在我有一个 new Image.asset() ,如何确定该图像的宽度和高度?例如,我只想打印出图像的宽度和高度 .

(看起来dart:ui's Image class有宽度和高度,但不知道如何从小部件's Image to dart:ui' s图像 . )

谢谢!

2 回答

  • 9

    如果您已经拥有 Image 小部件,则可以通过在 ImageProvider 上调用 resolve 来读取 ImageStream .

    screenshot

    import 'dart:ui' as ui;
    import 'dart:async';
    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    
    void main() {
      runApp(new MaterialApp(
        home: new MyHomePage(),
      ));
    }
    
    class MyHomePage extends StatelessWidget {
    
      Widget build(BuildContext context) {
        Image image = new Image.network('https://i.stack.imgur.com/lkd0a.png');
        Completer<ui.Image> completer = new Completer<ui.Image>();
        image.image
          .resolve(new ImageConfiguration())
          .addListener((ImageInfo info, bool _) => completer.complete(info.image));
        return new Scaffold(
          appBar: new AppBar(
            title: new Text("Image Dimensions Example"),
          ),
          body: new ListView(
            children: [
              new FutureBuilder<ui.Image>(
                future: completer.future,
                builder: (BuildContext context, AsyncSnapshot<ui.Image> snapshot) {
                  if (snapshot.hasData) {
                    return new Text(
                      '${snapshot.data.width}x${snapshot.data.height}',
                      style: Theme.of(context).textTheme.display3,
                    );
                  } else {
                    return new Text('Loading...');
                  }
                },
              ),
              image,
            ],
          ),
        );
      }
    }
    
  • 10

    您可以ImageProvider ImageProvider获取ImageStream,然后使用addListener在图像准备就绪时收到通知 .

    screenshot

    import 'dart:ui' as ui;
    import 'dart:async';
    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    
    void main() {
      runApp(new MaterialApp(
        home: new MyHomePage(),
      ));
    }
    
    class MyHomePage extends StatelessWidget {
    
      Future<ui.Image> _getImage() {
        Completer<ui.Image> completer = new Completer<ui.Image>();
        new NetworkImage('https://i.stack.imgur.com/lkd0a.png')
          .resolve(new ImageConfiguration())
          .addListener((ImageInfo info, bool _) => completer.complete(info.image));
        return completer.future;
      }
    
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            title: new Text("Image Dimensions Example"),
          ),
          body: new Center(
            child: new FutureBuilder<ui.Image>(
              future: _getImage(),
              builder: (BuildContext context, AsyncSnapshot<ui.Image> snapshot) {
                if (snapshot.hasData) {
                  ui.Image image = snapshot.data;
                  return new Text(
                    '${image.width}x${image.height}',
                    style: Theme.of(context).textTheme.display4);
                } else {
                  return new Text('Loading...');
                }
              },
            ),
          ),
        );
      }
    }
    

相关问题