What does Underscore "_" before variable name mean for Flutter

36,651

Solution 1

It's not just a naming convention. Underscore fields, classes and methods will only be available in the .dart file where they are defined.

It is common practice to make the State implementation of a widget private, so that it can only be instantiated by the corresponding StatefulWidget:

class MyPage extends StatefulWidget {
  @override
  _MyPageState createState() => _MyPageState();
}

class _MyPageState extends State<MyPage> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

Solution 2

From the Dart guide

Unlike Java, Dart doesn’t have the keywords public, protected, and private. If an identifier starts with an underscore (_), it’s private to its library. For details, see Libraries and visibility.

Solution 3

Private fields also have the advantage that Lint can identify which fields were declared/instantiated and not used, which helps identify human errors.

If you declare a public field, the field may be accessed by classes outside the class in the future and so Lint cannot warn you if you added the field by mistake.

Share:
36,651

Related videos on Youtube

lonelearner
Author by

lonelearner

A lonely soul in the world of android, drifting and learning android application development. Lonely soul chronicles are found below: Android Advance Reboot https://www.facebook.com/Android-Advance-Reboot-548612572176807/ Android Noob Reboot https://www.facebook.com/Android-Noob-Reboot-1248769758470969/

Updated on July 08, 2022

Comments

  • lonelearner
    lonelearner almost 2 years

    with reference to the Flutter tutorial, I encountered an underscore, _.

    I know that in Java, _ is used as a naming convention for a private variable.

    1. Does it also apply to Flutter? Noting that there is no public/protected in Flutter.
    2. Will the _ really be private (inaccessible by other classes) or is it just a naming convention?

    Variable

    class RandomWordsState extends State<RandomWords> {
      final List<WordPair> _suggestions = <WordPair>[];
      final Set<WordPair> _saved = new Set<WordPair>();
      final TextStyle _biggerFont = const TextStyle(fontSize: 18.0);
      ...
    }
    
    1. Does the _ make the Widget private too? In this case, wouldn't the main class be unable to assess the Widget?

    Function

    Widget _buildRow(WordPair pair) {
      final bool alreadySaved = _saved.contains(pair);  // Add this line.
      ...
    }