Nie mogę dowiedzieć się, jak zmienić automatyczny przycisk powrotu w AppBar na inny kolor. jest pod rusztowaniem i próbowałem go zbadać, ale nie mogę objąć go głową.
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
title: Image.asset(
'images/.jpg',
fit: BoxFit.fill,
),
centerTitle: true,
),
ParentPage
i tam możesz dodać appBar raz i we wszystkich miejscach, w których możesz go użyć zamiastScaffold
możesz również zastąpić domyślną strzałkę wstecz wybranym przez siebie widżetem, za pomocą „wiodącego”:
leading: new IconButton( icon: new Icon(Icons.arrow_back, color: Colors.orange), onPressed: () => Navigator.of(context).pop(), ),
wszystko, co robi widżet AppBar, to domyślny „wiodący” widżet, jeśli nie jest ustawiony.
źródło
AppBar
naciśnięciu przycisku a także zostanie wyświetlony przycisk WsteczModalRoute
.automaticallyImplyLeading: false
w AppBar.Navigator.of(context).pop();
podziękowaniami, staryWydawało się, że łatwiej jest po prostu utworzyć nowy przycisk i dodać do niego kolor, oto jak zrobiłem to dla każdego, kto się zastanawiał
Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: BackButton( color: Colors.black ),
źródło
Możesz także globalnie ustawić wiodący kolor ikony aplikacji
źródło
AppBar( automaticallyImplyLeading: false, leading: Navigator.canPop(context) ? IconButton( icon: Icon( Icons.arrow_back, color: Colors.black, size: 47, ), onPressed: () => Navigator.of(context).pop(), ) : null, );
źródło
Możesz dostosować AppBarWidget , słowo kluczowe z jest ważne lub możesz przypisać swój niestandardowy AppBarWidget do właściwości appBar Scaffolda :
import 'package:flutter/material.dart'; double _getAppBarTitleWidth( double screenWidth, double leadingWidth, double tailWidth) { return (screenWidth - leadingWidth - tailWidth); } class AppBarWidget extends StatelessWidget with PreferredSizeWidget { AppBarWidget( {Key key, @required this.leadingChildren, @required this.tailChildren, @required this.title, this.leadingWidth: 110, this.tailWidth: 30}) : super(key: key); final List<Widget> leadingChildren; final List<Widget> tailChildren; final String title; final double leadingWidth; final double tailWidth; @override Widget build(BuildContext context) { // Get screen size double _screenWidth = MediaQuery.of(context).size.width; // Get title size double _titleWidth = _getAppBarTitleWidth(_screenWidth, leadingWidth, tailWidth); double _offsetToRight = leadingWidth - tailWidth; return AppBar( title: Row( children: [ Container( width: leadingWidth, child: Row( mainAxisAlignment: MainAxisAlignment.start, children: leadingChildren, ), ), Container( color: Colors.green, width: _titleWidth, padding: const EdgeInsets.only(left: 5.0, right: 5), child: Container( padding: EdgeInsets.only(right: _offsetToRight), color: Colors.deepPurpleAccent, child: Center( child: Text('$title'), ), ), ), Container( color: Colors.amber, width: tailWidth, child: Row( children: tailChildren, ), ) ], ), titleSpacing: 0.0, ); } @override Size get preferredSize => Size.fromHeight(kToolbarHeight); }
Poniżej znajduje się przykład o tym, jak go używać:
import 'package:flutter/material.dart'; import 'package:seal_note/ui/Detail/DetailWidget.dart'; import 'package:seal_note/ui/ItemListWidget.dart'; import 'Common/AppBarWidget.dart'; import 'Detail/DetailPage.dart'; class MasterDetailPage extends StatefulWidget { @override State<StatefulWidget> createState() => _MasterDetailPageState(); } class _MasterDetailPageState extends State<MasterDetailPage> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBarWidget(leadingChildren: [ IconButton( icon: Icon( Icons.arrow_back_ios, color: Colors.white, ), ), Text( '文件夹', style: TextStyle(fontSize: 14.0), ), ], tailChildren: [ Icon(Icons.book), Icon(Icons.hd), ], title: '英语知识',leadingWidth: 140,tailWidth: 50,), body: Text('I am body'), ); } }
źródło
appBar: AppBar( iconTheme: IconThemeData( color: Colors.white, //modify arrow color from here.. ), );
źródło
Aby zmienić kolor wiodący dla CupertinoPageScaffold
Theme( data: Theme.of(context).copyWith( cupertinoOverrideTheme: CupertinoThemeData( scaffoldBackgroundColor: Colors.white70, primaryColor: Styles.green21D877, // HERE COLOR OF LEADING ), ), child: CupertinoPageScaffold( navigationBar: CupertinoNavigationBar( brightness: Brightness.light, backgroundColor: Colors.white, middle: Text('Cupertino App Bar'), ), child: Container( child: Center( child: CupertinoActivityIndicator(), ), ), ), )
źródło
Aby dostosować ikonę wiodącą, możesz naśladować funkcjonalność
AppBar
widżetu, który prawidłowo obsługuje wyświetlanie przycisku Wstecz, ikony szuflady lub ikony zamknięcia, w zależności od bieżącego kontekstu. Oto przykład, który zastępuje domyślne ikony.import 'package:flutter/material.dart'; class TopBar extends StatelessWidget with PreferredSizeWidget { static const double _topBarHeight = 60; @override Widget build(BuildContext context) { return AppBar( toolbarHeight: _topBarHeight, title: Text('Title'), automaticallyImplyLeading: false, leading: _buildLeadingWidget(context), ); } @override Size get preferredSize => Size.fromHeight(_topBarHeight); Widget _buildLeadingWidget(BuildContext context) { final ScaffoldState scaffold = Scaffold.of(context); final ModalRoute<dynamic> parentRoute = ModalRoute.of(context); final bool canPop = ModalRoute.of(context)?.canPop ?? false; final bool hasDrawer = scaffold?.hasDrawer ?? false; final bool useCloseButton = parentRoute is PageRoute<dynamic> && parentRoute.fullscreenDialog; Widget leading; if (hasDrawer) { leading = IconButton( icon: const Icon(Icons.menu_rounded), onPressed: Scaffold.of(context).openDrawer, tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip, ); } else { if (canPop) { if (useCloseButton) { leading = IconButton( color: Theme.of(context).colorScheme.onBackground, icon: Icon(Icons.close_rounded), onPressed: () => Navigator.of(context).maybePop()); } else { leading = IconButton( padding: EdgeInsets.all(0), iconSize: 38, icon: Icon(Icons.chevron_left_rounded), onPressed: Navigator.of(context).pop); } } } return leading; } }
Ta klasa używa klasy
PreferredSizeWidget
jako mieszanki, więc możesz jej używać jako zamiennika istniejącegoAppBar
widżetu w plikuScaffold
. Zwróć uwagę na_buildLeadingWidget
metodę, która pokazuje tylko przycisk Wstecz, jeśli jest to konieczne, i pokazuje przycisk menu, jeśli jest obecna szuflada, lub przycisk zamykania, jeśli wyświetlane jest okno dialogowe na pełnym ekranie.źródło