J'utilise une simple barre d'application en ruban de widget flottant.
et je souhaite changer la luminosité de l'icône de la barre d'état lorsque la barre d'application en ruban est réduite. ici, j'écoute la barre de défilement et la fonction d'appel lorsque la barre d'application est réduite. et paramétrer l'état avec la luminosité appropriée.
code: -
class MyWidget extends StatefulWidget { @override _MyWidgetState createState() => _MyWidgetState(); } class _MyWidgetState extends State<MyWidget> with RouteAware { ScrollController _scrollController; SystemUiOverlayStyle _brightness = SystemUiOverlayStyle.light; @override void initState() { this._scrollController = ScrollController() ..addListener(() => _isAppBarExpanded ? setState( () { _brightness = SystemUiOverlayStyle.light; print('setState is called 1 '); }, ) : setState(() { print('setState is called 2 '); _brightness = SystemUiOverlayStyle.dark; })); } bool get _isAppBarExpanded { return _scrollController.hasClients && _scrollController.offset > (200 - kToolbarHeight); } @override Widget build(BuildContext context) { return Scaffold( body: AnnotatedRegion<SystemUiOverlayStyle>( value: _brightness, child: Stack( children: <Widget>[ CustomScrollView( controller: this._scrollController, slivers: <Widget>[ SliverAppBar( backgroundColor: Colors.grey[50], expandedHeight: 200, elevation: 0, flexibleSpace: Container() ), ExerciseList( data: widget.data, ), ], ), Container(), ], ), ), ); } }
rien ne fonctionne, quel est le problème ici?
p >
3 Réponses :
Votre SliverAppBar
utilise AppBar
en interne.
Jetez un œil à ce code, qui provient d'AppBar:
final Brightness brightness = widget.brightness ?? appBarTheme.brightness ?? theme.primaryColorBrightness; final SystemUiOverlayStyle overlayStyle = brightness == Brightness.dark ? SystemUiOverlayStyle.light : SystemUiOverlayStyle.dark;
Donc, fondamentalement, votre SliverAppBar remplace SystemUIOverlayStyle, donc je suggère d'ajouter luminosité: _isAppBarExpanded? Brightness.light: Brightness.dark,
à votre SliverAppBar .
Veuillez vérifier mon code et si cela résout votre problème, faites-le moi savoir :)
J'ai corrigé votre code comme ci-dessous:
import 'package:flutter/material.dart'; main() => runApp(MaterialApp( home: MyWidget(), )); class MyWidget extends StatefulWidget { @override _MyWidgetState createState() => _MyWidgetState(); } class _MyWidgetState extends State<MyWidget> with RouteAware { ScrollController _scrollController; bool _isAppBarCollapsed = false; @override void initState() { super.initState(); this._scrollController = ScrollController() ..addListener(() { if (isCollapsed() && !_isAppBarCollapsed) { setState(() { _isAppBarCollapsed = true; }); } else if (!isCollapsed() && _isAppBarCollapsed) { setState(() { _isAppBarCollapsed = false; }); } }); } bool isCollapsed() { return _scrollController.hasClients && _scrollController.offset > (280 - kToolbarHeight); } @override Widget build(BuildContext context) { return SafeArea( top: _isAppBarCollapsed, bottom: false, right: false, left: false, child: Scaffold( body: Stack( children: <Widget>[ CustomScrollView( controller: this._scrollController, slivers: <Widget>[ SliverAppBar( backgroundColor: Colors.green /*Colors.grey[50]*/, expandedHeight: 200, elevation: 0, flexibleSpace: Container()), SliverList( delegate: SliverChildListDelegate([ Container( height: 2000, child: Text('item 9'), color: Colors.blue, ), ])) ], ), Container(), ], ), ), ); } }
Je pense qu'il y a des problèmes avec les propriétés Ce que j'ai réussi dans le passé, c'était d'envelopper mon J'espère que cela résout votre problème. Appbar
et SliverApppbar
luminosité
, en particulier sous iOS. (quelques recherches rapides sur Google ont apporté ce https://github.com/flutter/flutter/issues/41067 ) Scaffold
dans un Thème
et de remplacer le appBarTheme
comme ci-dessous: Theme(
data: Theme.of(context).copyWith(
appBarTheme: AppBarTheme(
brightness: _isAppBarCollapsed ? Brightness.light : Brightness.dark,
),
),
child: Scaffold(...),
);
Vous avez deux points dans
ScrollController () ..addListener (() => _isAppBarExpanded