title: How to call a method from one statefulWidget in another Widget (Flutter)
body: <p>I am trying to run method <code>doAnimation</code> from another widget by clicking on a <code>FloatingActionButton</code>.
  Please tell me how to do this with this simple example. I know how to do this using the Provider package, but the code is cumbersome. How can I do this using Flutter's native methods?
  Or, most likely, it can be done nicely with the Provider, but I don't know how.
  A similar question has already been asked, but the second version of flutter and dart has already been released.
  State management difficulties are probably the biggest newbies problem.</p>
  <pre class="lang-dart prettyprint-override"><code>import 'package:flutter/material.dart';
  
  void main() {
    runApp(MyApp());
  }
  
  class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
      return MaterialApp(
        home: MyHomePage(),
      );
    }
  }
  
  class MyHomePage extends StatefulWidget {
    MyHomePage({Key? key}) : super(key: key);
    @override
    _MyHomePageState createState() =&gt; _MyHomePageState();
  }
  
  class _MyHomePageState extends State&lt;MyHomePage&gt; {
    @override
    Widget build(BuildContext context) {
      return Scaffold(
        body: MyAnimation(),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            //TODO! error is here
            _MyAnimationState().doAnimation();
            //MyAnimation().createState().doAnimation(); // ?
          },
          child: Icon(Icons.play_arrow),
        ),
      );
    }
  }
  
  class MyAnimation extends StatefulWidget {
    const MyAnimation({Key? key}) : super(key: key);
  
    @override
    _MyAnimationState createState() =&gt; _MyAnimationState();
  }
  
  class _MyAnimationState extends State&lt;MyAnimation&gt; {
    double _height = 250;
    bool _isOpen = true;
  
    void doAnimation() {
      _isOpen = !_isOpen;
      setState(() {
        if (_isOpen) {
          _height = 250;
        } else {
          _height = 0;
        }
      });
    }
  
    @override
    Widget build(BuildContext context) {
      return Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Center(
            child: AnimatedContainer(
              padding: EdgeInsets.all(20),
              duration: Duration(milliseconds: 250),
              width: 250,
              height: _height,
              color: Colors.lightBlueAccent,
              child: Center(
                child: Text(
                  'My Test String',
                  textAlign: TextAlign.center,
                  style: TextStyle(fontSize: 35, fontWeight: FontWeight.bold),
                ),
              ),
            ),
          ),
          ElevatedButton(
              onPressed: () {
                doAnimation(); // works as it should
              },
              child: (_isOpen)? Text('Close Widget') : Text('Open Widget'))
        ],
      );
    }
  }
  </code></pre>
  
  <p>This error occurs when I try to use the class methods in the usual way.</p>
  <p><code>  This happens when you call setState() on a State object for a widget that hasn't been inserted into the widget tree yet. It is not necessary to call setState() in the constructor, since the state is already assumed to be dirty when it is initially created.</code></p>