Flutter SDK Set Background image


122

Estou tentando definir uma imagem de plano de fundo para a página inicial. Estou obtendo o lugar da imagem no início da tela e preenchendo a largura, mas não a altura. Estou faltando alguma coisa no meu código? Existem padrões de imagem para vibração? As imagens são dimensionadas com base na resolução de tela de cada telefone?

class BaseLayout extends StatelessWidget{
  @override
  Widget build(BuildContext context){
    return new Scaffold(
      body: new Container(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            new Image.asset("assets/images/bulb.jpg") 
          ]
        )
      )
    );
  }
}

qual deve ser o tamanho da imagem? largura altura?
ArgaPK

Alguém pode dar um exemplo com chamada de imagem de rede
The Dead Guy

1
@TheDeadGuy Image.network (' example.com/path/to/image.jpg' )?
SacWebDeveloper

solução de verificação aqui neste link stackoverflow.com/a/62245570/9955978
Shubham Sharma

Nenhum dos comentários mencionados ajudou no meu caso - por favor, não pergunte por quê. Aqui está um link útil com explicações: educity.app/flutter/…
boldnik

Respostas:


331

Não tenho certeza se entendi sua pergunta, mas se você quiser que a imagem ocupe a tela inteira, você pode usar um DecorationImagecom um ajuste de BoxFit.cover.

class BaseLayout extends StatelessWidget{
  @override
  Widget build(BuildContext context){
    return Scaffold(
      body: Container(
        decoration: BoxDecoration(
          image: DecorationImage(
            image: AssetImage("assets/images/bulb.jpg"),
            fit: BoxFit.cover,
          ),
        ),
        child: null /* add child content here */,
      ),
    );
  }
}

Para sua segunda pergunta, aqui está um link para a documentação sobre como incorporar imagens de ativos dependentes de resolução em seu aplicativo.


8
Isso funciona desde que você não tenha filhos. Se você adicionar um filho, o tamanho do Container será reduzido ao tamanho de seu filho. Você sabe como fazer o contêiner preencher toda a tela, não importando o tamanho de seu filho?
HyLian,

@ColinJackson qual deve ser o tamanho da imagem? largura altura?
ArgaPK

4
@HyLian definir propriedade de restrições do contêiner,constraints: BoxConstraints.expand()
Rustem Kakimov

2
Para imagem de rede, pode-se usarDecorationImage(image: Image.network("http://example.com/image.jpg").image, ...)
Eugene Gr. Philippov

@HyLian adiciona width: double.infinityao Container com a imagem.
jkoech

45

Se você usar um Containercomo o corpo de Scaffold, seu tamanho será de acordo com o tamanho de seu filho e, geralmente, não é isso que você deseja quando tenta adicionar uma imagem de plano de fundo ao seu aplicativo.

Olhando para esta outra questão, @colin-jackson também sugeriu usar em Stackvez de Containercomo o corpo do Scaffolde definitivamente faz o que você deseja alcançar.

É assim que meu código se parece

@override
Widget build(BuildContext context) {
  return new Scaffold(
    body: new Stack(
      children: <Widget>[
        new Container(
          decoration: new BoxDecoration(
            image: new DecorationImage(image: new AssetImage("images/background.jpg"), fit: BoxFit.cover,),
          ),
        ),
        new Center(
          child: new Text("Hello background"),
        )
      ],
    )
  );
}

qual deve ser o tamanho da imagem? largura altura?
ArgaPK

4
Abrir o teclado redimensiona a imagem. O que pode ser feito para isso?
Michael Hathi

15

Você pode usar DecoratedBox.

@override
Widget build(BuildContext context) {
  return DecoratedBox(
    decoration: BoxDecoration(
      image: DecorationImage(image: AssetImage("your_asset"), fit: BoxFit.cover),
    ),
    child: Center(child: FlutterLogo(size: 300)),
  );
}

Resultado:

insira a descrição da imagem aqui


11

Você pode usar Stackpara esticar a imagem para a tela inteira.

Stack(
        children: <Widget>
        [
          Positioned.fill(  //
            child: Image(
              image: AssetImage('assets/placeholder.png'),
              fit : BoxFit.fill,
           ),
          ), 
          ...... // other children widgets of Stack
          ..........
          .............
         ]
 );

Nota: Opcionalmente se estiver usando um Scaffold, você pode colocar o Stackinterior Scaffoldcom ou sem de AppBaracordo com suas necessidades.


Exatamente o que eu precisava, no meu caso minha imagem está dentro de um ShaderMask, portanto não daria certo colocar um image:nome.
Em breve Santos

5

Consegui aplicar um fundo abaixo do Scaffold(e até mesmo ele AppBar) colocando o Scaffoldsob a Stacke definindo a Containerna primeira "camada" com o conjunto e fit: BoxFit.coverpropriedade da imagem de fundo .

Tanto o Scaffoldquanto AppBardeve ter o backgroundColorconjunto como Color.transparente o elevationde AppBardeve ser 0 (zero).

Voilà! Agora você tem um bom fundo abaixo de todo o Scaffold e AppBar! :)

import 'package:flutter/material.dart';
import 'package:mynamespace/ui/shared/colors.dart';
import 'package:mynamespace/ui/shared/textstyle.dart';
import 'package:mynamespace/ui/shared/ui_helpers.dart';
import 'package:mynamespace/ui/widgets/custom_text_form_field_widget.dart';

class SignUpView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Stack( // <-- STACK AS THE SCAFFOLD PARENT
      children: [
        Container(
          decoration: BoxDecoration(
            image: DecorationImage(
              image: AssetImage("assets/images/bg.png"), // <-- BACKGROUND IMAGE
              fit: BoxFit.cover,
            ),
          ),
        ),
        Scaffold(
          backgroundColor: Colors.transparent, // <-- SCAFFOLD WITH TRANSPARENT BG
          appBar: AppBar(
            title: Text('NEW USER'),
            backgroundColor: Colors.transparent, // <-- APPBAR WITH TRANSPARENT BG
            elevation: 0, // <-- ELEVATION ZEROED
          ),
          body: Padding(
            padding: EdgeInsets.all(spaceXS),
            child: Column(
              children: [
                CustomTextFormFieldWidget(labelText: 'Email', hintText: 'Type your Email'),
                UIHelper.verticalSpaceSM,
                SizedBox(
                  width: double.maxFinite,
                  child: RaisedButton(
                    color: regularCyan,
                    child: Text('Finish Registration', style: TextStyle(color: white)),
                    onPressed: () => {},
                  ),
                ),
              ],
            ),
          ),
        ),
      ],
    );
  }
}

3

Podemos usar Container e marcar sua altura como infinito

body: Container(
      height: double.infinity,
      width: double.infinity,
      child: FittedBox(
        fit: BoxFit.cover,
        child: Image.network(
          'https://cdn.pixabay.com/photo/2016/10/02/22/17/red-t-shirt-1710578_1280.jpg',
        ),
      ),
    ));

Resultado:

insira a descrição da imagem aqui


2
decoration: BoxDecoration(
      image: DecorationImage(
        image: ExactAssetImage("images/background.png"),
        fit: BoxFit.cover
      ),
    ),

isso também funciona dentro de um contêiner.


-1

Para definir uma imagem de plano de fundo sem encolher após adicionar o filho, use este código.

  body: Container(
    constraints: BoxConstraints.expand(),
      decoration: BoxDecoration(
        image: DecorationImage(
            image: AssetImage("assets/aaa.jpg"),
        fit: BoxFit.cover,
        )
      ),

    //You can use any widget
    child: Column(
      children: <Widget>[],
    ),
    ),

-1
body: Container(
    decoration: BoxDecoration(
      image: DecorationImage(
        image: AssetImage('images/background.png'),fit:BoxFit.cover
      )
    ),
);

A resposta fornecida foi marcada para revisão como uma postagem de baixa qualidade. Aqui estão algumas diretrizes para Como escrevo uma boa resposta? . Esta resposta fornecida pode se beneficiar de uma explicação. Respostas apenas em código não são consideradas respostas "boas".
Trenton McKinney
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.