Flutter SDK Imposta immagine di sfondo


122

Sto cercando di impostare un'immagine di sfondo per la home page. Ottengo la posizione dell'immagine dall'inizio dello schermo e riempio la larghezza ma non l'altezza. Mi manca qualcosa nel mio codice? Esistono standard di immagine per il flutter? Le immagini vengono ridimensionate in base alla risoluzione dello schermo di ogni telefono?

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") 
          ]
        )
      )
    );
  }
}

quale dovrebbe essere la dimensione dell'immagine? larghezza altezza?
ArgaPK

Qualcuno può fare un esempio con la chiamata dell'immagine di rete
The Dead Guy

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

soluzione checkout qui su questo link stackoverflow.com/a/62245570/9955978
Shubham Sharma

Nessuno dei commenti menzionati ha aiutato nel mio caso - per favore non chiedere perché. Ecco un link utile con spiegazioni: educity.app/flutter/…
boldnik

Risposte:


332

Non sono sicuro di aver capito la tua domanda, ma se vuoi che l'immagine riempia l'intero schermo puoi usare un DecorationImagecon un fit di 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 */,
      ),
    );
  }
}

Per la tua seconda domanda, ecco un collegamento alla documentazione su come incorporare immagini di risorse dipendenti dalla risoluzione nella tua app.


8
Funziona finché non hai figli. Se aggiungi un figlio, la dimensione del contenitore viene ridotta alla dimensione del suo figlio. Sai come fare in modo che il contenitore riempia tutto lo schermo indipendentemente dalle dimensioni del suo bambino?
HyLian

@ColinJackson quale dovrebbe essere la dimensione dell'immagine? larghezza altezza?
ArgaPK

4
@HyLian ha impostato la proprietà dei vincoli del contenitore,constraints: BoxConstraints.expand()
Rustem Kakimov

2
Per l'immagine di rete, si può usareDecorationImage(image: Image.network("http://example.com/image.jpg").image, ...)
Eugene Gr. Philippov

@HyLian aggiunge width: double.infinityal contenitore con l'immagine.
jkoech

45

Se usi a Containercome corpo di Scaffold, la sua dimensione sarà di conseguenza la dimensione del suo figlio e di solito non è quello che vuoi quando provi ad aggiungere un'immagine di sfondo alla tua app.

Guardando quest'altra domanda, @ collin-jackson ha anche suggerito di usare al Stackposto di Containercome corpo di Scaffolde fa sicuramente quello che vuoi ottenere.

Ecco come appare il mio codice

@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"),
        )
      ],
    )
  );
}

quale dovrebbe essere la dimensione dell'immagine? larghezza altezza?
ArgaPK

5
L'apertura della tastiera ridimensiona l'immagine. Cosa si può fare per questo?
Michael Hathi

15

Puoi usare 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)),
  );
}

Produzione:

inserisci qui la descrizione dell'immagine


11

È possibile utilizzare Stackper allungare l'immagine a schermo intero.

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

Nota: Facoltativamente, se si utilizza a Scaffold, è possibile inserire l' Stackinterno Scaffoldcon o senza in AppBarbase alle proprie esigenze.


Esattamente quello di cui avevo bisogno, nel mio caso la mia immagine è all'interno di una ShaderMask, quindi non funzionerebbe inserendo un image:nome.
Presto Santos

5

Sono stato in grado di applicare uno sfondo sotto Scaffold(e anche lo è AppBar) mettendo Scaffoldsotto a Stacke impostando a Containernel primo "livello" con l'immagine di sfondo impostata e la fit: BoxFit.coverproprietà.

Sia il Scaffoldche AppBardeve avere il backgroundColorset as Color.transparente il elevationof AppBardeve essere 0 (zero).

Ecco! Ora hai un bel sfondo sotto l'intero 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

Possiamo usare Container e contrassegnare la sua altezza come 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',
        ),
      ),
    ));

Produzione:

inserisci qui la descrizione dell'immagine


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

funziona anche all'interno di un contenitore.


-1

Per impostare un'immagine di sfondo senza ridursi dopo aver aggiunto il bambino, usa questo codice.

  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
      )
    ),
);

La risposta fornita è stata contrassegnata per la revisione come Post di bassa qualità. Ecco alcune linee guida per Come scrivere una buona risposta? . Questa risposta fornita potrebbe beneficiare di una spiegazione. Le risposte solo codice non sono considerate risposte "buone".
Trenton McKinney
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.