Как подключить ящик к анимированной иконке в флаттере? - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу иметь анимированный значок кнопки на 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(),
        ),
      ),

    );
  }
}
...