What does Underscore "_" before variable name mean for Flutter
FlutterDartFlutter Problem Overview
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.
- Does it also apply to Flutter? Noting that there is no public/protected in Flutter.
- 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);
...
}
- 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.
...
}
Flutter Solutions
Solution 1 - Flutter
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 - Flutter
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 - Flutter
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.