Sobes.tech
Junior

Milyen típusú widgetek léteznek a Flutterben?

sobes.tech MI

Válasz az MI-től

A Flutterben a widgetek két fő kategóriába sorolhatók:

  • StatelessWidget: Olyan widgetek, amelyek állapota nem változik az első összeállítás után. Ezek az UI egy részét írják le, amely nem függ futási adatoktól.
  • StatefulWidget: Változtatható állapotú widgetek. Kapcsolódó State objektumuk van, amely tartalmazza a változtatható adatokat, és mechanizmust biztosít az újrarajzoláshoz, amikor az állapot változik.

Ezen kívül, a widgeteket céljuk szerint is osztályozhatjuk:

  • Elrendezés widgetek: Más widgetek elhelyezését irányítják a képernyőn (pl. Row, Column, Stack).
  • Material komponensek / Cupertino widgetek: Kész UI elemeket nyújtanak, amelyek megfelelnek a Material Design (Android) vagy Cupertino (iOS) irányelveinek (pl. AppBar, Button, TextField).
  • Bemeneti widgetek: Lehetővé teszik a felhasználó számára az alkalmazással való interakciót (pl. TextField, Checkbox, Slider).
  • Interaktív widgetek: Reagálnak a felhasználói gesztusokra (pl. GestureDetector, InkWell).
  • Festés és effektus widgetek: Grafikus effektusokat alkalmaznak (pl. Opacity, ClipRRect).
  • ** Görgethető widgetek:** Tartalom görgetését biztosítják (pl. ListView, GridView).

A létrehozás módja szerint a widgetek lehetnek:

  • Primitív: Alapvető építőelemek (pl. Container, Text, Icon).
  • Összetett: Más widgetekből állnak.
// Példa StatefulWidget
class CounterWidget extends StatefulWidget {
  @override
  _CounterWidgetState createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      // Állapot módosítása és újrarajzolás
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Számláló:'),
        Text(
          '$_counter',
          style: Theme.of(context).textTheme.headline4,
        ),
        FloatingActionButton(
          onPressed: _incrementCounter,
          tooltip: 'Növel',
          child: Icon(Icons.add),
        ),
      ],
    );
  }
}
// Példa StatelessWidget
class TitleWidget extends StatelessWidget {
  final String title;

  TitleWidget({required this.title});

  @override
  Widget build(BuildContext context) {
    return Text(
      title,
      style: TextStyle(fontSize: 24),
    );
  }
}