Flutter SDK Установить фоновое изображение
Я пытаюсь установить фоновое изображение для домашней страницы. Я получаю место изображения с начала экрана и заполняю ширину, но не высоту. Я что-то упустил в своем коде? Существуют ли стандарты изображения для флаттера? Масштабируются ли изображения в зависимости от разрешения экрана каждого телефона?
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")
]
)
)
);
}
}
Ответы
Ответ 1
Я не уверен, что понимаю ваш вопрос, но если вы хотите, чтобы изображение занимало весь экран, вы можете использовать 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 */,
),
);
}
}
По вашему второму вопросу приведена ссылка на документацию о том, как встраивать изображения активов, зависящие от разрешения, в ваше приложение.
Ответ 2
Если вы используете 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"),
)
],
)
);
}
Ответ 3
Вы можете использовать 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
соответствии с вашими потребностями.
Ответ 4
Вы можете использовать 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)),
);
}
Выход:
Ответ 5
Я смог применить фон под Scaffold
(и даже AppBar
), поместив Scaffold
в Stack
и установив Container
в первом "слое" с заданным фоновым изображением и fit: BoxFit.cover
свойство.
И Scaffold
и AppBar
должны иметь backgroundColor
установленный как Color.transparent
а elevation
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: () => {},
),
),
],
),
),
),
],
);
}
}
Ответ 6
decoration: BoxDecoration(
image: DecorationImage(
image: ExactAssetImage("images/background.png"),
fit: BoxFit.cover
),
),
это также работает внутри контейнера.