CodeBlanks Logo Icon CodeBlanks

onSaved

onSaved callback ile form verisini toplamayı öğrenirsin.

onSaved nedir?

onSaved, bir TextFormField'a verilen callback'dir. Form kaydedilirken çağrılır ve alanın değerini alıp bir değişkende tutmanı sağlar.

String? _isim;

TextFormField(
  onSaved: (deger) {
    _isim = deger;
  },
)

onSaved, save metodu çağrılınca tetiklenir.

FormState.save

_formKey.currentState!.save() çağrıldığında, formdaki her TextFormField'ın onSaved callback'i çalıştırılır. Bu sayede tüm alan değerlerini değişkenlere aktarırsın.

String? _isim;
String? _eposta;

if (_formKey.currentState!.validate()) {
  _formKey.currentState!.save();
  print('İsim: $_isim');
}

save, validate başarılı olduktan sonra çağrılır.

Uygulama onSaved ile veri topla

Ekrani stateful widget'ında _formKey ve _isim değişkeni tanımla. Form içine bir TextFormField koy; onSaved ile değeri _isim'e ata. Butona basıldığında validate başarılıysa save çağır ve print('isim: $_isim') yaz. main'de print('form başladı') çağır.

Başlangıç kodu

main.dart
import 'package:flutter/material.dart';

void main() {
  print('form başladı');
  runApp(MaterialApp(home: Ekrani()));
}

class Ekrani extends StatefulWidget {
  @override
  _EkraniState createState() => _EkraniState();
}

class _EkraniState extends State<Ekrani> {
  // _formKey ve _isim ekle

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: EdgeInsets.all(16),
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              TextFormField(
                // onSaved ekle
              ),
              ElevatedButton(
                onPressed: () {
                  // validate ve save çağır
                },
                child: Text('Kaydet'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Örnek çözüm

main.dart
import 'package:flutter/material.dart';

void main() {
  print('form başladı');
  runApp(MaterialApp(home: Ekrani()));
}

class Ekrani extends StatefulWidget {
  @override
  _EkraniState createState() => _EkraniState();
}

class _EkraniState extends State<Ekrani> {
  final _formKey = GlobalKey<FormState>();
  String? _isim;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: EdgeInsets.all(16),
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              TextFormField(
                onSaved: (deger) {
                  _isim = deger;
                },
              ),
              ElevatedButton(
                onPressed: () {
                  if (_formKey.currentState!.validate()) {
                    _formKey.currentState!.save();
                    print('isim: $_isim');
                  }
                },
                child: Text('Kaydet'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Beklenen çıktı

form başladı

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 onSaved callback ne zaman çağrılır?

  • Kullanıcı her tuşa bastığında
  • Form build edildiğinde
  • Form save metodu çağrıldığında Doğru cevap
  • Yalnızca initState'te

Açıklama: onSaved callback, FormState.save çağrıldığında her TextFormField için tetiklenir; bu sayede alan değerleri toplanır.

2 FormState.save çağrısını ekle

Soru
if (_formKey.currentState!.validate()) {
  _formKey.currentState!.____();
  print('kaydedildi');
}
Cevap
if (_formKey.currentState!.validate()) {
  _formKey.currentState!.save();
  print('kaydedildi');
}

Açıklama: FormState.save() çağrıldığında her TextFormField'ın onSaved callback'i çalışır; alan değerleri değişkenlere aktarılır.

3 onSaved parçaları

Kavram Anlamı
onSaved Alan değerini toplamak için callback
save Tüm onSaved'ları tetikleyen metod
FormState save metodunun çağrıldığı state
validate save öncesi yapılan doğrulama

Orta seviye bölümündeki tüm dersler