颤振:使用SingleChildScrollView滚动时如何更改状态栏颜色

颤振:使用SingleChildScrollView滚动时如何更改状态栏颜色,scroll,flutter,Scroll,Flutter,我是新来的。 我正在使用SingleChildScrollView创建一个新页面 我的问题是,如何仅在滚动活动时更改状态栏的颜色 我已经看到了这种效果,但这个代码为银 每次以某个偏移量滚动激活时,状态栏的颜色都会改变 下面是我想要实现的示例图片: 这是我的基本代码: import 'package:flutter/material.dart'; class HomeScreen extends StatefulWidget { HomeScreen({Key key}) : super(k

我是新来的。 我正在使用SingleChildScrollView创建一个新页面

我的问题是,如何仅在滚动活动时更改状态栏的颜色

我已经看到了这种效果,但这个代码为银

每次以某个偏移量滚动激活时,状态栏的颜色都会改变

下面是我想要实现的示例图片:

这是我的基本代码:

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