Я хочу иметь анимированный значок кнопки на AppBar
(он всегда виден), чтобы вызывать Drawer в моем приложении. Чтобы AppBar всегда был виден, даже когда Drawer открыт, я использовал этот метод: мне пришлось поместить AppBar на основной Scaffold, затем передать дочерний элемент: Scaffold и поместить Drawer внутрь.
Мне удалось заставить работать кнопку через оператор IF и _scaffoldKey.currentState
. Таким образом, кнопка работает и анимирует от гамбургера до стрелки при открытии и закрытии ящика, но я также хочу реализовать анимацию кнопки при открытии / закрытии ящика с проведением или, когда ящик открыт, нажав на внешний ящик. Есть ли способ сделать это?
Я новичок во Флаттере, вот часть моего кода:
class HomePage extends StatefulWidget {
@override _HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage>
with SingleTickerProviderStateMixin {
AnimationController _animationController;
bool isPlaying = false;
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
bool _isDrawerOpen = false;
@override
void initState() {
super.initState();
_animationController =
AnimationController(vsync: this, duration: Duration(milliseconds: 300));
}
@override
void dispose() {
super.dispose();
_animationController.dispose();
}
void _handleOnPressed() {
setState(() {
isPlaying = !isPlaying;
isPlaying
? _animationController.forward()
: _animationController.reverse();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
primary: true,
appBar: AppBar(
automaticallyImplyLeading: false,
title: Text(
"Drawer animation",
style: TextStyle(
fontSize: 40,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.w600,
color: Colors.black45),
),
centerTitle: true,
backgroundColor: Colors.amber,
leading: IconButton(
icon: AnimatedIcon(
icon: AnimatedIcons.menu_arrow, progress: _animationController),
onPressed: () {
if (!_isDrawerOpen) {
_scaffoldKey.currentState.openDrawer();
} else {
Navigator.pop(context);
}
setState(() {
_isDrawerOpen = !_isDrawerOpen;
});
_handleOnPressed();
},
),
),
body: Scaffold(
key: _scaffoldKey,
drawer: Drawer(
child: ListView(
children: <Widget>[
ListTile(
title: Text("prve"),
),
],
),
),
body: Container(
child: CustomButton(),
),
),
);
}
}