MDC-102 Flutter: Malzeme Yapısı ve Düzen

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.

MDC-101 codelab'inde, giriş sayfası oluşturmak için iki Material bileşeni kullandınız: mürekkep dalgaları içeren metin alanları ve düğmeler. Şimdi gezinme, yapı ve veri ekleyerek bu temeli genişletelim.

Oluşturacaklarınız

Bu codelab'de, giyim ve ev eşyaları satan bir e-ticaret uygulaması olan Shrine için bir ana ekran oluşturacaksınız. Şunları içerecektir:

  • Üst uygulama çubuğu
  • Ürünlerle dolu bir tablo listesi

Yapay Zeka

iOS

Üst uygulama çubuğu ve ürünlerle dolu ızgaraya sahip e-ticaret uygulaması

Üst uygulama çubuğu ve ürünlerle dolu ızgaraya sahip e-ticaret uygulaması

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

  • Üst uygulama çubuğu
  • Izgaralar
  • Kartlar

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

Acemi Orta Seviye Uzman

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

Bu laboratuvarı tamamlamak için Flutter SDK ve bir düzenleyici yazılımına ihtiyacınız vardır.

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 gerekir).
  • Windows, Linux veya macOS masaüstü uygulaması olarak Uygulamayı dağıtmayı planladığınız platformda geliştirme yapmanız 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. docs.flutter.dev/desktop adresinde işletim sistemine özgü gereksinimler ayrıntılı olarak açıklanmıştır.

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

MDC-101'den mi devam ediyorsunuz?

MDC-101'i tamamladıysanız kodunuz bu codelab için hazır olmalıdır. Üst uygulama çubuğu ekleme adımına atlayın.

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

Başlangıç Codelab uygulamasını indirme

Başlangıç uygulaması material-components-flutter-codelabs-102-starter_and_101-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 102-starter_and_101-complete

Projeyi açıp uygulamayı çalıştırma

  1. Projeyi tercih ettiğiniz düzenleyicide açın.
  2. Seçtiğiniz düzenleyici için Başlarken: Test sürüşü bölümündeki "Uygulamayı çalıştırmak" talimatlarını uygulayın.

Başarıyla gerçekleştirildi. Cihazınızda MDC-101 codelab'inde bulunan Tapınak giriş sayfası gösterilir.

Yapay Zeka

iOS

kullanıcı adı ve şifre alanları, iptal ve ileri düğmeleri bulunan giriş sayfası

kullanıcı adı ve şifre alanları, iptal ve ileri düğmeleri bulunan giriş sayfası

Giriş ekranı iyi göründüğü için uygulamayı bazı ürünlerle dolduralım.

4. Üst uygulama çubuğu ekle

Şu anda "Sonraki" düğmesini tıklarsanız "Başarılı oldunuz" yazan ana ekranı görürsünüz. Harika! Ama artık kullanıcımızın yapması gereken bir işlem yok veya uygulama içinde olduğuyla ilgili bir fikir sahibi değil. Yardımcı olmak için şimdi gezinme ekleme zamanı.

Materyal Tasarım, yüksek derecede kullanılabilirlik sağlayan gezinme kalıpları sunar. En görünür bileşenlerden biri üst uygulama çubuğudur.

Gezinme olanağı sunmak ve kullanıcıların diğer işlemlere hızlı erişmesini sağlamak için üst kısımda uygulama çubuğu ekleyelim.

AppBar widget'ı ekleme

home.dart ürününde, İskeleye bir AppBar ekleyin ve vurgulanan const işaretini kaldırın:

return const Scaffold(
  // TODO: Add app bar (102)
  appBar: AppBar(
    // TODO: Add buttons and title (102)
  ),

İskele'nin appBar: alanına AppBar'ı eklemek, AppBar'ın sayfanın üst kısmında, gövdenin de altında kalmasını sağlayarak bize ücretsiz olarak mükemmel bir düzen sağlar.

Metin widget'ı ekleme

home.dart uygulamasında AppBar'a başlık ekleyin:

// TODO: Add app bar (102)
  appBar: AppBar(
    // TODO: Add buttons and title (102)
    title: const Text('SHRINE'),
    // TODO: Add trailing buttons (102)

Projenizi kaydedin.

Yapay Zeka

iOS

Başlığında Tapınak olan uygulama çubuğu

Başlığında Tapınak olan uygulama çubuğu

Birçok uygulama çubuğunda, başlığın yanında bir düğme bulunur. Şimdi uygulamamıza bir menü simgesi ekleyelim.

Önde bir iconButton ekle

home.dart içindeyken AppBar'ın leading: alanı için bir iconButton ayarlayın. (Baştan sona doğru sıralamayı taklit etmek için bunu title: alanının önüne koyun):

    // TODO: Add buttons and title (102)
    leading: IconButton(
      icon: const Icon(
        Icons.menu,
        semanticLabel: 'menu',
      ),
      onPressed: () {
        print('Menu button');
      },
    ),

Projenizi kaydedin.

Yapay Zeka

iOS

Başlığında Shrine ve hamburger menü simgesi olan bir uygulama barı

Başlığında Türbe yazan ve hamburger menü simgesi içeren bir uygulama çubuğu

Menü simgesi ("hamburger" olarak da bilinir), tam da beklediğiniz yerde görünür.

Başlığın sonuna da düğmeler ekleyebilirsiniz. Flutter'da bunlara "eylemler" adı verilir.

İşlem ekleme

İki tane daha simge düğmesi için yer var.

Bunları başlıktan sonra AppBar örneğine ekleyin:

// TODO: Add trailing buttons (102)
actions: <Widget>[
  IconButton(
    icon: const Icon(
      Icons.search,
      semanticLabel: 'search',
    ),
    onPressed: () {
      print('Search button');
    },
  ),
  IconButton(
    icon: const Icon(
      Icons.tune,
      semanticLabel: 'filter',
    ),
    onPressed: () {
      print('Filter button');
    },
  ),
],

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

Yapay Zeka

iOS

Başlığında tapınak ve hamburger menü simgesi, arkasında arama ve özelleştirme simgeleri bulunan bir uygulama çubuğu

Başlığında tapınak ve hamburger menü simgesi, arkasında arama ve özelleştirme simgeleri bulunan bir uygulama çubuğu

Uygulamanın sağ tarafında artık bir başlangıç düğmesi, başlık ve iki işlem bulunuyor. Uygulama çubuğu, içerikten farklı bir katmanda olduğunu gösteren ince bir gölge kullanarak yükseklik bilgisini de gösterir.

5. Tabloya kart ekleme

Artık uygulamamızın bir yapısı var. Şimdi içerikleri kartlara yerleştirerek düzenleyelim.

GridView ekleme

Üst uygulama çubuğunun altına bir kart ekleyerek başlayalım. Card widget'ı tek başına yeterli bilgiye sahip olmadığı için onu bir GridView widget'ında göstermek istiyoruz.

İskele gövdesindeki Merkezi bir GridView ile değiştirin:

// TODO: Add a grid view (102)
body: GridView.count(
  crossAxisCount: 2,
  padding: const EdgeInsets.all(16.0),
  childAspectRatio: 8.0 / 9.0,
  // TODO: Build a grid of cards (102)
  children: <Widget>[Card()],
),

Bu kodu inceleyelim. GridView, görüntülediği öğelerin sayısı sonsuz değil, sayılabilir olduğundan count() yapıcısını çağırır. Ancak düzenini tanımlamak için daha fazla bilgiye ihtiyacı vardır.

crossAxisCount:, sitede kaç öğe olduğunu belirtir. 2 sütun istiyoruz.

padding: alanı, GridView'ın 4 tarafında da boşluk sağlar. Elbette, henüz yanlarında GridView alt öğesi olmadığından sondaki veya alt kenarlardaki dolguyu göremezsiniz.

childAspectRatio: alanı, öğelerin boyutunu en boy oranına (genişlik-yükseklik) göre tanımlar.

GridView, varsayılan olarak tümü aynı boyutta olan kartlar oluşturur.

Bir kartımız var ama o kart boş. Kartımıza alt widget'ları ekleyelim.

İçerikleri düzenleme

Kartlarda resim, başlık ve ikincil metin için bölgeler bulunmalıdır.

GridView'un alt öğelerini güncelleyin:

// TODO: Build a grid of cards (102)
children: <Widget>[
  Card(
    clipBehavior: Clip.antiAlias,
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        AspectRatio(
          aspectRatio: 18.0 / 11.0,
          child: Image.asset('assets/diamond.png'),
        ),
        Padding(
          padding: const EdgeInsets.fromLTRB(16.0, 12.0, 16.0, 8.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Text('Title'),
              const SizedBox(height: 8.0),
              Text('Secondary Text'),
            ],
          ),
        ),
      ],
    ),
  )
],

Bu kod, alt widget'ları dikey olarak düzenlemek için kullanılan bir Sütun widget'ı ekler.

crossAxisAlignment: field, "metni ön kenara hizala" anlamına gelen CrossAxisAlignment.start değerini belirtir.

AspectRatio widget'ı, sağlanan resmin türünden bağımsız olarak resmin hangi şekle sahip olacağını belirler.

Dolgu, metni kenardan biraz daha içe aktarır.

İki Text widget'ı, aralarında 8 nokta boşluk olacak şekilde dikey olarak üst üste dizilmiştir (SizedBox). Bunları Dolgu'nun içinde barındırmak için başka bir Sütun oluştururuz.

Projenizi kaydedin.

Yapay Zeka

iOS

Resim, başlık ve ikincil metin içeren tek bir öğe

Resim, başlık ve ikincil metin içeren tek bir öğe

Bu önizlemede, kartın kenarlardan içe doğru yerleştirildiğini, yuvarlatılmış köşelere ve kartın yüksekliğini ifade eden bir gölgeye sahip olduğunu görebilirsiniz. Material'da şeklin tamamı "kapsayıcı" olarak adlandırılır. (Kapsayıcı adlı gerçek widget sınıfıyla karıştırılmamalıdır.)

Kartlar genellikle diğer kartlarla birlikte bir koleksiyonda gösterilir. Bunları bir koleksiyon olarak ızgara şeklinde düzenleyelim.

6. Kart koleksiyonu oluşturma

Bir ekranda birden fazla kart varsa bunlar bir veya daha fazla koleksiyonda gruplandırılır. Koleksiyondaki kartlar aynı düzlemdedir. Yani kartlar, aynı yükseklikte durur (kartlar kaldırılmadığı veya sürüklenmediği sürece, ancak burada bunu yapmayacağız).

Kartı bir koleksiyon halinde çoğaltın

Şu anda kartımız, GridView'ın children: alanında satır içi olarak oluşturuluyor. Bu, okuması zor olabilecek çok sayıda iç içe yerleştirilmiş koddur. Bu işlevi, istediğimiz kadar boş kart oluşturabilen ve bir kart listesi döndüren bir işleve dönüştürelim.

build() işlevinin üzerinde yeni bir gizli işlev oluşturun (Alt çizgiyle başlayan işlevlerin gizli API olduğunu unutmayın):

// TODO: Make a collection of cards (102)
List<Card> _buildGridCards(int count) {
  List<Card> cards = List.generate(
    count,
    (int index) {
      return Card(
        clipBehavior: Clip.antiAlias,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            AspectRatio(
              aspectRatio: 18.0 / 11.0,
              child: Image.asset('assets/diamond.png'),
            ),
            Padding(
              padding: const EdgeInsets.fromLTRB(16.0, 12.0, 16.0, 8.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: const <Widget>[
                  Text('Title'),
                  SizedBox(height: 8.0),
                  Text('Secondary Text'),
                ],
              ),
            ),
          ],
        ),
      );
    },
  );
  return cards;
}

Oluşturulan kartları GridView'ın children alanına atayın. GridView'daki her şeyi bu yeni kodla değiştirmeyi unutmayın:

// TODO: Add a grid view (102)
body: GridView.count(
  crossAxisCount: 2,
  padding: const EdgeInsets.all(16.0),
  childAspectRatio: 8.0 / 9.0,
  children: _buildGridCards(10) // Replace
),

Projenizi kaydedin.

Yapay Zeka

iOS

resim, başlık ve ikincil metin içeren öğeler ızgarası

resim, başlık ve ikincil metin içeren öğeler ızgarası

Kartlar gösteriliyor ancak henüz hiçbir şey gösterilmiyor. Şimdi ürün verilerini ekleme zamanı.

Ürün verileri ekleme

Uygulamada resim, ad ve fiyat içeren bazı ürünler var. Bunu kartta bulunan widget'lara ekleyelim.

Ardından home.dart aracında, yeni bir paketi ve bir veri modeli için sağladığımız bazı dosyaları içe aktarın:

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

import 'model/product.dart';
import 'model/products_repository.dart';

Son olarak, ürün bilgilerini getirmek için _buildGridCards() değerini değiştirin ve bu verileri kartlarda kullanın:

// TODO: Make a collection of cards (102)

// Replace this entire method
List<Card> _buildGridCards(BuildContext context) {
  List<Product> products = ProductsRepository.loadProducts(Category.all);

  if (products.isEmpty) {
    return const <Card>[];
  }

  final ThemeData theme = Theme.of(context);
  final NumberFormat formatter = NumberFormat.simpleCurrency(
      locale: Localizations.localeOf(context).toString());

  return products.map((product) {
    return Card(
      clipBehavior: Clip.antiAlias,
      // TODO: Adjust card heights (103)
      child: Column(
        // TODO: Center items on the card (103)
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          AspectRatio(
            aspectRatio: 18 / 11,
            child: Image.asset(
              product.assetName,
              package: product.assetPackage,
             // TODO: Adjust the box size (102)
            ),
          ),
          Expanded(
            child: Padding(
              padding: const EdgeInsets.fromLTRB(16.0, 12.0, 16.0, 8.0),
              child: Column(
               // TODO: Align labels to the bottom and center (103)
               crossAxisAlignment: CrossAxisAlignment.start,
                // TODO: Change innermost Column (103)
                children: <Widget>[
                 // TODO: Handle overflowing labels (103)
                 Text(
                    product.name,
                    style: theme.textTheme.titleLarge,
                    maxLines: 1,
                  ),
                  const SizedBox(height: 8.0),
                  Text(
                    formatter.format(product.price),
                    style: theme.textTheme.titleSmall,
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }).toList();
}

NOT: Henüz derleme ve çalıştırılamaz. Bir değişiklik daha var.

Ayrıca, derlemeyi denemeden önce build() işlevini, BuildContext değerini _buildGridCards() olarak iletecek şekilde değiştirin:

// TODO: Add a grid view (102)
body: GridView.count(
  crossAxisCount: 2,
  padding: const EdgeInsets.all(16.0),
  childAspectRatio: 8.0 / 9.0,
  children: _buildGridCards(context) // Changed code
),

Uygulamayı çalışırken yeniden başlatın.

Yapay Zeka

iOS

Resim, ürün başlığı ve fiyat içeren bir öğe ızgara

Resim, ürün başlığı ve fiyatın yer aldığı öğeler ızgarası

Kartlar arasına dikey boşluk eklemediğimizi fark edebilirsiniz. Bunun nedeni, reklamların üst ve alt kısımlarında varsayılan olarak 4 kenar boşluğunun olmasıdır.

Projenizi kaydedin.

Ürün verileri gösteriliyor ancak resimlerin etrafında fazladan boşluk var. Resimler varsayılan olarak .scaleDown değerine sahip bir BoxFit ile çizilir (bu örnekte). Bunu biraz yakınlaştırması ve fazla boşlukları kaldırması için .fitWidth olarak değiştirelim.

Resme BoxFit.fitWidth değerine sahip bir fit: alanı ekleyin:

  // TODO: Adjust the box size (102)
  fit: BoxFit.fitWidth,

Yapay Zeka

iOS

kırpılmış resim, ürün başlığı ve fiyatın yer aldığı öğeler ızgarası

Ürünlerimiz artık uygulamada mükemmel bir şekilde görünüyor.

7. Tebrikler!

Uygulamamızda, kullanıcıyı giriş ekranından ürünlerin görüntülenebileceği bir ana ekrana yönlendiren temel bir akış var. Birkaç satır kodla üst uygulama çubuğu (başlık ve üç düğmeyle) ve kartlar (uygulamamızdaki içeriği sunmak için) ekledik. Artık basit ve işlevsel olan ana ekranımız, temel bir yapı ve üzerinde işlem yapılabilir içerik içeriyor.

Sonraki adımlar

Üst uygulama çubuğu, kart, metin alanı ve düğmeyle birlikte Material Flutter kitaplığından dört temel bileşeni kullanıyoruz. Malzeme bileşenleri widget kataloğunu ziyaret ederek daha fazlasını keşfedebilirsiniz.

Uygulamamız tam olarak işlevsel olsa da henüz belirli bir markayı veya bakış açısını yansıtmıyor. MDC-103: Renk, Şekil, Yükseklik ve Tür ile Materyal Tasarım Teması bölümünde canlı ve modern bir markayı ifade etmek için bu bileşenlerin stilini özelleştireceğiz.

Bu codelab'i makul bir zaman ve çabayla tamamlayabildim

Kesinlikle katılıyorum Katılıyorum Ne katılıyorum ne katılmıyorum Katılmıyorum Kesinlikle katılmıyorum

Gelecekte Materyal Bileşenleri kullanmaya devam etmek istiyorum

Kesinlikle katılıyorum Katılıyorum Nötr Katılmıyorum Kesinlikle katılmıyorum