Hình nền bộ Flutter SDK


122

Tôi đang cố gắng đặt hình nền cho trang chủ. Tôi đang lấy vị trí hình ảnh từ đầu màn hình và lấp đầy chiều rộng nhưng không lấp đầy chiều cao. Tôi có thiếu một cái gì đó trong mã của tôi? Có các tiêu chuẩn hình ảnh cho sự rung lắc? Hình ảnh có được chia tỷ lệ dựa trên độ phân giải màn hình của từng điện thoại không?

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

kích thước của hình ảnh nên là bao nhiêu? chiều rộng * chiều cao?
ArgaPK

Ai đó có thể cho một ví dụ với cuộc gọi hình ảnh mạng không
The Dead Guy

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

giải pháp thanh toán tại đây trên liên kết này stackoverflow.com/a/62245570/9955978
Shubham Sharma

Không có nhận xét nào được đề cập giúp ích trong trường hợp của tôi - vui lòng không hỏi tại sao. Đây là liên kết hữu ích kèm theo lời giải thích: educationity.app/flutter/…
boldnik

Câu trả lời:


332

Tôi không chắc mình hiểu câu hỏi của bạn, nhưng nếu bạn muốn hình ảnh lấp đầy toàn bộ màn hình, bạn có thể sử dụng câu hỏi DecorationImagephù hợp 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 */,
      ),
    );
  }
}

Đối với câu hỏi thứ hai của bạn, đây là liên kết đến tài liệu về cách nhúng hình ảnh nội dung phụ thuộc vào độ phân giải vào ứng dụng của bạn.


8
Điều này có hiệu quả miễn là bạn không có con. Nếu bạn thêm một phần tử con thì kích thước của Vùng chứa sẽ bị thu hẹp lại bằng kích thước phần con của nó. Bạn có biết làm thế nào để làm cho hộp chứa lấp đầy tất cả các màn hình bất kể kích thước của nó như thế nào?
HyLian

@ColinJackson kích thước của hình ảnh nên là bao nhiêu? chiều rộng * chiều cao?
ArgaPK

4
@HyLian đặt thuộc tính ràng buộc của vùng chứa,constraints: BoxConstraints.expand()
Rustem Kakimov

2
Đối với hình ảnh mạng, người ta có thể sử dụngDecorationImage(image: Image.network("http://example.com/image.jpg").image, ...)
Eugene Gr. Philippov

@HyLian thêm width: double.infinityhình ảnh vào Vùng chứa.
jkoech

45

Nếu bạn sử dụng một Container làm phần chính của tệp Scaffold, kích thước của nó sẽ tương ứng với kích thước của con của nó và thường đó không phải là những gì bạn muốn khi cố gắng thêm hình nền vào ứng dụng của mình.

Xem xét câu hỏi khác này , @ collin-jackson cũng đề xuất sử dụng Stackthay vìContainer làm phần thân của Scaffoldvà nó chắc chắn làm được những gì bạn muốn đạt được.

Đây là cách mã của tôi trông như thế nào

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

kích thước của hình ảnh nên là bao nhiêu? chiều rộng * chiều cao?
ArgaPK

5
Mở bàn phím sẽ thay đổi kích thước hình ảnh. Những gì có thể được thực hiện cho điều đó?
Michael Hathi

15

Bạn có thể sử dụng 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)),
  );
}

Đầu ra:

nhập mô tả hình ảnh ở đây


11

Bạn có thể sử dụng Stackđể làm cho hình ảnh kéo dài ra toàn màn hình.

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

Lưu ý: Nếu đang sử dụng a Scaffold, bạn có thể đặt Stackbên trong Scaffoldcó hoặc không AppBartùy theo nhu cầu của mình.


Chính xác những gì tôi cần, trong trường hợp của tôi, hình ảnh của tôi nằm trong a ShaderMask, do đó, việc đặt image:tên sẽ không thành công .
Sớm ở Santos

5

Tôi đã có thể áp dụng một nền bên dưới Scaffold(và thậm chí là nó AppBar) bằng cách đặt Scaffolddưới a Stackvà đặt a Containertrong "lớp" đầu tiên với bộ hình ảnh nền và thuộc fit: BoxFit.covertính.

Cả cái ScaffoldAppBarphải có backgroundColortập là Color.transparentelevationcủa AppBarphải bằng 0 (không).

Voilà! Bây giờ bạn có một nền đẹp bên dưới toàn bộ Scaffold và 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

Chúng ta có thể sử dụng Container và đánh dấu chiều cao của nó là vô cực

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

Đầu ra:

nhập mô tả hình ảnh ở đây


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

điều này cũng hoạt động bên trong một thùng chứa.


-1

Để đặt hình nền mà không bị thu nhỏ sau khi thêm con, hãy sử dụng mã này.

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

Câu trả lời được cung cấp đã được gắn cờ để xem xét là Bài đăng có chất lượng thấp. Dưới đây là một số hướng dẫn về Làm cách nào để viết một câu trả lời tốt? . Câu trả lời được cung cấp này có thể được hưởng lợi từ một lời giải thích. Câu trả lời chỉ có mã không được coi là câu trả lời "tốt".
Trenton McKinney
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.