Sobes.tech
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),
    );
  }
}