Flutter’da En Sık Karşılaşılan 10 Hata ve Çözümleri: Yeni Başlayanlar İçin Basit Anlatım

Flutter öğrenmeye başladığım ilk günlerde, aldığım hata mesajları beni bir hayli zorladı. Ekranda beliren uyarılarla nasıl başa çıkacağımı, nereden başlayacağımı bilemediğim anlar oldu. Her yeni proje, yepyeni bir hata ve çözüm süreci getirdi. Şimdi geriye dönüp baktığımda, bu hatalar aslında öğrendiğim en değerli derslerdi. Bu yazıda, Flutter ile geliştirme yaparken en sık karşılaşılan hataları ve çözümlerini, bizzat kendi geliştirme süreçlerimden de esinlenerek paylaşmak istiyorum. Eğer sen de benim gibi Flutter’a yeni başlıyorsan, bu rehberin işini oldukça kolaylaştıracağını umuyorum.


1. “A RenderFlex overflowed by XX pixels”

Bu hata mesajını gördüğünde gözünde şöyle bir sahne canlandır: Uygulama ekranını o kadar çok şeyle doldurmuşsun ki, artık ekranın dışına taşmış ve ekranın kenarından dışarıya doğru “overflow” olmuş! Ekranın boyutu yetmiyor yani. Bu durum, mesela bir Row veya Column widget'ı içine çok fazla eleman koyduğunda olabilir. Sanki küçük bir kutuya fazla eşya doldurmuşsun gibi düşün.

Çözüm? Bu tür durumlarda yapabileceğin şeylerden biri SingleChildScrollView kullanarak sayfayı kaydırılabilir yapmak. Yani ekranın yetmediği yerde, sayfa yukarı aşağı kaydırılabilir olsun. Ya da o çok eşyalı alanı Expanded veya Flexible ile sarmalayarak, eşyanın (widget'ların) kendini ekranın boyutuna göre ayarlamasını sağlayabilirsin. Bir nevi "Ekranda ne kadar yer varsa o kadar yayıl, taşma" demek bu!

2. “setState() or markNeedsBuild() called during build”

Bu hata biraz daha teknik gibi gözükse de aslında çok basit: Widget’ın çizim işlemi (build) sırasında, ona “Hadi bakalım tekrar güncellen” diyorsun (setState çağırıyorsun). Ama build işlemi devam ederken bunu yapmaman lazım, çünkü Flutter daha widget'ı oluşturmayı bitirmedi. O sırada güncelle dersen, "Daha yapmadığım şeyi nasıl güncelleyeyim?" diye bir hata verir.

Çözüm? setState çağrını, build bittikten sonra yapmalısın. Yani biraz sabırlı olman gerekiyor! Çocuk bir resmi tamamlamadan, "Hadi yeniden boya" demek gibi bir şey bu.

3. “Null check operator used on a null value”

Bu çok yaygın bir hatadır ve Flutter’da sık sık karşılaşırsın. Kısaca şöyle düşünebilirsin: Elinde boş (null) bir bardak var ama sen bu bardaktan su içmeye çalışıyorsun. Flutter da sana diyor ki, “Bu bardak boş, içecek bir şey yok!” Yani bir değişkenin içinde hiç veri yokken, o veriyle işlem yapmaya çalışıyorsun.

Çözüm? Bu hatayı almamak için bardağın (değişkenin) boş olup olmadığını kontrol etmelisin. Eğer boşsa, bir şeyler ekleyip öyle devam etmelisin. Mesela ?? operatörüyle "Eğer boşsa şunu kullan" diyerek alternatif bir değer verebilirsin. Bu sayede, bardak boş olduğunda eline başka bir bardak alıp su içersin.

4. “Another exception was thrown: Scaffold.of() called with a context that does not contain a Scaffold”

Bu biraz kafayı karıştırabilir. Diyelim ki sayfada bir Scaffold kullanıyorsun. Bu, uygulama sayfalarının temel yapısıdır, içinde AppBar, Body falan olur. Ama sen bu Scaffold yapısının dışında bir yerden ona ulaşmaya çalışıyorsun. Mesela snackbar açmak istiyorsun ama yanlış yerden çağırıyorsun. Flutter da "Bak, bu sayfanın içinde o yapı yok, ona ulaşamazsın" diyor.

Çözüm? Bu durumda ya Scaffold'u doğru context'ten çağırmalısın ya da ScaffoldMessenger kullanarak işlemi gerçekleştirebilirsin. Kısacası, doğru kapıyı çalmak lazım!

5. “NoSuchMethodError: The method ‘X’ was called on null”

Bu hatada Flutter sana şöyle diyor: “Sen, olmayan bir şeye bir şey yapmaya çalışıyorsun.” Örneğin, bir objeye (mesela bir araba objesi) bir metod çağırıyorsun ama ortada o obje yok! Arabayı çalıştırmak istiyorsun ama aslında araba ortada yok ki çalışsın.

Çözüm? null olup olmadığını kontrol etmelisin. Araba yoksa, önce arabayı çağır, sonra işlemi yap. Eğer o an nullolabilir diyorsan, güvenli kontrolle (?.) işini garantiye al.

6. “type ‘Future<dynamic>’ is not a subtype of type ‘Widget’”

Şimdi bu hata biraz daha async işlemlerle ilgili. Bir fonksiyon yazmışsın ve bu fonksiyonun sonucu ileride gelecek (Future), ama sen bu sonucu hemen ekranda göstermek istiyorsun. Ama o sonuç daha hazır değil! Flutter da diyor ki, “Bak, sen bana bir widget vermen gerekiyordu ama Future döndürdün.”

Çözüm? Bu durumda FutureBuilder kullanarak, sonucu hazır olduğunda göster demen gerekiyor. Yani, gelecek bir mektubu postacı getirene kadar boşuna zarfı açmaya çalışmamak lazım!

7. “setState() called after dispose()”

Bu hata, bir widget artık işini bitirmiş ve bellekten temizlenmişken (disposeolmuşken), ona "Hadi güncellen" dediğinde çıkar. Ama o artık yok! Sen setState çağırıyorsun ama o widget orada değil.

Çözüm? Yapman gereken şey, widget halen var mı diye kontrol etmek. İşini bitirmiş bir widget üzerinde işlem yapmamaya dikkat etmelisin. Yani, işi bitmiş bir çalışandan rapor istemek gibi, artık o gitmiş!

8. “RenderBox was not laid out”

Bu hata, bir widget’ın ekran boyutunu hesaplayamadığı zaman karşına çıkar. Sanki bir mobilyayı odana yerleştireceksin ama önce odanın boyutlarını ölçmemişsin! Sonra mobilyayı yerleştiremediğin için hata alıyorsun.

Çözüm? Odanın (ekranın) boyutlarını bilmeden mobilya (widget) yerleştirmemelisin. Bunu çözmek için LayoutBuilderya da MediaQuerykullanarak ekran boyutunu öğrenip, ona göre widget'larını düzenleyebilirsin. Böylece her şey yerli yerine oturur.

9. “Expected a value of type ‘X’, but got one of type ‘Y’”

Bu hata aslında çok basit: Bir iş yerinde biri senden kırmızı dosya istemiş ama sen gidip mavi dosya vermişsin! Yani, Flutter bir tür bekliyor (mesela int), ama sen ona başka bir tür (mesela String) vermişsin.

Çözüm? Türleri doğru şekilde kullandığından emin olman lazım. Eğer bir fonksiyon int bekliyorsa, ona int vermelisin. Yanlış dosyayı vermemek için dikkatli olmak gerek.

10. “Too many positional arguments”

Bu da Flutter’ın “Çok fazla şey verdin, ben bu kadarını kaldıramam” dediği bir durum. Bir fonksiyona veya widget’a gereğinden fazla parametre gönderdiğinde bu hatayı alırsın. Mesela biri sana “Bir elma ver” diyor, sen ona beş elma veriyorsun!

Çözüm? Fonksiyonun veya widget’ın ihtiyaç duyduğu kadar parametre gönder. Yani, “Benden ne istendi, ne verdim?” diye bir kontrol yaparak hatayı çözebilirsin.

Flutter öğrenme süreci boyunca karşıma çıkan bu hatalar, başlarda biraz moral bozucu olsa da her birini çözdükçe projelerimde ne kadar ilerlediğimi fark ettim. Unutma, hata yapmak öğrenmenin bir parçası ve her hata aslında seni daha iyi bir geliştirici yapıyor. Eğer sen de bu yazıdaki hatalarla karşılaşırsan, panik yapma! Hataları anlamak ve çözmek, seni Flutter’da daha da yetkin hale getirecek. Kendi geliştirme sürecimden esinlenerek yazdığım bu rehberin sana yardımcı olmasını umuyorum. Başarılar ve unutma, her hata bir adım daha ileriye gitmen demek!

Okuduğun için teşekkürler.

Selin.

Flutter vs. Unity: Which is the Best Choice for Game Development?

 

When it comes to game development, choosing the right platform is crucial. Both Flutter and Unity are popular choices, but they have different strengths and are suited for different types of projects. In this article, we’ll explore the pros and cons of each, helping you make the best choice for your next game development project.

What is Flutter and Unity?

Flutter is a popular framework developed by Google. Primarily used for mobile app development, it also supports web and desktop applications with a single codebase. Flutter shines when it comes to building beautiful, responsive user interfaces quickly.

Unity, on the other hand, is a game engine renowned for its power in 2D and 3D game development. It’s widely used across the gaming industry and offers advanced tools for graphics, physics, and animation, making it the go-to platform for high-performance games.

Can You Develop Games with Flutter?

Yes, Flutter can be used for simple games. It’s great for developers who want to build games like puzzle gamesquiz apps, or simple arcade games. While it doesn’t offer the extensive graphics capabilities of Unity, you can still create functional games, especially 2D ones, using packages like Flame for Flutter.

For beginner developers, Flutter’s ease of use and ability to quickly build cross-platform apps is a major advantage. You can integrate basic game mechanics while leveraging Flutter’s superior UI capabilities.

Why is Unity Stronger for Game Development?

Unity is a powerhouse when it comes to developing more complex games, especially 3D ones. With Unity’s physics engine, you can build intricate game mechanics, and its graphics rendering makes it perfect for high-performance, visually stunning games. Popular games like PUBG Mobile and Hearthstone were built using Unity, proving its capability for large-scale projects.

Unity offers a wide range of tools for animating characters, handling lighting, and rendering environments, which makes it superior to Flutter for advanced game development.

When to Choose Flutter?

If your game idea is simple, or if it’s part of a larger application, Flutter could be the right choice. For example, if you’re building an educational app for kids with mini-games or a quiz app, Flutter can handle this with ease. Flutter’s biggest strength lies in its ability to create cross-platform apps quickly, so if your game is not graphically intensive, it’s an excellent solution.

Flutter is also ideal if you plan to expand your project into web or desktop applications without rewriting the entire codebase.

When to Choose Unity?

If your goal is to develop a 3D game or a highly immersive 2D game with complex mechanics, Unity is the better choice. Unity’s robust development tools and community support will help you create professional-grade games. If you’re aiming for console or PC games, Unity’s scalability makes it a perfect fit for those platforms as well.

Unity is the right choice for developers who are serious about game development and need an engine that can handle intensive graphics and physics simulations.

Conclusion

Ultimately, your choice between Flutter and Unity depends on your project’s complexity and your goals. For simple 2D games and rapid app development, Flutter is a fantastic option. However, if you’re building a complex game that requires high-performance graphics and detailed mechanics, Unity should be your go-to platform.

Both platforms have their strengths, and learning to use both can give you the flexibility to choose the right tool for any project.

Thank you for your reading, I hope my article is useful for you.

Selin.