我正在Flutter中使用带有背景小部件的SliverAppBar。
问题是,展开后,标题和图标(引导和动作)应为白色,以便正确看到;折叠时,应将其更改为黑色。
我如何能得到任何想法布尔出来的吗?或其他解决此问题的方法。
谢谢。
class SliverExample extends StatefulWidget { final Widget backgroundWidget; final Widget bodyWidgets; SliverExample({ this.backgroundWidget, this.body, }); @override _SliverExampleState createState() => _SliverExampleState(); } class _SliverExampleState extends State<SliverExample> { // I need something like this // To determine if SliverAppBar is expanded or not. bool isAppBarExpanded = false; @override Widget build(BuildContext context) { // To change the item's color accordingly // To be used in multiple places in code Color itemColor = isAppBarExpanded ? Colors.white : Colors.black; // In my case PrimaryColor is white, // and the background widget is dark return Scaffold( body: CustomScrollView( slivers: <Widget>[ SliverAppBar( pinned: true, leading: BackButton( color: itemColor, // Here ), actions: <Widget>[ IconButton( icon: Icon( Icons.shopping_cart, color: itemColor, // Here ), onPressed: () {}, ), ], expandedHeight: 200.0, flexibleSpace: FlexibleSpaceBar( centerTitle: true, title: Text( 'title', style: TextStyle( fontSize: 18.0, color: itemColor, // Here ), ), // Not affecting the question. background: widget.backgroundWidget, ), ), // Not affecting the question. SliverToBoxAdapter(child: widget.body), ], ), ); } }
您可以使用LayoutBuilder获得Sliver AppBar的最大高度。当maximum.height = 80.0时,实际上意味着条子appbar被折叠。
这是一个完整的示例:
import 'package:flutter/material.dart'; void main() => runApp(MaterialApp( home: MyApp(), )); class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { var top = 0.0; @override Widget build(BuildContext context) { return Scaffold( body: NestedScrollView( headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { return <Widget>[ SliverAppBar( expandedHeight: 200.0, floating: false, pinned: true, flexibleSpace: LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { // print('constraints=' + constraints.toString()); top = constraints.biggest.height; return FlexibleSpaceBar( centerTitle: true, title: AnimatedOpacity( duration: Duration(milliseconds: 300), //opacity: top == 80.0 ? 1.0 : 0.0, opacity: 1.0, child: Text( top.toString(), style: TextStyle(fontSize: 12.0), )), background: Image.network( "https://images.unsplash.com/photo-1542601098-3adb3baeb1ec?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=5bb9a9747954cdd6eabe54e3688a407e&auto=format&fit=crop&w=500&q=60", fit: BoxFit.cover, )); })), ]; },body: ListView.builder( itemCount: 100, itemBuilder: (context,index){ return Text("List Item: " + index.toString()); }, ), )); } }