Menu
CoddyTech

finally ile Temizleme

Coddy'nin Flutter Journey'sinin Veri ve Ağ bölümünün bir parçası. Ders 12 / 27.

Bir çağrı başarılı olsa da başarısız olsa da bazı işler yapılmalıdır: dönen simgesini gizlemek, bir düğmeyi yeniden etkinleştirmek. Bunu hem try hem de catch içinde yazmak, birinde unutmayı kolaylaştırır. Dart bunun için üçüncü bir blok sunar: finally:

try {
  await saveName(name);
} catch (e) {
  // hatayı göster
} finally {
  // her zaman çalışır: try sonrasında veya catch sonrasında
}

finally her zaman en son çalışır: başarılı olduğunda try bloğundan sonra, başarısız olduğunda catch bloğundan sonra. Böylece çağrıdan önce ayarladıklarını geri almak için tek bir yer olur.

Burada uygulama, kaydetme işlemi sürerken Save düğmesini devre dışı bırakır; bunu onPressed: saving ? null : save ile yapar. onPressed değeri null olan bir düğmeye basılamaz. saving yeniden false değerine dönmezse düğme kalıcı olarak gri kalır.

challenge icon

Görev

Orta

Alan boşken kaydedin: hata görüntülenir ve Kaydet gri kalır, bu yüzden yeniden denemek mümkün olmaz. saving = false ifadesini try bloğunun dışına, kendi setState çağrısının içinde bir finally bloğuna taşıyın.

Kendin dene

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: NameScreen(),
    );
  }
}

class NameScreen extends StatefulWidget {
  const NameScreen({super.key});

  @override
  State<NameScreen> createState() => _NameScreenState();
}

class _NameScreenState extends State<NameScreen> {
  final controller = TextEditingController();
  String status = '';
  bool saving = false;

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  Future<void> saveName(String name) async {
    await Future.delayed(const Duration(seconds: 1));
    if (name.isEmpty) {
      throw Exception('The name cannot be empty');
    }
  }

  Future<void> save() async {
    setState(() {
      saving = true;
    });
    try {
      await saveName(controller.text);
      setState(() {
        status = 'Saved: ${controller.text}';
        saving = false;
      });
    } catch (e) {
      setState(() {
        status = '$e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.all(24),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextField(
              controller: controller,
              decoration: const InputDecoration(labelText: 'Name'),
            ),
            const SizedBox(height: 16),
            ElevatedButton(onPressed: saving ? null : save, child: const Text('Save')),
            const SizedBox(height: 16),
            Text(status, style: const TextStyle(fontSize: 18)),
          ],
        ),
      ),
    );
  }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Veri ve Ağ bölümündeki tüm dersler

Kendi başına pratik yap: Online Flutter derleyicisi