Skip to content
Kezdőlap » DatePicker widget

DatePicker widget

A DatePicker megjelenít egy konfigurálható dátum választó modal-t. A material.dart része, nem igényli külső csomag telepítését.

Használata

A showDatePicker függvénnyel lehet megjeleníteni. Én készítettem hozzá egy metódust, amit át lehet adni mondjuk egy gomb onPressed eseménykezelőjéhez:

  void _presentDatePicker() {
    final now = DateTime.now();
    final firstDate = DateTime(now.year - 1, now.month, now.day);
    showDatePicker(
      context: context,
      initialDate: now,
      firstDate: firstDate,
      lastDate: now,
    );
  }

A DatePickernek a fenti négy paramétere fontos, hogy meg legyen adva:

  • A context a widget context-ját jelenti, amiről itt írtam.
  • Az initaldate az a dátum, ami a DatePicker megjelenésekor ki van választva. Beállíottam neki, hogy ez legyen az aktuális dátum.
  • A firstDate az a legkisebb választható dátum.
  • A lastDate pedig a legnagyobb kiválasztható dátum.

Gyakorlatilag ezt kapjuk eredményül, amikor megjelenítjük a dátumválasztót:

DatePicker

Kiválasztott dátum tárolása / kezelése: then

A DatePicker visszaadja a kiválasztott értéket, de ez valami Future típusú adat:

Future

A Future egy fontos Dart típus. A Future egy objektum, ami beburkol (wrappel) egy olyan értéket, ami még nem létezik, de létezni fog a jövőben. Tisztára a „Vissza a jövőbe” feeling :).

Oké, akkor jöjjön a magyarázat: a showDatePicker tehát megjelenít nekünk egy dátumválasztót. Amikor az megjelenik, akkor még nem választottunk dátumot. Tehát ez a jövőben fog megtörténni. A Flutter tudja, hogy valamilyen dátumot majd a jövőben ki fogunk választani, éppen ezért lehetővé teszi, hogy rendelkezésünkre álljon egy függvény (then()), ami majd akkor lesz futtatva, ha dátumot választunk.

Tehát ez a Future objektum azonnal visszatér, de még nem tartalmazza a kiválasztott dátumot.A Future objektumnak elérhető a then() metódusa, aminek át lehet adni például egy névtelen függvényt, ami majd megkapja az értéket, amit a DatePicker-en választunk.

    showDatePicker(
      context: context,
      initialDate: now,
      firstDate: firstDate,
      lastDate: now,
    ).then((value) {
      
    });

A then() tehát akkor fog lefutni, amikor már választottunk egy dátumot.

async, await

A then() helyett van egy kényelmesebb megoldás, az async kulcsszó használata, amit a metódus neve utáni () és a metódus törzsét kezdő { között adunk meg:

void _presentDatePicker() async {

Ennek párjaként kötelezően meg kell adni az await kulcsszót az elé a kódrészlet elé, ami a jövőbeni értéket adja:

await showDatePicker(

A jövőben megkapott értéket változóba tudjuk tenni:

final pickedDate = await showDatePicker(

Azt észben kell tartani, hogy a változó tartalma azonnal még nem áll a rendelkezésre, hiszen Future típusú adatot tárol. De ami tök jó, hogy az await „blokk” utáni első utasítás akkor fog lefutni, amikor már megérkezik ez az érték:

    final pickedDate = await showDatePicker(
      context: context,
      initialDate: now,
      firstDate: firstDate,
      lastDate: now,
    );
    // await után először ez fut le:
    print(pickedDate);

Vagy bele is rakhatjuk egy változóba, amit a setState-en belül egyenlővé teszünk a kiválasztott dátummal:

  DateTime? _selectedDate;

  void _presentDatePicker() async {
    final now = DateTime.now();
    final firstDate = DateTime(now.year - 1, now.month, now.day);
    final pickedDate = await showDatePicker(
      context: context,
      initialDate: now,
      firstDate: firstDate,
      lastDate: now,
    );
    // await után először ez fut le:
    setState(() {
      _selectedDate = pickedDate;
    });

És ezt a _selectedDate értéket az osztályon belül fel tudjuk használni:

Text(_selectedDate == null
      ? 'No date selected'
      : formatter.format(_selectedDate!)),

Egy Text widgettel megjelenítjük. És mivel a formatter olyan értéket vár, ami nem lehet null, a _selectedDate utáni ! jellel kényszerítjük a Dart-ot arra, hogy feltételezze, hogy nem null érték fog jönni.

Amikor megjelenik a dátumválasztó:

No date selected

És miután választottunk:

date selected

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük