CodeBlanks Logo Icon CodeBlanks

Tema mimarisi

Tema katmanları ve ThemeExtension'ı öğrenirsin.

Tema katmanları

Flutter'da tema katmanları şu şekilde işler: MaterialApp bir ThemeData alır ve bu değerler tüm alt widget'lara yayılır. Alt widget'lar Theme.of(context) ile temaya erişir. Renk, tipografi ve şekil tek yerden yönetilir.

MaterialApp(
  theme: ThemeData(
    colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
    useMaterial3: true,
  ),
  home: const HomeScreen(),
);

ThemeExtension ile özel alan

Bazen ThemeData'nın sabit alanları yetmez; marka rengi gibi özel değerler eklemek istersin. ThemeExtension<T> ile kendi tema alanını tanımlarsın. copyWith ve lerp metodlarını uygulamalısın; böylece tema geçişlerinde Flutter değerleri yumuşakça ara değerler.

class AppColors extends ThemeExtension<AppColors> {
  final Color brand;
  const AppColors({required this.brand});

  @override
  AppColors copyWith({Color? brand}) =>
      AppColors(brand: brand ?? this.brand);

  @override
  AppColors lerp(AppColors? other, double t) =>
      AppColors(brand: Color.lerp(brand, other?.brand, t)!);
}

Uygulama ThemeExtension sınıfı yaz

AppColors adında bir ThemeExtension sınıfı yaz. brand adında Color alanı olsun. copyWith ve lerp metodlarını uygula. main içinde bir AppColors örneği oluştur ve brand rengini yazdır.

Başlangıç kodu

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

// AppColors adında ThemeExtension<AppColors> yaz
// brand adında Color alanı olsun
// İki metodu da uygula

void main() {
  // AppColors oluştur ve brand rengini yazdır
}

Örnek çözüm

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

class AppColors extends ThemeExtension<AppColors> {
  final Color brand;
  const AppColors({required this.brand});

  @override
  AppColors copyWith({Color? brand}) =>
      AppColors(brand: brand ?? this.brand);

  @override
  AppColors lerp(AppColors? other, double t) =>
      AppColors(brand: Color.lerp(brand, other?.brand, t)!);
}

void main() {
  final colors = const AppColors(brand: Color(0xFF123456));
  print(colors.brand);
}

Beklenen çıktı

Color(0xff123456)

Soru ve cevaplar

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

1 ThemeExtension ile ne yapılır?

  • Uygulamanın ekran boyutu değiştirilir
  • State yönetimi yapılır
  • ThemeData'ya özel tema alanları eklenir Doğru cevap
  • Yeni bir widget türü tanımlanır

Açıklama: ThemeExtension&lt;T&gt;, ThemeData'nın sabit alanlarına kendi renk veya boyut değerlerini eklemenin standart yoludur.

2 ThemeExtension tipi

Soru
class AppColors extends ThemeExtension<____> {
  final Color brand;
}
Cevap
class AppColors extends ThemeExtension<AppColors> {
  final Color brand;
}

Açıklama: ThemeExtension<T> kalıbında T, sınıfın kendisidir; böylece copyWith ve lerp doğru tipi döndürür.

3 Tema katmanı parçaları

Kavram Anlamı
ThemeData Tüm tema değerlerini taşır
ThemeExtension Özel tema alanları ekler
Theme.of(context) Alt widget'tan temaya erişim
ColorScheme.fromSeed Tohumdan renk paleti üretir

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