How do I stretch an image to fit the whole background (100% height x 100% width) in Flutter?

后端 未结 12 1074
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-01 00:10

I have an image that doesn\'t match the aspect ratio of my device\'s screen. I want to stretch the image so that it fully fills the screen, and I don\'t want to crop any par

相关标签:
12条回答
  • 2020-12-01 00:40

    Visit https://youtu.be/TQ32vqvMR80 OR

    For example if parent contrainer has height: 200, then

    Container(
                decoration: BoxDecoration(
                  image: DecorationImage(
                    image: NetworkImage('url'),
                    fit: BoxFit.cover,
                  ),
                ),
              ),
    
    0 讨论(0)
  • 2020-12-01 00:42

    The following will fit the image to 100% of container width while the height is constant. For local assets, use AssetImage

    Container(
      width: MediaQuery.of(context).size.width,
      height: 100,
      decoration: BoxDecoration(
        image: DecorationImage(
          fit: BoxFit.fill,
          image: NetworkImage("https://picsum.photos/250?image=9"),
        ),
      ),
    )
    

    Image fill modes:

    • Fill - Image is stretched

      fit: BoxFit.fill
      


    • Fit Height - image kept proportional while making sure the full height of the image is shown (may overflow)

      fit: BoxFit.fitHeight
      


    • Fit Width - image kept proportional while making sure the full width of the image is shown (may overflow)

      fit: BoxFit.fitWidth
      


    • Cover - image kept proportional, ensures maximum coverage of the container (may overflow)

      fit: BoxFit.cover
      


    • Contain - image kept proportional, minimal as possible, will reduce it's size if needed to display the entire image

      fit: BoxFit.contain
      

    0 讨论(0)
  • 2020-12-01 00:43

    To make an Image fill its parent, simply wrap it into a FittedBox:

    FittedBox(
      child: Image.asset('foo.png'),
      fit: BoxFit.fill,
    )
    

    FittedBox here will stretch the image to fill the space. (Note that this functionality used to be provided by BoxFit.fill, but the API has meanwhile changed such that BoxFit no longer provides this functionality. FittedBox should work as a drop-in replacement, no changes need to be made to the constructor arguments.)


    Alternatively, for complex decorations you can use a Container instead of an Image – and use decoration/foregroundDecoration fields.

    To make the Container will its parent, it should either:

    • have no child
    • have alignment property not null

    Here's an example that combines two images and a Text in a single Container, while taking 100% width/height of its parent:

    Container(
      foregroundDecoration: const BoxDecoration(
        image: DecorationImage(
            image: NetworkImage(
                'https://p6.storage.canalblog.com/69/50/922142/85510911_o.png'),
            fit: BoxFit.fill),
      ),
      decoration: const BoxDecoration(
        image: DecorationImage(
            alignment: Alignment(-.2, 0),
            image: NetworkImage(
                'http://www.naturerights.com/blog/wp-content/uploads/2017/12/Taranaki-NR-post-1170x550.png'),
            fit: BoxFit.cover),
      ),
      alignment: Alignment.bottomCenter,
      padding: EdgeInsets.only(bottom: 20),
      child: Text(
        "Hello World",
        style: Theme.of(context)
            .textTheme
            .display1
            .copyWith(color: Colors.white),
      ),
    ),
    
    0 讨论(0)
  • 2020-12-01 00:43

    I think that for your purpose Flex could work better than Container():

    new Flex(
        direction: Axis.vertical,
        children: <Widget>[
          Image.asset(asset.background)
        ],
       )
    
    0 讨论(0)
  • 2020-12-01 00:43

    For filling, I sometimes use SizedBox.expand

    0 讨论(0)
  • 2020-12-01 00:47

    Might not be exactly what the OP was looking for, but this page is where I found myself after looking for the problem, so sharing this for everyone with similar issue :)

    Stack's fit property did the trick for my needs. Otherwise Image inside (OctoImageIn my case) was padded and providing other Image.fit values did not give any effect.

    Stack(
      fit: StackFit.expand, 
      children: [
        Image(
          image: provider,
          fit: BoxFit.cover,
        ),
        // other irrelevent children here
      ]
    );
    
    0 讨论(0)
提交回复
热议问题