Flutter SDK设置背景图片


122

我正在尝试为主页设置背景图像。我从屏幕开始获取图像位置,并填充宽度但不填充高度。我在代码中缺少什么吗?有抖动的图像标准吗?图像是否根据每部手机的屏幕分辨率缩放?

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
Shubham Sharma

对于我的情况,提及的评论均无济于事-请不要问为什么。下面是与解释有用的链接:educity.app/flutter/...
boldnik

Answers:


332

我不知道我理解你的问题,但如果你想要的形象充满你可以使用整个屏幕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()
Rustem Kakimov

2
对于网络映像,可以使用DecorationImage(image: Image.network("http://example.com/image.jpg").image, ...)
Eugene Gr。Philippov

@HyLian width: double.infinity与图像一起添加到容器中。
jkoech

45

如果您将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
打开键盘将调整图像大小。为此可以做什么?
Michael Hathi

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

输出:

在此处输入图片说明


11

您可以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

通过将a 放在下方,并在带有背景图像集和属性的第一个“图层”中设置a ,我可以在Scaffold(甚至是AppBar)下方应用背景。ScaffoldStackContainerfit: BoxFit.cover

两者ScaffoldAppBar必须具有backgroundColor集作为Color.transparent与所述elevationAppBar具有为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

我们可以使用Container并将其高度标记为无穷大

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

提供的答案被标记为低质量帖子,以供审核。以下是一些有关如何编写好的答案的指导原则。提供的答案可以从解释中受益。仅代码答案不视为“好”答案。
特伦顿·麦金尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.