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

какой должен быть размер изображения? ширина высота?
— 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)),
  );
}

Вывод:

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


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соответствии с вашими потребностями.


Именно то, что мне было нужно, в моем случае мое изображение находится внутри 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: () => {},
                  ),
                ),
              ],
            ),
          ),
        ),
      ],
    );
  }
}

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

Вывод:

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


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

Предоставленный ответ был отмечен для просмотра как сообщение низкого качества. Вот несколько советов о том, как написать хороший ответ? . Этот предоставленный ответ может выиграть от объяснения. Ответы только на код не считаются "хорошими" ответами.
— Трентон МакКинни,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.