MDC-103 Flutter: Renk, Şekil, Yükseklik ve Tür ile Malzeme Teması

1. Giriş

logo_components_color_2x_web_96dp.png

Materyal Bileşenleri (MDC), geliştiricilerin Materyal Tasarım'ı uygulamasına yardımcı olur. Google'da mühendislerden ve kullanıcı deneyimi tasarımcılarından oluşan bir ekip tarafından oluşturulan MDC, onlarca güzel ve işlevsel kullanıcı arayüzü bileşeni içerir. Ayrıca Android, iOS, web ve Flutter.material.io/develop'da kullanılabilir.

Artık Material Flutter'ı kullanarak uygulamalarınızın özgün bir tarza sahip. Materyal Tasarım'ın kısa süre önce genişlemesi, tasarımcılara ve geliştiricilere ürünlerinin markalarını ifade etmeleri için daha fazla esneklik sağlıyor.

MDC-101 ve MDC-102 codelab'lerinde, giysi ve ev eşyaları satan bir e-ticaret uygulaması olan Shrine adlı uygulamanın temellerini oluşturmak için Material Flutter'ı kullandınız. Bu uygulama, giriş ekranıyla başlayan ve ardından kullanıcıyı ürünlerin gösterildiği bir ana ekrana yönlendiren bir kullanıcı işlemleri akışı içeriyor.

Oluşturacaklarınız

Bu codelab'de Shrine uygulamasını aşağıdakileri kullanarak özelleştireceksiniz:

  • Renk
  • Yazı biçimi
  • Rakım
  • Şekil
  • Düzen

Android

iOS

Tapınak giriş sayfası, temalı kahverengi ve pembe

Tapınak giriş sayfası, temalı kahverengi ve pembe

Üst uygulama çubuğu ve pembe temalı, asimetrik, yatay olarak kaydırılabilen bir ızgaranın yer aldığı tapınak ürün sayfası

Bu codelab'deki Material Flutter bileşenleri ve alt sistemleri

  • Temalar
  • Yazı biçimi
  • Rakım
  • Resim listesi

Flutter geliştirme ile ilgili deneyim düzeyinizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

2. Flutter geliştirme ortamınızı kurma

Bu laboratuvarı tamamlamak için iki yazılıma ihtiyacınız vardır: Flutter SDK'sı ve düzenleyici.

Codelab'i aşağıdaki cihazlardan birini kullanarak çalıştırabilirsiniz:

  • Bilgisayarınıza bağlı ve Geliştirici moduna ayarlanmış fiziksel bir Android veya iOS cihaz.
  • iOS simülatörü (Xcode araçlarının yüklenmesini gerektirir).
  • Android Emülatör (Android Studio'da kurulum gerektirir).
  • Tarayıcı (hata ayıklama için Chrome gereklidir).
  • Windows, Linux veya macOS masaüstü uygulaması olarak Uygulamayı dağıtmayı planladığınız platformda gerçekleştirmeniz gerekir. Bu nedenle, bir Windows masaüstü uygulaması geliştirmek istiyorsanız uygun derleme zincirine erişmek için Windows'da geliştirme yapmanız gerekir. İşletim sistemine özgü gereksinimler docs.flutter.dev/desktop sayfasında ayrıntılı olarak açıklanmıştır.

3. codelab başlangıç uygulamasını indirme

MDC-102'den mi devam ediyorsunuz?

MDC-102'yi tamamladıysanız kodunuz bu codelab'de kullanılmaya hazır olmalıdır. Şu adıma geçin: Renkleri değiştirme.

Sıfırdan mı başlıyorsunuz?

Starter codelab uygulamasını indirin

Başlangıç uygulaması material-components-flutter-codelabs-103-starter_and_102-complete/mdc_100_series dizininde bulunur.

...veya GitHub'dan klonlayın

Bu codelab'i GitHub'dan klonlamak için şu komutları çalıştırın:

git clone https://github.com/material-components/material-components-flutter-codelabs.git
cd material-components-flutter-codelabs/mdc_100_series
git checkout 103-starter_and_102-complete

Projeyi açın ve uygulamayı çalıştırın

  1. Projeyi istediğiniz düzenleyicide açın.
  2. "Uygulamayı çalıştırma" talimatlarını izleyin Başlarken: Seçtiğiniz düzenleyici için uygulamayı test edin.

Başarıyla gerçekleştirildi. Cihazınızdaki önceki codelab'lerde bulunan Tapınak giriş sayfasını göreceksiniz.

Android

iOS

teması olmayan Mabet giriş sayfası

teması olmayan Mabet giriş sayfası

"Sonraki"yi tıklayın. ürün sayfasını görüntüleyin.

Android

iOS

temalı olmayan tapınak ürün ızgarası sayfası

temalı olmayan tapınak ürün ızgarası sayfası

4. Renkleri değiştirme

Shrine markasını temsil eden bir renk şeması oluşturuldu ve tasarımcı bu renk şemasını Shrine uygulaması genelinde uygulamanızı istiyor

Başlamak için bu renkleri projemize aktaralım.

colors.dart Oluştur

lib uygulamasında colors.dart adlı yeni bir dart dosyası oluşturun. material.dart verilerini içe aktarın ve const Color değer ekleyin:

import 'package:flutter/material.dart';

const kShrinePink50 = Color(0xFFFEEAE6);
const kShrinePink100 = Color(0xFFFEDBD0);
const kShrinePink300 = Color(0xFFFBB8AC);
const kShrinePink400 = Color(0xFFEAA4A4);

const kShrineBrown900 = Color(0xFF442B2D);

const kShrineErrorRed = Color(0xFFC5032B);

const kShrineSurfaceWhite = Color(0xFFFFFBFA);
const kShrineBackgroundWhite = Colors.white;

Özel renk paleti

Bu renk teması, bir tasarımcı tarafından özel renklerle oluşturulmuştur (aşağıdaki resimde gösterilmektedir). Shrine'ın markasından seçilen ve daha zengin bir palet oluşturacak şekilde genişletilen Materyal Tema Düzenleyici'ye uygulanan renkler içerir. (Bu renkler, 2014 Material renk paletlerinden değil.)

Materyal Tema Düzenleyici, bunları sayısal olarak etiketlenmiş tonlar halinde düzenlemiştir. Bunlar her bir rengin 50, 100, 200, .... ila 900. etiketini içerir. Shrine yalnızca pembe numunenin 50, 100 ve 300 ve kahverengi numunenin 900 tonlarını kullanır.

d0362cb45c565a8e.jpeg 470b0e1c2669ae2.png

Widget'ların her renkli parametresi, bu şemalardaki bir renkle eşlenir. Örneğin, aktif olarak giriş alırken metin alanının süslemelerinin rengi temanın Birincil rengi olmalıdır. Bu renge erişilemiyorsa (arka planı üzerinde kolayca görülmesi kolaysa) bunun yerine başka bir renk kullanın.

Artık kullanmak istediğimiz renkler olduğuna göre bunları kullanıcı arayüzüne uygulayabiliriz. Bunu, widget hiyerarşimizin üst kısmındaki MaterialApp örneğine uyguladığımız ThemeData widget'ının değerlerini ayarlayarak yapacağız.

ThemeData.light() işlevini özelleştirme

Flutter'da birkaç yerleşik tema bulunur. Açık tema bunlardan biridir. Bir ThemeData widget'ını sıfırdan oluşturmak yerine, açık temayı kopyalayıp değerleri değiştirerek uygulamamıza uygun hale getireceğiz.

colors.dart dosyasını app.dart. uygulamasına aktaralım

import 'colors.dart';

Ardından, aşağıdakini ShrineApp sınıfının kapsamı dışında app.dart dosyasına ekleyin:

// TODO: Build a Shrine Theme (103)
final ThemeData _kShrineTheme = _buildShrineTheme();

ThemeData _buildShrineTheme() {
  final ThemeData base = ThemeData.light(useMaterial3: true);
  return base.copyWith(
    colorScheme: base.colorScheme.copyWith(
      primary: kShrinePink100,
      onPrimary: kShrineBrown900,
      secondary: kShrineBrown900,
      error: kShrineErrorRed,
    ),
    // TODO: Add the text themes (103)
    // TODO: Decorate the inputs (103)
  );
}

Şimdi, ShrineApp'in build() işlevinin (MaterialApp widget'ında) sonundaki theme: öğesini yeni temamız olarak ayarlayın:

  // TODO: Customize the theme (103)
  theme: _kShrineTheme, // New code

Projenizi kaydedin. Giriş ekranınız artık şu şekilde görünmelidir:

Android

iOS

pembe ve kahverengi temalı Mabet giriş sayfası

pembe ve kahverengi temalı Mabet giriş sayfası

5. Tipografi ve etiket stillerini değiştirme

Tasarımcı, renk değişikliklerinin yanı sıra kullanılacak belirli bir yazı biçimi de sağladı. Flutter'ın ThemeData uygulamasında 3 metin teması bulunur. Her metin teması, "başlık" gibi bir metin stilleri koleksiyonudur ve "title" olarak adlandırılır. Uygulamamız için birkaç stil kullanacak ve bazı değerleri değiştireceğiz.

Metin temasını özelleştirme

Yazı tiplerini projeye aktarmak için pubspec.yaml dosyasına eklenmeleri gerekir.

pubspec.yaml içinde, flutter: etiketinden hemen sonra aşağıdakileri ekleyin:

  # TODO: Insert Fonts (103)
  fonts:
    - family: Rubik
      fonts:
        - asset: fonts/Rubik-Regular.ttf
        - asset: fonts/Rubik-Medium.ttf
          weight: 500

Artık Rubik yazı tipine erişip kullanabilirsiniz.

pubspec dosyasıyla ilgili sorunları giderme

Yukarıdaki beyanı kesip yapıştırırsanız pub get komutunu çalıştırırken hatalarla karşılaşabilirsiniz. Hata alıyorsanız önce üstteki boşlukları kaldırıp 2 boşluk girintisi kullanarak boşluk ekleyin. (Önünde iki boşluk

fonts:

, öncesinde dört boşluk

family: Rubik

vb.)

Burada eşleme değerlerine izin verilmiyor ifadesini görüyorsanız sorunlu satırın girintisini ve üzerindeki satırların girintisini kontrol edin.

login.dart uygulamasında, Column() içinde şunu değiştirin:

Column(
  children: <Widget>[
    Image.asset('assets/diamond.png'),
    const SizedBox(height: 16.0),
    Text(
      'SHRINE',
      style: Theme.of(context).textTheme.headlineSmall,
    ),
  ],
)

app.dart içinde, _buildShrineTheme() öğesinden sonra aşağıdakileri ekleyin:

// TODO: Build a Shrine Text Theme (103)
TextTheme _buildShrineTextTheme(TextTheme base) {
  return base
      .copyWith(
        headlineSmall: base.headlineSmall!.copyWith(
          fontWeight: FontWeight.w500,
        ),
        titleLarge: base.titleLarge!.copyWith(
          fontSize: 18.0,
        ),
        bodySmall: base.bodySmall!.copyWith(
          fontWeight: FontWeight.w400,
          fontSize: 14.0,
        ),
        bodyLarge: base.bodyLarge!.copyWith(
          fontWeight: FontWeight.w500,
          fontSize: 16.0,
        ),
      )
      .apply(
        fontFamily: 'Rubik',
        displayColor: kShrineBrown900,
        bodyColor: kShrineBrown900,
      );
}

Bu işlem TextTheme'ı alır ve başlıkların, başlıkların ve altyazıların görünümünü değiştirir.

fontFamily bu şekilde uygulandığında, değişiklikler yalnızca copyWith() özelliğinde belirtilen tipografi ölçeği değerlerine (başlık, başlık, altyazı) uygulanır.

Bazı yazı tipleri için 100'lük artışlarla özel bir fontweight ayarlıyoruz: w500 (500 ağırlık) orta değere, w400 ise normal değere karşılık gelir.

Yeni metni kullanınthems

Hatadan sonra şu temaları _buildShrineTheme öğesine ekleyin:

// TODO: Add the text themes (103)
textTheme: _buildShrineTextTheme(base.textTheme),
textSelectionTheme: const TextSelectionThemeData(
  selectionColor: kShrinePink100,
),

Projenizi kaydedin. Yazı tiplerini değiştirdiğimiz için bu kez de uygulamayı yeniden başlatın (Hızlı Yeniden Başlatma olarak bilinir).

Android

iOS

Metin temalarının uygulandığı tapınak ürün ızgara sayfası

Giriş ve ana ekranlardaki metinler farklı görünüyor. Bazı metinler Rubik yazı tipini kullanırken, diğer metinler siyah veya beyaz yerine kahverengi olarak oluşturuluyor. Simgeler de kahverengi olur.

Metni küçült

Etiketler çok büyük.

home.dart öğesinde, en içteki Sütunun children: değerini değiştirin:

// TODO: Change innermost Column (103)
children: <Widget>[
// TODO: Handle overflowing labels (103)
  Text(
    product.name,
    style: theme.textTheme.button,
    softWrap: false,
    overflow: TextOverflow.ellipsis,
    maxLines: 1,
  ),
  const SizedBox(height: 4.0),
  Text(
    formatter.format(product.price),
    style: theme.textTheme.bodySmall,
  ),
  // End new code
],

Metni ortalayıp bırakma

Etiketleri ortalamak ve metni her resmin alt yerine her kartın alt kısmıyla hizalamak istiyoruz.

Etiketleri ana eksenin sonuna (alt) taşıyın ve ortalanacak şekilde değiştirin:

  // TODO: Align labels to the bottom and center (103)
  mainAxisAlignment: MainAxisAlignment.end,
  crossAxisAlignment: CrossAxisAlignment.center,

Projenizi kaydedin.

Android

iOS

Farklı metin hizalaması olan tapınak ürün ızgara sayfası

Farklı metin hizalaması olan tapınak ürün ızgara sayfası

Bu çok daha iyi görünüyor.

Metin alanlarının temasını belirleyin

Ayrıca, metin alanlarının süslemesini bir InputDecorationTheme ile temalandırabilirsiniz.

app.dart öğesinde, _buildShrineTheme() yönteminde bir inputDecorationTheme: değeri belirtin:

// TODO: Decorate the inputs (103)
inputDecorationTheme: const InputDecorationTheme(
  border: OutlineInputBorder(),
),

Şu anda metin alanlarında filled süslemesi var. Bunu kaldıralım. filled değerini kaldırıp inputDecorationTheme değerini belirttiğinizde metin alanlarına dış çizgi stili eklenir.

login.dart ürününde filled: true değerlerini kaldırın:

// Remove filled: true values (103)
TextField(
  controller: _usernameController,
  decoration: const InputDecoration(
    // Removed filled: true
    labelText: 'Username',
  ),
),
const SizedBox(height: 12.0),
TextField(
  controller: _passwordController,
  decoration: const InputDecoration(
    // Removed filled: true
    labelText: 'Password',
  ),
  obscureText: true,
),

Çalışır durumda yeniden başlatma. Kullanıcı adı alanı etkin olduğunda (yazırken) giriş ekranınız şöyle görünmelidir:

Android

iOS

Kullanıcı adı alanına odaklanılmış tapınak giriş sayfası

Kullanıcı adı alanına odaklanılmış tapınak giriş sayfası

Metin alanına yazı yazın. Kenarlıklar ve kayan etiketler birincil renkte oluşturulur. Ama bunu çok kolay bir şekilde göremiyoruz. Yeterince yüksek renk kontrastına sahip olmayan pikselleri ayırt etme konusunda sorun yaşayan kullanıcılar bu araca erişemez. (Daha fazla bilgi için Materyal Yönergeleri Renk ve Erişilebilirlik makalesine bakın.)

app.dart ürününde, inputDecorationTheme: altında bir focusedBorder: belirtin :

// TODO: Decorate the inputs (103)
inputDecorationTheme: const InputDecorationTheme(
  border: OutlineInputBorder(),
  focusedBorder: OutlineInputBorder(
    borderSide: BorderSide(
      width: 2.0,
      color: kShrineBrown900,
    ),
  ),
),

Daha sonra, inputDecorationTheme: altında bir floatingLabelStyle: belirtin :

// TODO: Decorate the inputs (103)
inputDecorationTheme: const InputDecorationTheme(
  border: OutlineInputBorder(),
  focusedBorder: OutlineInputBorder(
    borderSide: BorderSide(
      width: 2.0,
      color: kShrineBrown900,
    ),
  ),
  floatingLabelStyle: TextStyle(
    color: kShrineBrown900,
  ),
),

Son olarak, daha fazla kontrast için İptal düğmesinin birincil renk yerine ikincil rengi kullanmasını sağlayalım.

TextButton(
  child: const Text('CANCEL'),
  onPressed: () {
    _usernameController.clear();
    _passwordController.clear();
  },
  style: TextButton.styleFrom(
    primary: Theme.of(context).colorScheme.secondary,
  ),
),

Projenizi kaydedin.

Android

iOS

Erişilebilir İPTAL düğmesi bulunan tapınak giriş sayfası

Erişilebilir İPTAL düğmesi bulunan tapınak giriş sayfası

6. Rakımı ayarla

Artık sayfanın stilini Tapınak'la eşleşen belirli bir renk ve yazı tipiyle biçimlendirdiğinize göre yüksekliği ayarlayabiliriz.

SONRAKİ düğmesinin yüksekliğini değiştirme

ElevatedButton için varsayılan yükseklik 2'dir. Hadi, bunu daha yüksek yapalım.

login.dart ürününde, NEXT ElevatedButton'a bir style: değeri ekleyin:

ElevatedButton(
  child: const Text('NEXT'),
  onPressed: () {
    Navigator.pop(context);
  },
  style: ElevatedButton.styleFrom(
    foregroundColor: kShrineBrown900,
    backgroundColor: kShrinePink100,
    elevation: 8.0,
  ),
),

Projenizi kaydedin.

Android

iOS

Yükseltilmiş NEXT düğmesinin bulunduğu tapınak giriş sayfası

Yükseltilmiş NEXT düğmesinin bulunduğu tapınak giriş sayfası

Kart yüksekliğini ayarlama

Şu anda kartlar sitenin gezinme menüsünün yanındaki beyaz bir yüzeyde bulunuyor.

home.dart uygulamasında, Kartlara elevation: değeri ekleyin:

// TODO: Adjust card heights (103)
elevation: 0.0,

Projeyi kaydedin.

Android

iOS

Her kart için yükselti bilgisi olmayan tapınak ürün ızgara sayfası

Her kart için yükselti bilgisi olmayan tapınak ürün ızgara sayfası

Kartların altındaki gölgeyi kaldırdınız.

7. Şekil Ekle

Tapınak, öğeleri sekizgen veya dikdörtgen şekilli tanımlayan havalı bir geometrik stile sahiptir. Ana ekrandaki kartlarda ve giriş ekranındaki metin alanları ile düğmelerde bu şekil stilini uygulayalım.

Giriş ekranındaki metin alanı şekillerini değiştirme

app.dart’de aşağıdaki dosyayı içe aktarın:

import 'supplemental/cut_corners_border.dart';

Yine app.dart içinde, köşeleri kesilmiş bir kenarlık kullanmak için metin alanı dekorasyon temasını değiştirin:

// TODO: Decorate the inputs (103)
inputDecorationTheme: const InputDecorationTheme(
  border: CutCornersBorder(),
  focusedBorder: CutCornersBorder(
    borderSide: BorderSide(
      width: 2.0,
      color: kShrineBrown900,
    ),
  ), 
  floatingLabelStyle: TextStyle(
    color: kShrineBrown900,
  ),
),

Giriş ekranındaki düğme şekillerini değiştirme

login.dart ürününde İPTAL düğmesine eğimli bir dikdörtgen kenarlık ekleyin:

TextButton(
  child: const Text('CANCEL'),
  onPressed: () {
    _usernameController.clear();
    _passwordController.clear();
  },
  style: TextButton.styleFrom(
    foregroundColor: kShrineBrown900,
    shape: const BeveledRectangleBorder(
      borderRadius: BorderRadius.all(Radius.circular(7.0)),
    ),
  ),
),

TextButton'ın görünür bir şekli olmadığı için neden kenarlık şekli eklemeliyim? Dolayısıyla, dalga animasyonu dokunulduğunda aynı şekle bağlanır.

Şimdi aynı şekli SONRAKİ düğmesine ekleyin:

ElevatedButton(
  child: const Text('NEXT'),
  onPressed: () {
    Navigator.pop(context);
  },
  style: ElevatedButton.styleFrom(
    foregroundColor: kShrineBrown900,
    backgroundColor: kShrinePink100,
    elevation: 8.0,
    shape: const BeveledRectangleBorder(
      borderRadius: BorderRadius.all(Radius.circular(7.0)),
    ),
  ),
),

Tüm düğmelerin şeklini değiştirmek için app.dart içinde elevatedButtonTheme veya textButtonTheme kullanabiliriz. Bu, öğrenci için bir mücadele olarak kalmıştır.

Çalışır durumda yeniden başlatma.

Android

iOS

Şekil teması uygulanmış tapınak giriş sayfası

Şekil teması uygulanmış tapınak giriş sayfası

8. Düzeni değiştirme

Daha sonra, kartları farklı en boy oranlarında ve boyutlarda gösterecek şekilde düzeni değiştirerek her kart diğer kartlardan benzersiz olacak şekilde değiştirelim.

GridView'u AsymmetricView ile değiştirme

Dosyaları asimetrik bir düzen için zaten yazdık.

home.dart içinde aşağıdaki içe aktarmayı ekleyin:

import 'supplemental/asymmetric_view.dart';

_buildGridCards öğesini silin ve body değerini değiştirin:

body: AsymmetricView(
  products: ProductsRepository.loadProducts(Category.all),
),

Projeyi kaydedin.

Android

iOS

Asimetrik yatay kaydırılabilir sayfa düzenine sahip tapınak ürün sayfası

Asimetrik yatay kaydırılabilir sayfa düzenine sahip tapınak ürün sayfası

Şimdi ürünler, dokumadan esinlenilerek tasarlanmış bir desende yatay olarak kaydırılıyor.

9. Başka bir tema deneyin (İsteğe bağlı)

Renk, markanızı ifade etmenin güçlü bir yoludur ve renkteki küçük bir değişiklik kullanıcı deneyiminizi büyük ölçüde etkileyebilir. Bunu test etmek için markanın renk şeması biraz farklıysa Shrine'ın nasıl göründüğüne bakalım.

Renkleri değiştirme

colors.dart içine aşağıdaki rengi ekleyin:

const kShrinePurple = Color(0xFF5D1049);

app.dart ürününde _buildShrineTheme() işlevini şu şekilde değiştirin:

ThemeData _buildShrineTheme() {
  final ThemeData base = ThemeData.light();
  return base.copyWith(
    colorScheme: base.colorScheme.copyWith(
      primary: kShrinePurple,
      secondary: kShrinePurple,
      error: kShrineErrorRed,
    ),
    scaffoldBackgroundColor: kShrineSurfaceWhite,
    textSelectionTheme: const TextSelectionThemeData(
      selectionColor: kShrinePurple,
    ),
    appBarTheme: const AppBarTheme(
      foregroundColor: kShrineBrown900,
      backgroundColor: kShrinePink100,
    ),

    inputDecorationTheme: const InputDecorationTheme(
      border: CutCornersBorder(),
      focusedBorder: CutCornersBorder(
        borderSide: BorderSide(
          width: 2.0,
          color: kShrinePurple,
        ),
      ),
      floatingLabelStyle: TextStyle(
        color: kShrinePurple,
      ),
    ),
  );
}

Çalışır durumda yeniden başlatma. Yeni tema artık görünecektir.

Android

iOS

Mor ve pembe temalı tapınak giriş sayfası

Mor ve pembe temalı tapınak giriş sayfası

Android

iOS

Pembe temalı tapınak ürün sayfası

Pembe temalı tapınak ürün sayfası

Sonuç çok farklı olacaktır! app.dart's _buildShrineTheme değerini bu adımdan önceki durumuna geri döndürelim. İsterseniz 104'ün başlangıç kodunu da indirebilirsiniz.

10. Tebrikler!

Şu ana kadar tasarımcınızın tasarım özelliklerine benzeyen bir uygulama oluşturdunuz.

Sonraki adımlar

Şu anda şu Material Flutter'ı kullandınız: tema, tipografi, yükseklik ve şekil. Material Flutter kitaplığında daha fazla bileşen ve alt sistem keşfedebilirsiniz.

Yatay kaydırma, asimetrik düzen ızgarasını nasıl yaptığımızı öğrenmek için supplemental dizinindeki dosyaları inceleyin.

Planlanan uygulama tasarımınız kitaplıkta bileşeni olmayan öğeler içeriyorsa ne olur? MDC-104: Material Advanced Bileşenler bölümünde, istenen bir görünümü elde etmek için Material Flutter kitaplığını kullanarak özel bileşenlerin nasıl oluşturulacağını gösteriyoruz.

Bu codelab'i makul bir zaman ve çabayla tamamlayabildim

Kesinlikle katılıyorum Katılıyorum Ne memnunum ne değilim Katılmıyorum Kesinlikle katılmıyorum

Gelecekte Materyal Bileşenleri kullanmaya devam etmek istiyorum

Kesinlikle katılıyorum Katılıyorum Ne memnunum ne değilim Katılmıyorum Kesinlikle katılmıyorum