Flutter 颤振-将背景渐变应用于可滚动视图
有没有一种方法可以将完整的背景渐变应用到Flatter中的可滚动视图(如ListView或SingleChildScrollView)?我尝试过各种方法,比如将渐变应用到脚手架或将脚手架包装到容器中,但渐变似乎只是随着内容滚动,而不是应用到可滚动的完整高度 例如:Flutter 颤振-将背景渐变应用于可滚动视图,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,有没有一种方法可以将完整的背景渐变应用到Flatter中的可滚动视图(如ListView或SingleChildScrollView)?我尝试过各种方法,比如将渐变应用到脚手架或将脚手架包装到容器中,但渐变似乎只是随着内容滚动,而不是应用到可滚动的完整高度 例如: 我无法使渐变滚动。但是,如果您不介意将ListView的子级设置为固定高度,那么有一个解决方法 将渐变保存为图像 创建一个有状态的小部件,我们的带有渐变背景的列表视图将放在这里 将刚创建的图像放置在固定高度的容器中,图像作为背景图像;
我无法使渐变滚动。但是,如果您不介意将ListView的子级设置为固定高度,那么有一个解决方法
列表视图将放在这里
容器中
,图像作为背景图像;固定高度是列表视图的总高度
容器
。为此创建一个新的ScrollController
列表视图
和容器
包装在堆栈中
。同时为列表视图创建一个新的控制器
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
backgroundColor: Colors.transparent,
body: MyListView(),
),
);
}
}
class MyListView extends StatefulWidget {
@override
_MyListViewState createState() => _MyListViewState();
}
class _MyListViewState extends State<MyListView> {
final ScrollController listViewController = ScrollController();
final ScrollController backgroundController = ScrollController();
final int itemCount = 500;
final double itemHeight = 20.0;
@override
void initState() {
listViewController.addListener(() {
backgroundController.jumpTo(listViewController.offset);
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
// Our gradient background
SingleChildScrollView(
physics: NeverScrollableScrollPhysics(),
controller: backgroundController,
child: Container(
height: itemCount * itemHeight,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/gradient.png'),
fit: BoxFit.cover,
repeat: ImageRepeat.noRepeat,
),
),
),
),
ListView.builder(
controller: listViewController,
shrinkWrap: true,
itemCount: itemCount,
itemBuilder: (_, index) => SizedBox(
height: itemHeight,
child: Text(index.toString()),
),
),
],
);
}
@override
void dispose() {
listViewController.dispose();
backgroundController.dispose();
super.dispose();
}
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
家:脚手架(
背景颜色:颜色。透明,
正文:MyListView(),
),
);
}
}
类MyListView扩展了StatefulWidget{
@凌驾
_MyListViewState createState()=>\u MyListViewState();
}
类_MyListViewState扩展状态{
最终ScrollController listViewController=ScrollController();
最终ScrollController背景控制器=ScrollController();
最终整数项计数=500;
最终双项目高度=20.0;
@凌驾
void initState(){
listViewController.addListener((){
backgroundController.jumpTo(listViewController.offset);
});
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回堆栈(
儿童:[
//我们的梯度背景
SingleChildScrollView(
物理学:NeverscrollableScroll物理学(),
控制员:背景控制员,
子:容器(
高度:itemCount*itemHeight,
装饰:盒子装饰(
图像:装饰图像(
图像:AssetImage('assets/images/gradient.png'),
适合:BoxFit.cover,
重复:ImageRepeat.noRepeat,
),
),
),
),
ListView.builder(
控制器:listViewController,
收缩膜:对,
itemCount:itemCount,
itemBuilder:(_,索引)=>SizedBox(
高度:项目高度,
子项:文本(index.toString()),
),
),
],
);
}
@凌驾
无效处置(){
dispose();
backgroundController.dispose();
super.dispose();
}
}
工作正常!用dartpad测试
如果答案有效,就接受它
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: SingleChildScrollView(
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: FractionalOffset.bottomCenter,
colors: [Colors.green, Colors.orange],
stops: [0, 1],
),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: List.generate(500, (ind) {
return ListTile(
title: Text('$ind'),
);
}).toList(),
),
),
),
),
);
}
}
您好,斯文,您的解决方案运行良好(+1)。你并不需要背景图像:只要使用@notriousv2提供的原始盒子装饰,一切都很好。
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: SingleChildScrollView(
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: FractionalOffset.bottomCenter,
colors: [Colors.green, Colors.orange],
stops: [0, 1],
),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: List.generate(500, (ind) {
return ListTile(
title: Text('$ind'),
);
}).toList(),
),
),
),
),
);
}
}