title: Flutter change state from StatefulWidget object
body: <p>Like title states, how can one access the state of a StatefulWidget from the StatefulWidget.</p>
  
  <p><strong>Background:</strong>
  I have a star rating widget that consists of 5 "StarWidget"s in a row. The StarWidget class is just an Icon with a detector wrapped around it (not using IconButton because it has a very large size). The StarWidget stores whether it is selected or not in a corresponding State object and accordingly displays a solid or outline icon.</p>
  
  <p>In my main widget, I have access to the StatefulWidget objects, and would like to configure their states.</p>
  
  <pre><code>import 'package:flutter/material.dart';
  
  import 'package:font_awesome_flutter/font_awesome_flutter.dart';
  
  class StarRatingWidget extends StatefulWidget {
    @override
    _StarRatingWidgetState createState() {
      return _StarRatingWidgetState();
    }
  }
  
  class _StarRatingWidgetState extends State&lt;StarRatingWidget&gt;
      implements StarSelectionInterface {
    //Properties
    int _currentRating = 0;
    List&lt;RatingStarWidget&gt; starWidgets = [];
  
    //Methods
    @override
    void initState() {
      super.initState();
      starWidgets.add(
        RatingStarWidget(
          starSelectionInterface: this,
          starPosition: 0,
        ),
      );
      starWidgets.add(
        RatingStarWidget(
          starSelectionInterface: this,
          starPosition: 1,
        ),
      );
      starWidgets.add(
        RatingStarWidget(
          starSelectionInterface: this,
          starPosition: 2,
        ),
      );
      starWidgets.add(
        RatingStarWidget(
          starSelectionInterface: this,
          starPosition: 3,
        ),
      );
      starWidgets.add(
        RatingStarWidget(
          starSelectionInterface: this,
          starPosition: 4,
        ),
      );
    }
  
    @override
    Widget build(BuildContext buildContext) {
      return Row(
        children: starWidgets,
      );
    }
  
    //Star Selection Interface Methods
    void onStarSelected(_RatingStarWidgetState starWidgetState) {
      print("listener: star selected ${starWidgetState._starPosition}");
  
      //a new, rating has been selected, update rating
      if (_currentRating != starWidgetState._starPosition) {
        _currentRating = (starWidgetState._starPosition + 1);
      }
  
      //same star as rating has been selected, set rating to 0
      else {
        _currentRating = 0;
      }
  
      //update stars according to rating
      for(int i = 1; i &lt;= 5; i++) {
        //what should I do here?!
      }
    }
  }
  
  class RatingStarWidget extends StatefulWidget {
    //Properties
    final int starPosition;
    final StarSelectionInterface starSelectionInterface;
  
    //Constructors
    RatingStarWidget({this.starSelectionInterface, this.starPosition});
  
    //Methods
    @override
    _RatingStarWidgetState createState() {
      return _RatingStarWidgetState(starSelectionInterface, starPosition);
    }
  }
  
  class _RatingStarWidgetState extends State&lt;RatingStarWidget&gt; {
    //Properties
    int _starPosition;
    bool _isSelected = false;
    StarSelectionInterface selectionListener;
  
    //Constructors
    _RatingStarWidgetState(this.selectionListener, this._starPosition);
  
    //Methods
    @override
    Widget build(BuildContext buildContext) {
      return AnimatedCrossFade(
        firstChild: GestureDetector(
          child: Icon(
            FontAwesomeIcons.star,
            size: 14,
          ),
          onTap: () {
            print("star: selected");
            selectionListener.onStarSelected(this);
          },
        ),
        secondChild: GestureDetector(
          child: Icon(
            FontAwesomeIcons.solidStar,
            size: 14,
          ),
          onTap: () {
            selectionListener.onStarSelected(this);
          },
        ),
        duration: Duration(milliseconds: 300),
        crossFadeState:
            _isSelected ? CrossFadeState.showSecond : CrossFadeState.showFirst,
      );
    }
  }
  
  class StarSelectionInterface {
    void onStarSelected(_RatingStarWidgetState starWidgetState) {}
  }
  </code></pre>