Junior
Ποιοι τύποι widget υπάρχουν στο Flutter;
sobes.tech AI
Απάντηση από AI
Στο Flutter, τα widget χωρίζονται σε δύο κύριες κατηγορίες:
- StatelessWidget: Widget που η κατάσταση του δεν αλλάζει μετά την αρχική κατασκευή. Περιγράφουν ένα μέρος του UI που δεν εξαρτάται από δεδομένα σε χρόνο εκτέλεσης.
- StatefulWidget: Widget με μεταβλητή κατάσταση. Έχουν ένα συσχετισμένο αντικείμενο
State, που περιέχει μεταβλητά δεδομένα και παρέχει μηχανισμό για ανακατασκευή του widget όταν αλλάζει η κατάσταση.
Επιπλέον, τα widget μπορούν να ταξινομηθούν σύμφωνα με τον σκοπό τους:
- Layout widgets: Διαχειρίζονται τη διάταξη άλλων widget στην οθόνη (π.χ.,
Row,Column,Stack). - Material Components / Cupertino widgets: Παρέχουν έτοιμα στοιχεία UI που συμμορφώνονται με τις οδηγίες Material Design (Android) ή Cupertino (iOS) (π.χ.,
AppBar,Button,TextField). - Input widgets: Επιτρέπουν στον χρήστη να αλληλεπιδρά με την εφαρμογή (π.χ.,
TextField,Checkbox,Slider). - Interactive widgets: Ανταποκρίνονται σε κινήσεις του χρήστη (π.χ.,
GestureDetector,InkWell). - Painting & Effects widgets: Εφαρμόζουν γραφικά εφέ (π.χ.,
Opacity,ClipRRect). - Scrolling widgets: Παρέχουν κύλιση περιεχομένου (π.χ.,
ListView,GridView).
Τα widget μπορούν να δημιουργηθούν με:
- Primitive: Βασικά δομικά στοιχεία (π.χ.,
Container,Text,Icon). - Composite: Αποτελούνται από άλλα widget.
// Παράδειγμα StatefulWidget
class CounterWidget extends StatefulWidget {
@override
_CounterWidgetState createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget> {
int _counter = 0;
void _incrementCounter() {
setState(() {
// Αλλαγή κατάστασης και ανακατασκευή
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Μετρητής:'),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Αύξηση',
child: Icon(Icons.add),
),
],
);
}
}
// Παράδειγμα StatelessWidget
class TitleWidget extends StatelessWidget {
final String title;
TitleWidget({required this.title});
@override
Widget build(BuildContext context) {
return Text(
title,
style: TextStyle(fontSize: 24),
);
}
}