Flutter Вызов функции

Страница с Appbar

Widget build(BuildContext context) {
return Scaffold(
    appBar: AppBar(
      elevation: 0.0,
      title: Text('Admin panel'),
      leading: IconButton(
        icon: Icon(Icons.menu),
        onPressed: menuButtonPressed, <<<<<<?
      ),
    ),
    body: BlocProvider<NavigationBloc>(
      create: (context) => NavigationBloc(),
      child: Stack(
        children: <Widget>[
          BlocBuilder<NavigationBloc, NavigationStates>(
            builder: (context, navigationState) {
              return navigationState as Widget;
            },
          ),
          TestMenu(),

страница Testmenu

 class _TestMenu extends State<TestMenu> with SingleTickerProviderStateMixin {
  AnimationController _animation;

  @override
  void initState() {
    _animation = AnimationController(
      value: 1,
      vsync: this,
      duration: drawerAnimationDuration,
    );

    super.initState();
  }

  @override
  void dispose() {
    _animation.dispose();
    super.dispose();
  }

  void menuButtonPressed() {
    if (_animation.isAnimating) return;
    _animation.isCompleted ? _animation.reverse() : _animation.forward();
  }

  @override
  Widget build(BuildContext context) {
    return SlideTransition(
      position: Tween<Offset>(
        begin: Offset(-1, 0),
        end: Offset.zero,
      ).animate(_animation),
      child: Row(
        children: <Widget>[
          Container(
            width: drawerWidth,
            decoration: BoxDecoration(
              border: Border(right: BorderSide(color: Colors.grey[300])),
            ),

menuButtonPressed скрывает и показывает боковое меню. Можно ли сделать так, чтоб эта функция вызывалась со страницы c AppBar.


Ответы (1 шт):

Автор решения: MiT

Это костыль, но работает:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          elevation: 0.0,
          title: Text('Admin panel'),
          leading: IconButton(
            icon: Icon(Icons.menu),
            onPressed: () => _MyWidgetState.menuButtonPressed(),
          ),
        ),
        body: MyWidget(),
      ),
    );
  }
}

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget>
    with SingleTickerProviderStateMixin {
  static AnimationController _animation;

  @override
  void initState() {
    _animation = AnimationController(
      value: 1,
      vsync: this,
      duration: Duration(seconds: 0),
    );

    super.initState();
  }

  @override
  void dispose() {
    _animation.dispose();
    super.dispose();
  }

  static void menuButtonPressed() {
    if (_animation.isAnimating) return;
    _animation.isCompleted ? _animation.reverse() : _animation.forward();
  }

  @override
  Widget build(BuildContext context) {
    return SlideTransition(
      position: Tween<Offset>(
        begin: Offset(-1, 0),
        end: Offset.zero,
      ).animate(_animation),
      child: Row(
        children: <Widget>[
          Container(
            width: 100,
            decoration: BoxDecoration(
              color: Colors.green,
              border: Border(right: BorderSide(color: Colors.grey[300])),
            ),
          ),
        ],
      ),
    );
  }
}

BlocProvider не дает переключать страницы в классе с AppBar.

У вас с проектированием приложения все плохо, раз приходиться делать такие вещи...

→ Ссылка