Flutter – Dispose

Flutter’da dispose yöntemi, bir Stateful widget veya bir State objesi yaşam döngüsünden kaldırıldığında çağrılan bir metoddur. Dispose metodu, widget’in veya state’in kullanılmadığı durumlarda kaynakları temizlemek ve hafızada sızıntıları önlemek için kullanılır.

dispose yöntemini kullanmak için aşağıdaki adımları izleyebilirsiniz:

  • Bir Stateful widget oluşturun veya bir State sınıfı tanımlayın.
  • State sınıfına dispose yöntemini ekleyin. Bu yöntem aynı sınıfta @override anotasyonuyla birlikte tanımlanmalıdır.
  • dispose yönteminde temizleme işlemlerini gerçekleştirin. Örneğin, animasyonları durdurun, timer’ları iptal edin, dinleyicileri kaldırın veya diğer kaynakları serbest bırakın.
import 'package:flutter/material.dart';

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  Timer _timer;

  @override
  void initState() {
    super.initState();
    _timer = Timer.periodic(Duration(seconds: 1), (timer) {
      // Timer çalıştığında yapılacak işlemler
    });
  }

  @override
  void dispose() {
    _timer.cancel(); // Timer'ı iptal et
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // Widget oluşturma işlemleri
  }
}

Yukarıdaki örnekte, _MyWidgetState sınıfı, _timer adında bir Timer nesnesi tanımlar ve initState yönteminde başlatır. dispose yöntemi, Stateful widget yaşam döngüsünden kaldırıldığında _timer‘ı iptal eder ve gereksiz hafıza kullanımını önler.

Unutmayın, Stateful widget veya State objesi kullanılmadığı zamanlarda dispose yöntemi çağrılacaktır. Bu nedenle, kaynakları serbest bırakmak ve hafıza sızıntılarını önlemek için bu yöntemi doğru şekilde kullanmanız önemlidir.

Dispose() yöntemi, genellikle kullanıcı farklı bir ekrana geçtiğinde veya uygulamayı kapattığında, pencere öğesi ağaçtan kalıcı olarak kaldırıldığında, bir pencere öğesinin State nesnesinde çağrılır.

Flutter – kDebugMode

kDebugMode Flutter’ın dart:core kütüphanesindeki bir sabittir. Bu sabit, kodun debug (hata ayıklama) modunda çalışıp çalışmadığını belirlemek için kullanılır.

Flutter uygulamalarını geliştirirken, genellikle iki farklı modda çalışırız: debug modu ve release modu. Debug modunda çalışırken, hata ayıklama araçlarına erişebilir, hataları daha ayrıntılı olarak görebilir ve performans optimizasyonlarından vazgeçebiliriz. Release modunda ise uygulama performansı için optimizasyonlar yapılır ve hata ayıklama araçları devre dışı bırakılır.

kDebugMode sabiti, kodun hangi modda çalıştığını belirlemek için kullanılır. Bu sabit bool türündedir ve debug modunda çalışıyorsa true, release modunda çalışıyorsa false değerini alır.

Örneğin, aşağıdaki kod parçasında kDebugMode sabiti kullanılarak debug modunda çalışırken bazı özel davranışlar sağlanabilir:

if (kDebugMode) {
  // Debug modu özel davranışları burada gerçekleştir
  print('Debug modunda çalışılıyor');
  // Hata ayıklama araçlarına erişim sağla
} else {
  // Release modu özel davranışları burada gerçekleştir
  print('Release modunda çalışılıyor');
  // Performans optimizasyonları yap
}

Bu şekilde, kodun çalıştığı modu belirlemek ve bu modlara özgü davranışlar sağlamak için kDebugMode sabitini kullanabilirsiniz.

Flutter – Navigation (pushNamed)

Flutter’da, uygulamanızdaki farklı sayfalar arasında gezinmek için Navigation kullanabilirsiniz.

İlk olarak, gezinmek istediğiniz sayfaları tanımlamanız gerekiyor. Bunu MaterialApp widget’ının içindeki MaterialApp.routes özelliği ile yapabilirsiniz. Örneğin:

MaterialApp(
  routes: {
    '/': (context) => HomePage(),
    '/second': (context) => SecondPage(),
  },
)

Yukarıdaki örnekte, ‘/’ yolu ana sayfaya, ‘/second’ yolu ise ikinci sayfaya yönlendirir. Ana sayfada bir düğme olsun ve bu düğme ikinci sayfaya geçiş yapsın.

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Ana Sayfa'),
      ),
      body: Center(
        child: ElevatedButton(
          child: Text('İkinci Sayfaya Git'),
          onPressed: () {
            Navigator.pushNamed(context, '/second');
          },
        ),
      ),
    );
  }
}

Yukarıdaki kodda, ElevatedButton’un onPressed olayı tetiklendiğinde Navigator.pushNamed kullanılarak ‘/second’ yolu üzerinden ikinci sayfaya geçiş yapılır.

İkinci sayfada, bir geri düğmesi ekleyebilirsiniz. Bu düğme Navigator.pop kullanılarak önceki sayfaya döndürülür.

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('İkinci Sayfa'),
      ),
      body: Center(
        child: ElevatedButton(
          child: Text('Geri Dön'),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
    );
  }
}

Flutter GetX – Dialog

Flutter GetX paketi, kolay ve hızlı bir şekilde dialoglar oluşturmak için kullanabileceğiniz Get.dialog() fonksiyonunu sağlar.

Get.dialog(
              AlertDialog(
                title: Text('Merhaba!'),
                content: Text('Dialog kullanımı öğreniyorum.'),
                actions: [
                  TextButton(
                    onPressed: () => Get.back(),
                    child: Text('Kapat'),
                  ),
                ],
              ),
);

Örneğin, bir butona tıklama işlemi sonrası bir dialog göstermek istediğinizi varsayalım. İşte bu senaryo için bir örnek kod:

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dialog Kullanımı'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Get.dialog(
              AlertDialog(
                title: Text('Merhaba!'),
                content: Text('Dialog kullanımı öğreniyorum.'),
                actions: [
                  TextButton(
                    onPressed: () => Get.back(),
                    child: Text('Kapat'),
                  ),
                ],
              ),
            );
          },
          child: Text('Dialog Göster'),
        ),
      ),
    );
  }
}

Flutter GetX – Snackbar

GetX ile snackbar kullanımı oldukça kolaydır. Snackbar, uyarı mesajlarını kullanıcılara göstermek için kullanılan bir araçtır. İşlem sonucunu kullanıcıya bildirmek veya hata mesajı göstermek için kullanılabilir.

GetX ile Snackbar kullanmak için, Get.snackbar() metodunu kullanabilirsiniz.

Get.snackbar(
  'Title',
  'This is a snackbar',
  duration: const Duration(seconds: 3),
);

Yukarıdaki kod bloğunda, GetX ile snackbar’ı kullanarak ‘Title’ başlığı ve ‘This is a snackbar’ mesajını ekledik. Ayrıca, snackbar’ın görüntülenme süresini belirlemek için duration parametresini kullandık.

Snackbar’a bir buton eklemek için, action parametresini kullanabilirsiniz.

 Get.snackbar(
    'Title',
    'This is a snackbar',
    duration: const Duration(seconds: 3),
    snackPosition: SnackPosition.BOTTOM,
    backgroundColor: Colors.black,
    colorText: Colors.white,
    margin: const EdgeInsets.only(bottom: 10, left: 5, right: 5),
    mainButton: TextButton(
        onPressed: () {
             // do something
        },
        child: const Text('Button',
               style: TextStyle(color: Colors.white)),
        ),
);

Flutter GetX – Named routes

Named routes (isimlendirilmiş rotalar), uygulamanızdaki herhangi bir sayfaya erişmek için kullanabileceğiniz bir yoldur.

Rotaları tanımlamak için GetMaterialApp kullanın:

void main() {
  runApp(
    GetMaterialApp(
      unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()),
      initialRoute: '/',
      getPages: [
        GetPage(name: '/', page: () => MyHomePage()),
        GetPage(name: '/second', page: () => Second()),
      ],
    )
  );
}

Şimdi sayfalar arasında geçmek için Get.toNamed() metodunu kullanabilirsiniz.

Get.toNamed('/second');

İsterseniz, named routes’ları parametrelerle de kullanabilirsiniz.

void main() {
  runApp(
    GetMaterialApp(
      unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()),
      initialRoute: '/',
      getPages: [
        GetPage(name: '/', page: () => MyHomePage()),
        GetPage(name: '/second', page: () => Second()),
        GetPage(name: '/third/:id', page: () => ThirdPage()),
      ],
    )
  );
}

Bu kodda ‘/third/:id’ rotası, id parametresi ile ThirdPage widget’ına yönlendirme yapar. Bu parametreyi Get.toNamed() metodunda kullanabilirsiniz:

Get.toNamed('/third/123');

id parametresini ThirdPage widget’ı içerisinde karşılamak için:

Get.parameters['id']

İsimlendirilmiş Rotalara Veri Gönderimi

Argümanlar için istediğinizi göndermeniz yeterli. Get, burada bir Map, List ve hatta bir sınıf örneği olan her şeyi kabul eder.

Get.toNamed("/second", arguments: 'Get is the best');
print(Get.arguments);

Dinamik URL Linkleri

Tıpkı Web’deki gibi gelişmiş dinamik url’ler sunun.

Get.offAllNamed("/second?device=phone&id=1&name=Taner");
print(Get.parameters['id']);
// out: 1
print(Get.parameters['name']);
// out: Taner

veya:

var parameters = <String, String>{"flag": "true","country": "turkiye",};
Get.toNamed("/third/1", parameters: parameters);
print(Get.parameters['id']);
print(Get.parameters['flag']);
print(Get.parameters['country']);

Flutter GetX – Routing

GetX ile yapabileceğiniz birkaç yönlendirme yöntemi:

Get.to() metodu: Bu yöntem, bir sayfadan diğerine geçmek için kullanılır.

Get.to(SecondPage());

Get.off() metodu: Bu yöntem, bir sayfadan diğerine geçerken, bir önceki sayfayı yığın bellekten çıkarır. (Splash Screen, Login vb. kullanım için)

Get.off(SecondPage());

Get.offAll() metodu: Bu yöntem, tüm sayfaları yığın bellekten çıkararak, ana sayfaya dönmek için kullanılır.

Get.offAll(HomePage());

Get.back() metodu: Normalde Navigator.pop(context) ile kapatacağınız Snackbar, Dialog, alt sayfa veya herhangi bir şeyi kapatmak, yani yığının en üstündekini atmak için kullanılır.

Get.back();

Bluetooth nedir, nasıl çalışır?

Bluetooth, kablosuz veri aktarımı için kullanılan bir teknolojidir. Bu teknoloji, kısa mesafelerde (genellikle 10 metreye kadar) veri iletimi yapmak için tasarlanmıştır. Bluetooth, özellikle cep telefonları; kulaklıklar, hoparlörler, klavyeler, fareler, tabletler ve bilgisayarlar gibi cihazlar arasında veri iletimi için kullanılır.

Bluetooth, düşük maliyetli ve güç tüketimi açısından avantajlıdır ve dünya çapında kabul gören bir standarttır. İki cihaz arasındaki iletişim, kablosuz olarak gerçekleşir ve sinyaller radyo frekansları üzerinden iletilir. Bluetooth, cihazlar arasında hızlı ve güvenilir bir bağlantı sağlar ve aynı anda birden fazla cihazın bağlanmasına izin verir.

Ayrıca, Bluetooth sinyalleri, güvenli bir veri aktarımı sağlamak için düşük güçlü (aktarım gücü 2,4 miliwatt ile sınırlı) olmalıdır. Bu da sinyallerin menzilinin sınırlı kalmasına neden olur. Bluetooth teknolojisi, diğer kablosuz iletişim protokolleri gibi güçlü antenlere veya yüksek güçlü vericilere sahip değildir, bu nedenle sinyallerin menzili kısıtlıdır.

ISM (Industrial, Scientific, and Medical) Bandı

ISM bandı, birçok kablosuz teknolojinin kullanımında yaygın olarak kullanılır. Örneğin; Wi-Fi, Bluetooth, kablosuz telefonlar, Zigbee, RFID gibi teknolojiler ISM bandı üzerinde çalışır.

ISM bandı, UHF bandı içinde yer alır ve 2.4 GHz bölgesinde bulunur. Bluetooth teknolojisi, ISM bandındaki 2.4 GHz frekans bandında çalışır ve diğer kablosuz cihazlarla çakışmayı önlemek için frekans atlama yöntemini kullanır.

Bu nedenle, ISM bandı ve UHF bandı arasında bir ilişki vardır ve ISM bandı, düşük güçlü kablosuz cihazlar için özellikle uygun bir banttır. UHF bantı ise daha geniş bir frekans aralığına sahip olup birçok kablosuz teknoloji tarafından kullanılmaktadır.

Radyo Frekans Spektrumu

Radyo frekans bantları, kablosuz iletişim için belirlenmiş farklı frekans aralıklarını ifade eder. Bu bantlar, birçok kablosuz teknoloji tarafından kullanılır ve her biri farklı özelliklere sahiptir. Bazı yaygın radyo frekans bantları şunlardır:

  1. ELF (Extremely Low Frequency) Bantı: 3-30 Hz frekans aralığına sahiptir.
  2. VLF (Very Low Frequency) Bantı: 3 kHz – 30 kHz frekans aralığına sahiptir.
  3. LF (Low Frequency) Bantı: 30 kHz – 300 kHz frekans aralığına sahiptir.
  4. MF (Medium Frequency) Bantı: 300 kHz – 3 MHz frekans aralığına sahiptir.
  5. HF (High Frequency) Bantı: 3 MHz – 30 MHz frekans aralığına sahiptir.
  6. VHF (Very High Frequency) Bantı: 30 MHz – 300 MHz frekans aralığına sahiptir.

7. UHF (Ultra High Frequency) Bantı: 300 MHz – 3 GHz frekans aralığına sahiptir.

  1. SHF (Super High Frequency) Bantı: 3 GHz – 30 GHz frekans aralığına sahiptir.
  2. EHF (Extremely High Frequency) Bantı: 30 GHz – 300 GHz frekans aralığına sahiptir.

Bu radyo frekans bantları, kablosuz iletişim için kullanılan birçok teknoloji tarafından kullanılır. Örneğin, AM ve FM radyo yayınları, TV yayınları, cep telefonu iletişimi, Wi-Fi ve Bluetooth teknolojileri gibi teknolojiler, belirli bir radyo frekans bantı aralığında çalışır.

Elektromanyetik Spektrum İçerisinde RF’nin Yeri

Radyo frekansı (RF), elektromanyetik dalga spektrumunun bir bölümünü ifade eder. Bu frekanslar, genellikle radyo iletişimi ve elektronik cihazlarda kullanılır. Radyo frekansı, 3 kHz ila 300 GHz arasındaki frekans aralığına karşılık gelir.

RF, manyetik ve elektrik alanlardan oluşan elektromanyetik dalgalar aracılığıyla iletilir ve bu dalgaların frekansları, veri aktarım hızı ve kablosuz iletişim mesafesi gibi faktörlere bağlı olarak belirlenir.

Bluetooth HC-05 ve HC-06 modülleri

Bluetooth HC-05 ve HC-06 modülleri, kablosuz veri iletişimi için kullanılan popüler Bluetooth modülleridir. Her iki modül de Texas Instruments (TI) tarafından üretilmektedir.

HC-05, seri iletişim için AT komutları aracılığıyla programlanabilen bir Bluetooth modülüdür. Bu modül, düşük maliyeti ve kullanım kolaylığı nedeniyle yaygın olarak kullanılmaktadır. HC-05, Bluetooth 2.0 spesifikasyonuna uygun olarak çalışır ve genellikle robotik projeler, akıllı ev uygulamaları, veri günlüğü kaydedicileri ve diğer benzer projelerde kullanılır.

HC-06, HC-05 ile benzer özelliklere sahip bir Bluetooth modülüdür, ancak AT komutları kullanarak programlanamaz. Bu modül, sadece seri iletişim yapmak için kullanılır ve HC-05’e kıyasla daha az esneklik sağlar. HC-06, Bluetooth 2.0 spesifikasyonuna uygun olarak çalışır ve HC-05 gibi birçok projede kullanılabilir.

Her iki modül de kablosuz veri iletimi için kullanılabildiğinden, özellikle robotik projeler, akıllı ev uygulamaları, otomotiv uygulamaları ve benzeri projelerde kullanılmaktadırlar.

HC-05 RX pinine gerilim bölücü uygulayarak besleme gerilimini 3.3v olarak uygulayın.

(AT)tention Komutları

AT komutları, cihazlar arasında seri haberleşme yoluyla gönderilen kontrol komutlarıdır. Bu komutlar genellikle cihaz ayarlarının yapılandırılması, kontrolü veya teşhisi için kullanılır. AT komutları, tipik olarak cihazın seri haberleşme portu üzerinden gönderilir ve alınır.

AT komutları birçok cihazda kullanılabilir, özellikle de modemler, Bluetooth modülleri, GPS alıcıları ve diğer benzer cihazlar gibi. Örneğin, bir Bluetooth modülüne AT komutları göndererek, modülün çalışma ayarlarını değiştirebilir veya bağlantı kurabilirsiniz.

AT komutları genellikle “AT” karakterleri ile başlarlar. Örneğin, bir Bluetooth modülüne AT komutu göndermek isterseniz, “AT” karakt erlerini seri port üzerinden göndermeniz gerekebilir. Ardından, belirli bir AT komutunu belirtmek için “AT+komut_adı” şeklinde bir komut kullanabilirsiniz.

AT komutlarının kullanımı, cihazın kullanım kılavuzunda veya üretici tarafından sağlanan teknik belgelerde belirtilir.

HC-05 modülü, seri haberleşme yoluyla AT (Attention) komutları ile programlanabilir. HC-05 AT komutları, modülün çalışma ayarlarını değiştirmek, cihaz adını ve pin kodunu ayarlamak, bağlantı hızını ayarlamak ve diğer işlevleri yapmak için kullanılabilir.

Aşağıda HC-05 modülü için kullanılabilen bazı temel AT komutları yer almaktadır:

  • AT: Modülün AT komutlarını kabul ettiğini teyit eder.
  • AT+NAME: Modülün cihaz adını ayarlar. Örneğin, AT+NAME=myDevice komutu ile cihaz adı “myDevice” olarak ayarlanabilir.
  • AT+PIN: Modülün PIN kodunu ayarlar. Örneğin, AT+PIN=1234 komutu ile PIN kodu “1234” olarak ayarlanabilir.
  • AT+BAUD: Modülün bağlantı hızını ayarlar. Örneğin, AT+BAUD4 komutu ile 9600 baud hızı ayarlanabilir.

Bu AT komutlarının yanı sıra, HC-05 modülü için başka komutlar da mevcuttur. Kullanılacak olan komutlar projenin gereksinimlerine göre değişebilir.

Flutter GetX – Routing – Get.to

GetX, Flutter için geliştirilmiş bir pakettir ve birçok farklı özelliği içerir. Routing özelliği de bunlardan biridir ve uygulamanızın farklı sayfalarına geçiş yapmanızı kolaylaştırır.

Routing özelliğini kullanmak için öncelikle GetX paketini projenize eklemeniz gerekiyor. Bunun için pubspec.yaml dosyasına aşağıdaki satırı ekleyin:

dependencies:
  get: ^4.3.8

Daha sonra, uygulamanızda kullanacağınız her sayfa için bir controller oluşturun. Controller, sayfanızın veri akışını yönetir ve sayfaya özgü işlevleri ve değişkenleri tutar.

//home_controller.dart

import 'package:get/get.dart';

class HomeController extends GetxController {
  // controller kodları buraya yazılacak
}

Her bir sayfada, controller’ı çağırmak ve sayfayı yönetmek için bir Widget oluşturmanız gerekiyor.

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:myapp/controllers/home_controller.dart';

class HomePage extends StatelessWidget {
  final HomeController _controller = Get.put(HomeController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home')),
      body: Center(
        child: Text('Welcome to the home page!'),
      ),
    );
  }
}

Bir sayfadan diğerine geçmek için, Get.to yöntemini kullanabilirsiniz.

Get.to(() => OtherPage());

Get.to yöntemi, aynı zamanda argümanları da alabilir. Bu argümanlar, hedef sayfaya veri geçmek için kullanılabilir.

Get.to(() => OtherPage(), arguments: {'name': 'John'});

Hedef sayfada bu verilere erişmek için, Get.arguments özelliğini kullanabilirsiniz.

class OtherPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final args = Get.arguments;
    return Scaffold(
      appBar: AppBar(title: Text('Other')),
      body: Center(
        child: Text('Hello, ${args['name']}!'),
      ),
    );
  }
}