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.