Flutter 展开时隐藏 Silver 应用栏的标题

Ush*_*ndo 6 flutter

我在我的 flutter 应用程序上实现了一个带有背景图像的银色应用程序栏。我想让银色应用程序栏的标题在银色应用程序栏处于扩展模式时隐藏。我只想在折叠时显示标题,如何实现此行为?

SliverAppBar(
            expandedHeight: 250.0,
            floating: false,
            pinned: true,
            title: Text("Coporate News"),
            elevation: 8,
            flexibleSpace: FlexibleSpaceBar(
                centerTitle: true,
                title: Text(""),
                background: Stack(
                  children: [
                    Container(
                      height: 400,
                      child: Image.network(
                        news['url'],
                        fit: BoxFit.cover,
                      ),
                    ),        
     .......
Run Code Online (Sandbox Code Playgroud)

我只想在这里显示它 我想把它藏起来

小智 11

import 'package:flutter/material.dart';

class InvisibleExpandedHeader extends StatefulWidget {
  final Widget child;
  const InvisibleExpandedHeader({
    Key? key,
    required this.child,
  }) : super(key: key);
  @override
  _InvisibleExpandedHeaderState createState() {
    return _InvisibleExpandedHeaderState();
  }
}
class _InvisibleExpandedHeaderState extends State<InvisibleExpandedHeader> {

  ScrollPosition? _position;
  bool? _visible;
  
  @override
  void dispose() {
    _removeListener();
    super.dispose();
  }
  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    _removeListener();
    _addListener();
  }
  void _addListener() {
    _position = Scrollable.of(context)?.position;
    _position?.addListener(_positionListener);
    _positionListener();
  }
  void _removeListener() {
    _position?.removeListener(_positionListener);
  }
  void _positionListener() {
    final FlexibleSpaceBarSettings? settings =
      context.dependOnInheritedWidgetOfExactType<FlexibleSpaceBarSettings>();
    bool visible = settings == null || settings.currentExtent <= settings.minExtent;
    if (_visible != visible) {
      setState(() {
        _visible = visible;
      });
    }
  }
  @override
  Widget build(BuildContext context) {
    return Visibility(
      visible: _visible?? false,
      child: widget.child,
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

并在 Sliver AppBar 中使用这个 InvisibleExpanded Widget

return SliverAppBar(
    
      flexibleSpace: FlexibleSpaceBar(
        titlePadding: const EdgeInsets.all(20),
        background: InteractiveViewer(
            child: Image.network(examImagePlaceHolder,
                fit: BoxFit.cover, width: double.infinity)),
        title: InvisibleExpandedHeader(
          child: Text(
            'Global Iq Test for all students in the world',
            style: primaryTitle,
          ),
        ),
      ),
    );
Run Code Online (Sandbox Code Playgroud)