颤振:使用SingleChildScrollView滚动时如何更改状态栏颜色
我是新来的。 我正在使用SingleChildScrollView创建一个新页面 我的问题是,如何仅在滚动活动时更改状态栏的颜色 我已经看到了这种效果,但这个代码为银 每次以某个偏移量滚动激活时,状态栏的颜色都会改变 下面是我想要实现的示例图片: 这是我的基本代码:颤振:使用SingleChildScrollView滚动时如何更改状态栏颜色,scroll,flutter,Scroll,Flutter,我是新来的。 我正在使用SingleChildScrollView创建一个新页面 我的问题是,如何仅在滚动活动时更改状态栏的颜色 我已经看到了这种效果,但这个代码为银 每次以某个偏移量滚动激活时,状态栏的颜色都会改变 下面是我想要实现的示例图片: 这是我的基本代码: import 'package:flutter/material.dart'; class HomeScreen extends StatefulWidget { HomeScreen({Key key}) : super(k
import 'package:flutter/material.dart';
class HomeScreen extends StatefulWidget {
HomeScreen({Key key}) : super(key: key);
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
@override
void initState() {
super.initState();
_scrollController = ScrollController();
_scrollController.addListener(_scrollListener);
}
@override
void dispose() {
_scrollController.removeListener(_scrollListener);
_scrollController.dispose();
super.dispose();
}
void _scrollListener() {
setState(() {
});
}
final image = 'assets/images/bg_header.png';
ScrollController _scrollController;
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
physics: ClampingScrollPhysics(),
child: Stack(
children: <Widget>[
SizedBox(
width: double.infinity,
child: Image.asset(
image,
fit: BoxFit.cover,
),
),
Container(
padding: EdgeInsets.all(40.0),
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height * 0.5,
decoration: BoxDecoration(color: Color.fromRGBO(14, 67, 39, .8)),
),
Padding(
padding: EdgeInsets.only(left: 10.0, right: 10.0, top: 25.0),
child: Column(
children: <Widget>[
some content....
],
),
),
],
),
),
);
}
}
导入“包装:颤振/材料.省道”;
类主屏幕扩展StatefulWidget{
主屏幕({Key}):超级(Key:Key);
_HomeScreenState createState()=>\u HomeScreenState();
}
类_homescrenstate扩展状态{
@凌驾
void initState(){
super.initState();
_scrollController=scrollController();
_scrollController.addListener(\u scrollListener);
}
@凌驾
无效处置(){
_scrollController.RemovelListener(_scrollListener);
_scrollController.dispose();
super.dispose();
}
void_scrollListener(){
设置状态(){
});
}
最终图像='assets/images/bg_header.png';
ScrollController\u ScrollController;
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:SingleChildScrollView(
物理:ClampingScrollPhysics(),
子:堆栈(
儿童:[
大小盒子(
宽度:double.infinity,
子:Image.asset(
形象
适合:BoxFit.cover,
),
),
容器(
填充:所有边缘设置(40.0),
宽度:MediaQuery.of(context).size.width,
高度:MediaQuery.of(上下文).size.height*0.5,
装饰:盒子装饰(颜色:color.fromRGBO(14,67,39,8)),
),
填充物(
填充:仅限边设置(左:10.0,右:10.0,顶部:25.0),
子:列(
儿童:[
一些内容。。。。
],
),
),
],
),
),
);
}
}
在尝试了一些代码之后,我找到了使用Inkino应用程序的解决方案实现
以下是工作代码:
main.dart
import 'package:flutter/material.dart';
import 'package:scroll_effects.dart';
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
ScrollController _scrollController;
ScrollEffects _scrollEffects;
@override
void initState() {
super.initState();
_scrollController = ScrollController();
_scrollController.addListener(_scrollListener);
_scrollEffects = ScrollEffects();
}
@override
void dispose() {
_scrollController.removeListener(_scrollListener);
_scrollController.dispose();
super.dispose();
}
void _scrollListener() {
setState(() {
_scrollEffects.updateScrollOffset(context, _scrollController.offset);
});
}
Widget _buildStatusBarBackground() {
final statusBarColor = Theme.of(context).primaryColor;
return Container(
height: _scrollEffects.statusBarHeight,
color: statusBarColor,
);
}
@override
Widget build(BuildContext context) {
final content = <Widget>[
**list widget.....**
];
content.add(const SizedBox(height: 32.0));
final scrollview = CustomScrollView(
physics: ClampingScrollPhysics(),
controller: _scrollController,
slivers: [
SliverList(delegate: SliverChildListDelegate(content)),
],
);
return Scaffold(
// backgroundColor: const Color(0xFFF0F0F0),
body: Stack(
children: [
scrollview,
_buildStatusBarBackground(),
],
),
);
}
}
import 'dart:math';
import 'package:flutter/material.dart';
class ScrollEffects {
static const double kHeaderHeight = 225.0;
ScrollEffects() {
updateScrollOffset(null, 0.0);
}
double _scrollOffset;
double statusBarHeight;
void updateScrollOffset(BuildContext context, double offset) {
_scrollOffset = offset;
_recalculateValues(context);
}
void _recalculateValues(BuildContext context) {
statusBarHeight = _calculateStatusBarHeight(context);
}
double _calculateStatusBarHeight(BuildContext context) {
double statusBarMaxHeight = 0.0;
if (context != null) {
statusBarMaxHeight = MediaQuery.of(context).padding.top;
}
return max(
0.0,
min(
statusBarMaxHeight,
_scrollOffset - kHeaderHeight + (statusBarMaxHeight * 4),
),
);
}
}