Flutter SDK Установить фоновое изображение

126

Я пытаюсь установить фоновое изображение для домашней страницы. Я получаю изображение с начала экрана и заполняю ширину, но не высоту. Мне что-то не хватает в моем коде? Существуют ли стандарты изображения для флаттера? Масштабируются ли изображения в зависимости от разрешения экрана каждого телефона?

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") 
          ]
        )
      )
    );
  }
}
Арун Кумар
источник
какой должен быть размер изображения? ширина высота?
ArgaPK
Может ли кто-нибудь привести пример с вызовом сетевого изображения
Мертвый парень
1
@TheDeadGuy Image.network (' example.com/path/to/image.jpg' )?
SacWebDeveloper
решение для проверки здесь, по этой ссылке stackoverflow.com/a/62245570/9955978
Шубхам Шарма
Ни один из упомянутых комментариев не помог в моем случае - пожалуйста, не спрашивайте почему. Вот полезная ссылка с пояснениями: education.app/flutter/…
boldnik

Ответы:

334

Я не уверен, что понимаю ваш вопрос, но если вы хотите, чтобы изображение занимало весь экран, вы можете использовать a DecorationImageс подгонкой 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 */,
      ),
    );
  }
}

Что касается вашего второго вопроса, вот ссылка на документацию о том, как встраивать изображения ресурсов в зависимости от разрешения в ваше приложение.

Коллин Джексон
источник
8
Это работает, пока у вас нет ребенка. Если вы добавляете дочерний элемент, размер Контейнера уменьшается до размера его дочернего элемента. Вы знаете, как заставить контейнер заполнять весь экран независимо от размера его дочернего элемента?
HyLian
@ColinJackson какой должен быть размер изображения? ширина высота?
ArgaPK
4
@HyLian устанавливает свойство constraints контейнера,constraints: BoxConstraints.expand()
Рустем Какимов
2
Для сетевого образа можно использоватьDecorationImage(image: Image.network("http://example.com/image.jpg").image, ...)
Eugene Gr. Филиппов
@HyLian добавить width: double.infinityв Контейнер с изображением.
jkoech
47

Если вы используете в Containerкачестве тела Scaffold, его размер будет соответственно размеру его дочернего элемента, и обычно это не то, что вам нужно, когда вы пытаетесь добавить фоновое изображение в свое приложение.

Глядя на этот другой вопрос, @ collin-jackson также предлагал использовать Stackвместо него Containerкак тело, Scaffoldи он определенно делает то, чего вы хотите достичь.

Так выглядит мой код

@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"),
        )
      ],
    )
  );
}
HyLian
источник
какой должен быть размер изображения? ширина высота?
ArgaPK
5
Открытие клавиатуры изменяет размер изображения. Что для этого можно сделать?
Майкл Хати
15

Вы можете использовать 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)),
  );
}

Вывод:

введите описание изображения здесь

CopsOnRoad
источник
12

Вы можете использовать, Stackчтобы растянуть изображение на весь экран.

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

Примечание: при желании, если вы используете Scaffold, вы можете поместить Stackвнутрь Scaffoldс или без в AppBarсоответствии с вашими потребностями.

Shubhamhackz
источник
Именно то, что мне было нужно, в моем случае мое изображение находится внутри ShaderMask, поэтому не получится добавить image:имя.
Скоро Сантос,
5

Я смог применить фон под Scaffold(и даже под ним AppBar), поместив Scaffoldпод a Stackи установив a Containerв первом «слое» с набором фонового изображения и fit: BoxFit.coverсвойством.

Оба элемента Scaffoldand AppBarдолжны иметь значение backgroundColoras, Color.transparentа значение elevationof AppBarдолжно быть равно 0 (нулю).

Вуаля! Теперь у вас есть красивый фон под всей Scaffold и 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: () => {},
                  ),
                ),
              ],
            ),
          ),
        ),
      ],
    );
  }
}
Tuco
источник
3

Мы можем использовать Контейнер и пометить его высоту как бесконечность.

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

Вывод:

введите описание изображения здесь

jitsm555
источник
2
decoration: BoxDecoration(
      image: DecorationImage(
        image: ExactAssetImage("images/background.png"),
        fit: BoxFit.cover
      ),
    ),

это также работает внутри контейнера.

паста винаяк
источник
-1

Чтобы установить фоновое изображение без сжатия после добавления дочернего элемента, используйте этот код.

  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
      )
    ),
);
Балачандран Мутурадж
источник
Предоставленный ответ был отмечен для просмотра как сообщение низкого качества. Вот несколько советов о том, как написать хороший ответ? . Этот предоставленный ответ может выиграть от объяснения. Ответы только на код не считаются "хорошими" ответами.
Трентон МакКинни,