Sıfırdan İleri Seviye Flutter Projesi – 2

Aşağıdaki size kodu verip daha sonra ise adım adım açıklayacağım. Ekran çıktıları vererek ise çalışmayı görselleştireceğim.

import 'dart:async';
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart';
import 'package:harpia_project/utils/Utils.dart';
import 'package:harpia_project/views/loginscreen.dart';
import 'package:harpia_project/views/network/network_error.dart';
import 'package:harpia_project/utils/MySharedPreferences.dart';
import 'package:harpia_project/views/preview.dart';
import 'package:get_storage/get_storage.dart';

ThemeMode appTheme = ThemeMode.dark; // Varsayılan tema

void main() async {
WidgetsFlutterBinding.ensureInitialized();
await GetStorage.init();
await EasyLocalization.ensureInitialized();

SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(statusBarColor: Colors.transparent));
runApp(
EasyLocalization(
supportedLocales: const [
Locale('en'),
Locale('tr'),
Locale('fr'),
Locale('zh'),
],
path: 'assets/translations',
fallbackLocale: const Locale('en'),
child: MyApp()),
);
}

class MyApp extends StatelessWidget {
MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return ScreenUtilInit(
designSize: const Size(300, 800),
builder: (context, child) => MaterialApp(
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
debugShowCheckedModeBanner: false,
home: SplashScreen(),
),
);
}
}

class SplashScreen extends StatefulWidget {
const SplashScreen({Key? key}) : super(key: key);

@override
SplashScreenState createState() => SplashScreenState();
}

class SplashScreenState extends State<SplashScreen> {
Color selectedBackgroundColor = Colors.white; // Seçilen arka plan rengi

@override
void initState() {
super.initState();
_checkInternetAndNavigate();
loadBackgroundColor();
}

@override
Widget build(BuildContext context) {
MySharedPreferences.setLocalName(Platform.localeName);

// Enable immersive mode
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);
return Scaffold(
backgroundColor: selectedBackgroundColor,
body: Stack(
children: [
// First LinearLayout with background image
Container(
height: 200,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/header_login.png'),
fit: BoxFit.fill,
),
),
),
// Centered Logo ImageView
Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
'assets/images/dikeycizgili.svg',
width: 100,
height: 100,
),
// TextView with "step_by_step" text
const SizedBox(
height: 25,
),
Padding(
padding: EdgeInsets.symmetric(horizontal: 3.sp),
child: Text(
"step_by_step".tr(),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 18.sp,
color: Colors.black,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.bold,
),
),
),
const SizedBox(
height: 25,
),
const CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(Colors.orange),
),
],
),
),
// Second LinearLayout with background image (rotated)
Positioned(
bottom: 0,
left: 0,
right: 0,
child: Transform.rotate(
angle: 3.14159, // Rotate 180 degrees (Pi approximation)
child: Container(
height: 200,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/header_login.png'),
fit: BoxFit.fill,
),
),
),
),
),
// Copyright TextView - horizontally centered
Align(
alignment: Alignment.bottomCenter,
child: Container(
padding: const EdgeInsets.only(bottom: 40.0),
child: Text(
"${'hakan_aydin'.tr()} ${DateTime.now().year}",
style: const TextStyle(
fontSize: 20,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.bold,
),
),
),
),
],
),
);
}

Future<void> _checkInternetAndNavigate() async {
bool hasInternet = await checkInternetConnection();
if (hasInternet) {
bool isFirstLaunch = await MySharedPreferences.isFirstLaunch();
if (isFirstLaunch) {
_navigateToPreviewPage();
} else {
_navigateToLoginPage();
}
} else {
_navigateToNetworkErrorPage();
}
}

void _navigateToPreviewPage() async {
Timer(
const Duration(seconds: 3),
() {
MySharedPreferences.setFirstLaunch(false);
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const PreviewPage()),
);
},
);
}

void _navigateToLoginPage() {
Future.delayed(const Duration(seconds: 2)).then((value) {
Navigator.pushReplacement(
context, CupertinoPageRoute(builder: (_) => const LoginScreen()));
});
}

void _navigateToNetworkErrorPage() {
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => NetworkErrorPage()),
);
}

void loadBackgroundColor() async {
int colorValue = await MySharedPreferences.getBackgroundColor();
setState(() {
selectedBackgroundColor = Color(colorValue);
});
}
}

İlk olarak, gerekli kütüphaneler ve paketler import ifadeleriyle projeye dahil edilir. Bu paketler, uygulamanın çalışması için gerekli olan işlevleri sağlar. ThemeMode adında bir değişken tanımlanır ve varsayılan olarak ThemeMode.dark değeri atanır. Bu değişken, uygulamanın tema modunu temsil eder.

main fonksiyonu oluşturulur. Bu fonksiyon, uygulama başlatıldığında çalıştırılacak ilk fonksiyondur.

WidgetsFlutterBinding.ensureInitialized() çağrısı ile Flutter bağlamı başlatılır. GetStorage.init() ve EasyLocalization.ensureInitialized() fonksiyonları çağrılarak, veri depolama ve çoklu dil desteği için gerekli olan paketlerin başlatılması sağlanır.

SystemChrome.setSystemUIOverlayStyle() çağrısı ile sistem arayüzü overlay stili ayarlanır. Bu durumda, durum çubuğunun şeffaf olması sağlanır. runApp() fonksiyonu çağrılarak uygulama başlatılır. Bu fonksiyon, uygulamanın kök widget’ını alır ve çalıştırır. EasyLocalization widget’ı, uygulamanın çoklu dil desteğini sağlar.

    EasyLocalization(
supportedLocales: const [
Locale('en'),
Locale('tr'),
Locale('fr'),
Locale('zh'),
],
path: 'assets/translations',
fallbackLocale: const Locale('en'),
child: MyApp()),

Yukarıdaki resimde uygulamanın dil desteği için gerekli olan json dosyaları gösterilmektedir. Burada

tr.json için;

"login_successful": "Giriş Başarılı",

en.json için;
"login_successful": "Login Successful",

fr.json için;
"login_successful": "Connexion réussie",

zh.json için ise;
"login_successful": "登录成功",

MyApp adında bir sınıf tanımlanır ve StatelessWidget sınıfından türetilir. Bu sınıf, uygulamanın ana widget’ını temsil eder. build metodu, MyApp sınıfının bir parçası olarak tanımlanır. Bu metot, widget’ın görüntüsünü oluşturur ve döndürür. ScreenUtilInit widget’ı, ekran boyutlarını ve düzenini ayarlar. Bu, farklı ekran boyutlarında ve yoğunluklarında tutarlı bir görünüm sağlar.

MaterialApp widget’ı, Flutter uygulamasının temel yapılandırmasını sağlar. localizationsDelegates, supportedLocales ve locale parametreleri, uygulamanın dil desteğini yapılandırır. debugShowCheckedModeBanner parametresi, hata ayıklama bandının görüntülenip görüntülenmeyeceğini belirler.SplashScreen widget’ı, uygulamanın başlangıç ekranını temsil eder. StatefulWidget sınıfından türetilir. initState metodu, SplashScreenState sınıfının bir parçası olarak tanımlanır ve widget’ın durumunu başlatır. Bu metot, widget oluşturulduğunda bir kez çağrılır. build metodu, SplashScreenState sınıfının bir parçası olarak tanımlanır. Bu metot, widget’ın görüntüsünü oluşturur ve döndürür. MySharedPreferences.setLocalName() çağrısı ile yerel dil ayarları depolanır. SystemChrome.setEnabledSystemUIMode() çağrısı ile tam ekran modu etkinleştirilir. Scaffold widget’ı, bir materyal tasarım yapısını temsil eder. backgroundColor özelliği, widget’ın arka plan rengini belirler.

  Future<void> _checkInternetAndNavigate() async {
bool hasInternet = await checkInternetConnection();
if (hasInternet) {
bool isFirstLaunch = await MySharedPreferences.isFirstLaunch();
if (isFirstLaunch) {
_navigateToPreviewPage();
} else {
_navigateToLoginPage();
}
} else {
_navigateToNetworkErrorPage();
}
}
  void _navigateToNetworkErrorPage() {
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => NetworkErrorPage()),
);
}

Bu kod bloğu, _navigateToNetworkErrorPage() adında bir fonksiyon tanımlar. Bu fonksiyon, ağ hatası sayfasına yönlendirme işlemini gerçekleştirir. İşlevi şu adımları takip eder. Navigator.pushReplacement() fonksiyonu çağrılır. Bu fonksiyon, yeni bir sayfaya geçişi sağlar ve önceki sayfayı bellekten kaldırır. context parametresi, mevcut widgetin işlevsel bağlamını temsil eder. Bu parametre, yönlendirme işlemi için gereklidir. MaterialPageRoute widget’ı, sayfa geçişini sağlar ve hedef sayfanın oluşturulmasını belirtir. builder parametresi, hedef sayfanın nasıl oluşturulacağını belirten bir anonim fonksiyonu alır. Bu durumda, NetworkErrorPage sayfası oluşturulur. Yönlendirme işlemi tamamlanır ve kullanıcı ağ hatası sayfasına yönlendirilir.

network_error.dart dosyası:
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart';

import '../../core/ResponsiveDesign.dart';
import '../loginscreen.dart';

class NetworkErrorPage extends StatefulWidget {
@override
State<NetworkErrorPage> createState() => NetworkErrorPageState();
}

class NetworkErrorPageState extends State<NetworkErrorPage> {
bool isOnline = false;
bool isButtonEnabled = true;
bool isLoading = false; // İlerleme çemberinin görünürlüğü

@override
void initState() {
super.initState();
checkInternetConnection();
}

@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
backgroundColor: Colors.white,
body: Stack(
children: [
// First LinearLayout with background image
Container(
height: 200,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/header_login.png'),
fit: BoxFit.fill,
),
),
),
// Centered Logo ImageView
Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
isOnline
? 'assets/images/network_yes.svg'
: 'assets/images/network_no.svg',
width: 100,
height: 100,
),
// TextView with "step_by_step" text
const SizedBox(
height: 25,
),
Padding(
padding: EdgeInsets.symmetric(horizontal: 3.sp),
child: Column(
children: [
Text(
isOnline ? "yes".tr() : "oh_no".tr(),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 14.sp,
color: Colors.black,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.bold,
),
),
Text(
isOnline
? 'internet_problem_control'.tr()
: "no_internet_connection".tr(),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 14.sp,
color: Colors.black,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.bold,
),
),
Text(
isOnline ? "" : "or_try_again".tr(),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 18.sp,
color: Colors.black,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: 20.h),
SizedBox(
width: 180.w,
height: 50.h,
child: ElevatedButton(
onPressed: () {
showLoadingDialog(
context); // İlerleme çemberi göster
retryProcess(context);
},
style: ButtonStyle(
shape: MaterialStateProperty.all<
RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(18.sp),
side: BorderSide(color: Colors.pink))),
backgroundColor: MaterialStateColor.resolveWith(
(states) => Colors.pink),
foregroundColor: MaterialStateColor.resolveWith(
(states) => Colors.white)),
child: Text('retry'.tr()),
),
),
],
),
),
const SizedBox(
height: 25,
),
],
),
),
// Second LinearLayout with background image (rotated)
Positioned(
bottom: 0,
left: 0,
right: 0,
child: Transform.rotate(
angle: 3.14159, // Rotate 180 degrees (Pi approximation)
child: Container(
height: 200,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/header_login.png'),
fit: BoxFit.fill,
),
),
),
),
),
// Copyright TextView - horizontally centered
],
),
),
);
}

Future<void> retryProcess(BuildContext context) async {
if (!isButtonEnabled) return;

setState(() {
isButtonEnabled = false;
isLoading = true; // İlerleme çemberini göster
});

bool isOnlineNow = await checkInternetConnection();

if (isOnlineNow) {
setState(() {
isOnline = true;
});

Future.delayed(const Duration(seconds: 2), () {
Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (context) => const LoginScreen(),
),
);
});
} else {
// İnternet bağlantısı yoksa işlem yapma
setState(() {
isButtonEnabled = true;
isLoading = false; // İlerleme çemberini gizle
});
}
}

Future<void> showLoadingDialog(BuildContext context) async {
showDialog(
context: context,
builder: (BuildContext context) {
return const AlertDialog(
backgroundColor: Colors.white,
shadowColor: Colors.white,
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
CircularProgressIndicator(
backgroundColor: Colors.white,
),
SizedBox(height: 10),
Text('Loading...'),
],
),
);
},
);

await Future.delayed(Duration(seconds: 2)); // 2 saniye bekle

Navigator.of(context).pop(); // AlertDialog'ı kapat
}

Future<bool> checkInternetConnection() async {
var connectivityResult = await (Connectivity().checkConnectivity());
return connectivityResult != ConnectivityResult.none;
}
}

Bu kod, Flutter kullanılarak yazılmış NetworkErrorPage adlı bir sayfayı tanımlar. Bu sayfa, ağ hatası durumunda görüntülenen bir arayüzü içerir. İşlevleri aşağıdaki gibi açıklayabiliriz:

  1. NetworkErrorPage sınıfı, StatefulWidget sınıfını genişleterek bir durum sınıfı oluşturur. Bu durum sınıfı, sayfanın dinamik durumunu yönetir.
  2. isOnline, isButtonEnabled ve isLoading gibi değişkenler, sayfanın durumu için kullanılır. Örneğin, isOnline değişkeni, internet bağlantısı durumunu temsil eder.
  3. initState() metodu, sayfa oluşturulduğunda çağrılır ve checkInternetConnection() fonksiyonunu çağırarak internet bağlantısı durumunu kontrol eder.
  4. build() metodu, sayfanın arayüzünü oluşturur ve döndürür. Bu metot içinde SafeArea ve Scaffold widget’ları kullanılır. Arka plan rengi beyaz olan bir Stack widget’ı içinde diğer widget’lar yer alır.
  5. SvgPicture.asset() widget’ı, SVG formatında bir resmi görüntüler. isOnline durumuna bağlı olarak farklı resimler gösterilir.
  6. Metin widget’ları, dil desteği eklemek için easy_localization paketinden yararlanır. Metinler, tr() metodunu kullanarak yerelleştirilir.
  7. ElevatedButton widget’ı, yeniden deneme işlemi için bir düğmeyi temsil eder. onPressed özelliği, düğmeye basıldığında showLoadingDialog() ve retryProcess() fonksiyonlarını çağırır.
  8. retryProcess() fonksiyonu, yeniden deneme işlemini gerçekleştirir. İnternet bağlantısı kontrol edilir ve duruma bağlı olarak ilgili işlemler yapılır. Örneğin, internet bağlantısı varsa LoginScreen sayfasına yönlendirilir.
  9. showLoadingDialog() fonksiyonu, yükleniyor iletişim kutusunu (AlertDialog) gösterir. CircularProgressIndicator widget’ı, ilerleme çemberini temsil eder. Belirli bir süre bekledikten sonra iletişim kutusu kapatılır.
  10. checkInternetConnection() fonksiyonu, internet bağlantısını kontrol eder. Connectivity sınıfı kullanılarak bağlantı durumu kontrol edilir.
isOnline
? 'assets/images/network_yes.svg'
: 'assets/images/network_no.svg',

Bu kod parçası, bir koşul ifadesi kullanarak isOnline değişkeninin durumuna bağlı olarak farklı SVG resimlerinin yolunu belirler. 'assets/images/network_yes.svg' ve 'assets/images/network_no.svg', SVG formatında bulunan iki farklı resmin dosya yolunu temsil eder. Bu resimler, internet bağlantısı durumuna göre farklı ikonları veya görselleri temsil edebilir. Koşul ifadesi, isOnline değişkeninin değerini kontrol eder. Eğer isOnline true ise, yani internet bağlantısı varsa, 'assets/images/network_yes.svg' yolunu temsil eden resim kullanılır. Eğer isOnline false ise, yani internet bağlantısı yoksa, 'assets/images/network_no.svg' yolunu temsil eden resim kullanılır. Bu yöntem sayesinde, internet bağlantısı durumuna göre farklı resimlerin görüntülenmesi sağlanır.

  Future<void> showLoadingDialog(BuildContext context) async {
showDialog(
context: context,
builder: (BuildContext context) {
return const AlertDialog(
backgroundColor: Colors.white,
shadowColor: Colors.white,
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
CircularProgressIndicator(
backgroundColor: Colors.white,
),
SizedBox(height: 10),
Text('Loading...'),
],
),
);
},
);

await Future.delayed(Duration(seconds: 2)); // 2 saniye bekle

Navigator.of(context).pop(); // AlertDialog'ı kapat
}

Bu kod, showLoadingDialog adlı bir asenkron fonksiyonu tanımlar. Bu fonksiyon, bir yükleniyor iletişim kutusu (AlertDialog) gösterir, belirli bir süre bekler ve sonra iletişim kutusunu kapatır. İşlevin ana gövdesi showDialog fonksiyonunu kullanır. showDialog fonksiyonu, context parametresiyle birlikte bir builder işlevi alır. builder işlevi, iletişim kutusunun içeriğini döndürür. builder işlevinde, AlertDialog widget’ı kullanılır. AlertDialog widget’ının backgroundColor özelliği beyaz olarak ayarlanır ve gölgelendirme için shadowColor özelliği de beyaz olarak ayarlanır. İçerik olarak, bir sütun (Column) widget’ı kullanılır. Bu sütunun içinde, CircularProgressIndicator widget’ı yüklenme çemberini göstermek için kullanılır. backgroundColor özelliği de beyaz olarak ayarlanır. Ardından, SizedBox widget’ı kullanılarak bir boşluk eklenir ve altında bir metin (Text) widget’ı görüntülenir. Bu metin, “Loading…” olarak ayarlanır. showDialog fonksiyonu çağrıldığında, iletişim kutusu görüntülenir. Ardından, await Future.delayed(Duration(seconds: 2)) ifadesi kullanılarak 2 saniye beklenir. Bu, iletişim kutusunun belirli bir süre görüntülenmesini sağlar. Son olarak, Navigator.of(context).pop() ifadesi kullanılarak iletişim kutusu kapatılır. pop() fonksiyonu, en üstteki arayüz elemanını (burada iletişim kutusunu) kapatır ve altındaki elemanlara geri döner. Bu şekilde, showLoadingDialog fonksiyonu kullanılarak bir yükleniyor iletişim kutusu gösterilebilir ve belirli bir süre sonra otomatik olarak kapatılabilir.

Sıfırdan İleri Seviye Flutter Projesi – 1

Merhaba arkadaşlar, sizlerle sıfırdan ileri seviye flutter eğitimine örnek teşkil edecek bir proje yapacağım. Her fonksiyon, dosya adım adım anlatılarak güzel bir eğitim serisi olacaktır.

pubspec.yml, Dart programlama dilini kullanan projelerde kullanılan bir dosyadır. Bu dosya, bir Dart paketinin bağımlılıklarını ve proje yapılandırmasını tanımlamak için kullanılır. Dart dilinin paket yöneticisi olan Pub, pubspec.yml dosyasını kullanarak proje bağımlılıklarını yönetir.

pubspec.yml dosyası, proje kök dizininde bulunur ve YAML (YAML Ain’t Markup Language) formatında yazılır. Bu dosya, projenin adını, sürümünü, bağımlılıklarını, kaynak dosyalarını ve diğer yapılandırma ayarlarını içerir.

name: harpia_project
description: "A new Flutter project."
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 1.0.0+1

environment:
sdk: '>=2.18.6 <3.13.1'

# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
# consider running `flutter pub upgrade --major-versions`. Alternatively,
# dependencies can be manually updated by changing the version numbers below to
# the latest version available on pub.dev. To see which dependencies have newer
# versions available, run `flutter pub outdated`.
dependencies:
flutter:
sdk: flutter

expansion_tile_card: ^3.0.0
shared_preferences: ^2.2.1
font_awesome_flutter: ^10.5.0
cupertino_icons: ^1.0.2
flutter_svg: ^2.0.7
google_fonts: ^6.1.0
dio: ^5.3.2
get_storage: ^2.0.3
package_info_plus: ^4.1.0
dropdown_button2: ^2.3.9
carousel_slider: ^4.2.1
flutter_randomcolor: ^1.0.14
provider: ^6.0.5
crypto: ^3.0.1
smooth_page_indicator: ^1.0.0+2
animate_do : any
connectivity_plus: ^2.3.0
permission_handler: ^10.2.0
syncfusion_flutter_charts: ^23.1.41
flutter_colorpicker: ^1.0.3
device_info_plus: ^9.1.0
flutter_blue: ^0.8.0
flutter_pw_validator: ^1.4.2
lottie: ^2.6.0
webview_flutter: ^2.0.14
numberpicker: ^2.1.2
fluttertoast: ^8.2.2
screenshot: ^2.1.0
vibration: ^1.8.3

flutter_localizations:
sdk: flutter
intl: ^0.18.1
flutter_screenutil: ^5.9.0
easy_localization: ^3.0.3

# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.

dev_dependencies:
flutter_test:
sdk: flutter

# The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is
# activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^2.0.0

# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec

# The following section is specific to Flutter packages.
flutter:

# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true

assets:
- assets/images/
- assets/translations/
- assets/images/countries/
- assets/images/categories/
- assets/file_tr_terms.html
- assets/file_tr_policy.html
- assets/file_en_terms.html
- assets/file_en_policy.html
- assets/file_fr_terms.html
- assets/file_fr_policy.html
- assets/file_zh_terms.html
- assets/file_zh_policy.html

fonts:
- family: "Roboto"
fonts:
- asset: "assets/fonts/roboto_bold.ttf"
# To add assets to your application, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg

# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware

# For details regarding adding assets from package dependencies, see
# https://flutter.dev/assets-and-images/#from-packages

# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages

pubspec.yaml dosyasının daha detaylı bir açıklaması:

  • name: Projenin adını belirtir. Bu, benzersiz bir isim olmalıdır ve projenizi diğer projelerden ayırmak için kullanılır. Örneğin, harpia_project olarak adlandırılmıştır.
  • description: Projenin açıklamasını içerir. Bu, projenin amacını veya işlevselliğini kısaca belirtmek için kullanılır. Örneğin, “A new Flutter project.” olarak belirtilmiştir.
  • publish_to: Bu satır, paketin yanlışlıkla flutter pub publish kullanılarak pub.dev’e gönderilmesini önler. Bu örnekte “none” olarak ayarlanmıştır, yani paket pub.dev’e gönderilmeyecektir.
  • version: Uygulamanın sürüm numarasını ve yapı numarasını belirtir. Sürüm numarası üç nokta ile ayrılmış üç sayıdan oluşur (örneğin 1.2.3). Yapı numarası ise sürüm numarasından sonra artı işareti (+) ile ayrılan bir sayıdır. Örneğin, “1.0.0+1” olarak belirtilmiştir.
  • environment: Projede kullanılan Flutter SDK sürümünü belirtir. Bu bölümde, projenin minimum ve maksimum kullanılabilir Flutter SDK sürümleri belirtilir. Örneğin, sdk: '>=2.18.6 <3.13.1' olarak belirtilmiştir, yani en az 2.18.6 sürümüne sahip olan ve 3.13.1 sürümünden önceki herhangi bir sürümü kullanan Flutter SDK’ya izin verilir.
  • dependencies: Projede kullanılan paketlerin ve bağımlılıkların listesini içerir. Her bir bağımlılık, paketin adını ve versiyonunu belirtir. Örneğin, flutter paketi Flutter SDK’sını, shared_preferences paketi cihazda kalıcı veri depolamak için kullanılır, google_fonts paketi özel yazı tiplerini kullanmak için kullanılır. Ayrıca, bazı paketlerin belirli bir versiyon aralığına (^ veya >=) sahip olduğu görülmektedir.
  • dev_dependencies: Geliştirme sırasında kullanılan paketlerin ve bağımlılıkların listesini içerir. Bu bağımlılıklar, genellikle test amaçlı veya geliştirme sırasında kullanılan araçlar ve yardımcı paketlerdir. Örneğin, flutter_test paketi, Flutter projenizin birim testlerini çalıştırmak için kullanılır.
  • flutter: Flutter özelinde yapılandırmaları içerir. Bu bölümde, uygulamanın kullanacağı asset’ler (assets bölümü) ve özel fontlar (fonts bölümü) tanımlanır. Asset’ler, uygulamanın kullanacağı görüntüler, videolar, ses dosyaları ve diğer kaynak dosyalarını içerir. Özel fontlar ise uygulamada kullanılacak özel yazı tiplerini tanımlar. Ayrıca, uses-material-design özelliği de kullanılarak Material Design ikonlarının projede kullanılacağı belirtilir.

Bu bölüm, projede kullanılacak harici paketleri ve bu paketlerin sürüm numaralarını içerir. İşte dependencies bölümündeki bazı yaygın kullanılan paketlerin açıklamaları:

  • flutter: Bu, Flutter SDK’nın kendisini temsil eder. Projenin Flutter SDK’ya bağımlı olduğunu belirtmek için kullanılır.
  • cupertino_icons: Bu paket, iOS ikon setini kullanmanızı sağlar. Flutter uygulamalarında iOS stili ikonlar kullanmak istediğinizde genellikle bu paketi eklersiniz.
  • http: Bu paket, HTTP isteklerini yapmak ve yanıtları işlemek için kullanılır. Web API’larıyla iletişim kurmak veya verileri sunucudan almak gibi HTTP istemcisi işlevleri gerçekleştirmek için kullanılabilir.
  • shared_preferences: Bu paket, basit veri depolama işlemleri için kullanılır. Örneğin, uygulamada kullanıcı tercihlerini, oturum durumunu veya küçük veri parçacıklarını depolamak için kullanılabilir.
  • google_fonts: Bu paket, Google Fonts hizmetinden yazı tiplerini kullanmanızı sağlar. Farklı yazı tiplerini uygulamanıza eklemek ve kullanmak için kullanılabilirsiniz.
  • provider: Bu paket, Flutter uygulamalarında durum yönetimi için kullanılan birinci sınıf bir pakettir. Veri akışını sağlamak ve uygulamanızın farklı widget’lar arasında veri paylaşmasını kolaylaştırmak için kullanılabilir.
  • expansion_tile_card, Flutter’da kullanılabilen bir pakettir. Bu paket, genişletilebilir bir kart bileşeni sağlar. expansion_tile_card, başlık ve içerik olmak üzere iki kısımdan oluşan bir kartı temsil eder. Başlık kısmı genellikle kullanıcıya bir özet veya başlık gösterirken, içerik kısmı daha fazla ayrıntıyı veya gizli bilgileri görüntüler. expansion_tile_card, genellikle bir liste içinde kullanılır ve kullanıcılar başlığı tıklayarak içeriği genişletebilir veya daraltabilir. Başlık tıklandığında, kartın boyutu otomatik olarak ayarlanır ve içerik görüntülenir veya gizlenir. Bu paket, kullanıcı arayüzünde genişletilebilir veya daraltılabilir bir kart yapısı oluşturmak için kullanışlıdır. Özellikle, daha fazla ayrıntıyı kullanıcılara sunmak veya gizli içeriği göstermek için kullanılabilir.
  • font_awesome_flutter, Flutter uygulamalarında popüler Font Awesome ikonlarını kullanmak için kullanılan bir pakettir. Font Awesome, çeşitli ikonları içeren bir ikon kütüphanesidir ve uygulama geliştiricilerine çeşitli ikonları kolayca kullanma imkanı sağlar. font_awesome_flutter paketi, Font Awesome ikonlarını Flutter uygulamalarına entegre etmek için özel olarak oluşturulmuştur. Bu paket, Font Awesome ikonlarının Flutter ikonlarına dönüştürülmesini sağlar ve bu ikonları kullanmanızı kolaylaştırır.
  • flutter_svg, Flutter uygulamalarında SVG (Scalable Vector Graphics) dosyalarını kullanmak için kullanılan bir pakettir. SVG, vektör tabanlı grafikleri tanımlamak için kullanılan bir XML tabanlı dosya formatıdır. flutter_svg paketi, SVG dosyalarını Flutter uygulamalarında görüntülemek, özelleştirmek ve etkileşimli hale getirmek için kullanılabilir. flutter_svg paketi, SVG dosyalarını Flutter’ın widget ağacına dönüştürür ve bu SVG dosyalarını Flutter uygulamalarında kullanılabilen standart Flutter widget’ları olarak görüntüler.
  • dio, Flutter uygulamalarında HTTP istekleri yapmak için kullanılan popüler bir pakettir. Dio, hızlı, esnek ve güçlü bir HTTP istemci kütüphanesidir ve çeşitli platformlarda (iOS, Android, web vb.) kullanılabilir. dio, asenkron HTTP istekleri yapmayı sağlar ve aynı zamanda dosya indirme, yükleme, ilerleme takibi, oturum yönetimi, ara kesme, hata işleme ve diğer çeşitli özellikleri destekler. Ayrıca, JSON dönüşümü yapma, istekleri iptal etme ve zaman aşımı ayarları gibi kullanışlı işlevlere de sahiptir.
  • get_storage, Flutter uygulamalarında basit ve hızlı bir şekilde yerel (local) veri depolama işlemleri yapmak için kullanılan bir pakettir. Bu paket, ana bellek veya disk üzerinde veri depolamak için kullanılabilir ve çeşitli veri tiplerini destekler. get_storage, SQLite veya SharedPreferences gibi diğer veritabanı veya veri depolama yöntemlerine kıyasla daha hafif bir çözümdür. Hızlı ve basit bir API sağlar ve verileri key-value (anahtar-değer) çiftleri olarak depolar.
  • package_info_plus, Flutter uygulamalarında cihazın paket bilgilerine erişmek için kullanılan bir pakettir. Bu paket, uygulamanın paket adı, sürümü, başlatma ikonu gibi bilgilere erişmek için kullanılır. Ayrıca, uygulamanın kurulu olduğu platforma özgü bilgilere de erişim sağlar. package_info_plus paketi, Flutter uygulamasının pubspec.yaml dosyasında tanımlanan version, name ve description gibi bilgileri alır ve bu bilgilere programatik olarak erişim sağlar. Ayrıca, uygulamanın çalıştığı platforma özgü bilgilere de erişim imkanı sunar.
  • carousel_slider, Flutter’da kullanılan bir pakettir ve kullanıcıya bir dizi öğeyi yatay veya dikey bir kaydırma (carousel) şeklinde sunmak için kullanılır. Bu paket, görüntü, metin veya herhangi bir özelleştirilmiş widget gibi öğeleri bir dizi halinde göstermek için kullanılabilir. carousel_slider paketi, kullanıcıya kaydırılabilir bir slayt gösterisi sunmak için kullanışlı bir API sağlar. Özel geçiş efektleri, otomatik oynatma, sayfalama noktaları ve diğer özelleştirme seçenekleri gibi çeşitli özellikleri destekler.
  • crypto, Flutter ve diğer birçok programlama dilinde kullanılan bir kriptografi kütüphanesidir. Kriptografi, verilerin güvenliği, gizliliği ve bütünlüğü ile ilgilenen bir alan olarak tanımlanabilir. Kriptografi, şifreleme, şifre çözme, dijital imzalama, kimlik doğrulama ve güvenli iletişim gibi işlemleri gerçekleştirmek için kullanılır. crypto kütüphanesi, Flutter uygulamalarında kriptografik işlemler gerçekleştirmek için kullanılabilir. Bu kütüphane, çeşitli şifreleme algoritmalarını, karma işlevlerini (hash functions), HMAC’leri (Hash-based Message Authentication Code), dijital imzaları ve diğer kriptografik araçları sağlar.
  • smooth_page_indicator, Flutter’da kullanılan bir pakettir ve sayfalar arasında gezinme işaretçileri oluşturmayı sağlar. Bu paket, kullanıcıya kaydırılabilir bir sayfa görünümünde hangi sayfada olduğunu göstermek için kullanılan animasyonlu ve özelleştirilebilir göstergeler sunar.
  • animate_do, Flutter’da kullanılan bir pakettir ve animasyonlu efektler eklemek için kullanılır. Bu paket, UI öğelerine giriş, çıkış veya diğer animasyonlu geçiş efektlerini uygulamak için kolay bir yol sağlar.
  • connectivity_plus, Flutter’da kullanılan bir pakettir ve cihazın ağ bağlantısının durumunu izlemek ve ağ değişikliklerini algılamak için kullanılır. Bu paket, internet bağlantısıyla ilgili bilgileri almak ve ağdurumu değişikliklerine tepki vermek için kullanışlı bir API sağlar.
  • permission_handler, Flutter’da kullanılan bir pakettir ve kullanıcının izinlerini yönetmek için kullanılır. Bu paket, uygulamanın belirli işlevlerini kullanırken kullanıcılardan izin talep etmek ve izin durumunu kontrol etmek için kullanışlı bir API sağlar.
  • syncfusion_flutter_charts, Flutter’da kullanılan bir pakettir ve etkileyici ve interaktif grafikler oluşturmak için kullanılır. Bu paket, çeşitli grafik türlerini destekleyerek verileri görsel olarak temsil etmek için bir dizi özelleştirilebilir grafik bileşeni sağlar.
  • flutter_colorpicker, Flutter’da kullanılan bir pakettir ve kullanıcının renk seçimini kolaylaştırmak için kullanılır. Bu paket, renk seçici bileşenlerini içerir ve kullanıcının istediği renkleri seçmesine ve ayarlamasına olanak tanır.
  • device_info_plus, Flutter’da kullanılan bir pakettir ve cihazın bilgilerine erişmek için kullanılır. Bu paket, işletim sistemi, cihaz modeli, cihaz adı, cihaz ID’si ve diğer cihaz özellikleri gibi bilgilere erişmek için bir dizi API sağlar.
  • flutter_blue, Flutter’da Bluetooth Low Energy (BLE) cihazlarına erişmek için kullanılan bir pakettir. Bu paket, Flutter uygulamalarının BLE cihazlarıyla iletişim kurmasını sağlar ve BLE özelliklerini kullanarak cihazlarla etkileşime geçebilir.
  • flutter_pw_validator, Flutter’da kullanılan bir pakettir ve şifre doğrulama/validasyon işlemleri için yardımcı fonksiyonlar sağlar. Bu paket, kullanıcıların belirli bir şifre formatını karşılayıp karşılamadığını kontrol etmek için kullanılabilir.
  • Lottie, animasyonların Flutter, iOS, Android ve Web gibi platformlarda oynatılması için kullanılan bir formattır. Lottie, Airbnb tarafından geliştirilmiş ve açık kaynak olarak sunulmuştur. Lottie, animasyonları JSON formatında saklar ve bu animasyonları platformlar arasında paylaşılabilir hale getirir. Lottie’nin en büyük avantajlarından biri, animasyonların vektör tabanlı olmasıdır. Bu sayede animasyonlar, farklı ekran boyutlarına ve çözünürlüklere uyum sağlar ve piksel yoğunluğundan etkilenmez. Ayrıca, Lottie animasyonları küçük boyutludur ve yüksek performanslıdır. Lottie animasyonları, tasarımcılar tarafından Adobe After Effects, Adobe Illustrator veya Haiku gibi araçlar kullanılarak oluşturulur. Animasyonlar daha sonra JSON formatına dönüştürülerek uygulamalarda kullanılmak üzere entegre edilir. Flutter’da Lottie animasyonlarını oynatmak için lottie adlı bir Flutter paketi bulunur. Bu paket, Lottie animasyonlarını Flutter uygulamalarına entegre etmenizi sağlar. Animasyonları yükleyebilir, oynatabilir, duraklatabilir ve animasyon durumunu kontrol edebilirsiniz.
  • webview_flutter, Flutter’da yerleşik bir web tarayıcısı görüntülemek için kullanılan bir pakettir. Bu paket, Flutter uygulamalarında bir web sayfasını tam ekran veya bir widget içinde görüntülemek ve etkileşimde bulunmak için kullanılır.
  • numberpicker, Flutter’da sayıları seçmek veya belirlemek için kullanılan bir widget veya pakettir. Bu widget veya paket, kullanıcının bir dizi sayı arasında gezinmesine ve istediği sayıyı seçmesine olanak tanır.
  • fluttertoast, Flutter uygulamalarında kullanıcıya geçici bildirimler veya tost mesajları göstermek için kullanılan bir pakettir. Bu paket, kullanıcılara hızlı ve basit bir şekilde mesajlar göstermek için pop-up benzeri bildirimler sağlar.
  • Screenshot, bir cihazın ekranının anlık bir görüntüsünün alınması işlemidir. Bir ekran görüntüsü veya ekran yakalama olarak da adlandırılır. Bu işlem, kullanıcıların anlık ekran görüntülerini kaydetmelerini veya paylaşmalarını sağlar. Ekran görüntüleri, bir cihazın ekranında görünen tüm içeriği, metinleri, görüntüleri, uygulama arayüzlerini ve diğer görsel öğeleri içerir. Bir cihazın ekran görüntüsü, genellikle bir resim dosyası olarak kaydedilir ve daha sonra kullanıcı tarafından istenilen şekilde kullanılabilir.
  • Vibration, bir cihazın titreşimli bir geribildirim sağlaması işlemidir. Bir cihazın titreşimi, kullanıcıya dokunsal veya duyusal bir geri bildirim sağlar. Titreşim, bir cihazın motorunu kullanarak hızlı bir şekilde sallanmasıyla oluşturulur.
assets:
- assets/images/
- assets/translations/
- assets/images/countries/
- assets/images/categories/
- assets/file_tr_terms.html
- assets/file_tr_policy.html
- assets/file_en_terms.html
- assets/file_en_policy.html
- assets/file_fr_terms.html
- assets/file_fr_policy.html
- assets/file_zh_terms.html
- assets/file_zh_policy.html

Yukarıdaki liste, bir projenin varlıklarının bir kısmını temsil eder. Varlıklar, bir Flutter uygulamasında kullanılan dosya veya klasörlerdir ve uygulama tarafından erişilebilir olması için projeye dahil edilir. Bu varlıklar, genellikle görüntüler, metin dosyaları, çeviri dosyaları ve diğer statik veriler gibi kaynakları içerir.

Aşağıda, listedeki her bir varlık kategorisini açıklamaya çalışayım:

  • assets/images/: Bu klasör, uygulamada kullanılan görüntülerin depolandığı bir klasördür. Bu klasördeki görüntüler, uygulama tarafından kullanılarak görüntülenebilir veya arayüzdeki görsel öğelerde kullanılabilir.
  • assets/translations/: Bu klasör, uygulamanın çoklu dil desteği için kullanılan çeviri dosyalarını içerir. Çeşitli dillerde kullanılan metinlerin çevirileri bu klasör altında saklanır.
  • assets/images/countries/: Bu klasör, ülke bayrakları veya ülke simgeleri gibi ülke temalı görüntüleri içerir. Bu görüntüler, uygulamanın kullanıcı arayüzünde ülke seçimi gibi işlevlerde kullanılabilir.
  • assets/images/categories/: Bu klasör, uygulamanın kategori veya etiket temalı görüntülerini içerir. Örneğin, bir e-ticaret uygulamasında ürün kategorilerini göstermek için kullanılan simgeler bu klasörde yer alabilir.
  • assets/file_tr_terms.html, assets/file_tr_policy.html, assets/file_en_terms.html, vb.: Bu dosyalar, kullanım şartları ve gizlilik politikası gibi metin tabanlı belgeleri içerir. Her dil için ayrı bir dosya bulunur ve bu dosyalar uygulama içinde görüntülenebilir veya kullanıcılara sunulabilir.

Bu varlık yapısı, genellikle Flutter projelerinde kullanılan bir düzendir. Varlıklar, projenin pubspec.yaml dosyasında belirtilir ve uygulama tarafından kullanılmak üzere projeye dahil edilir. Bu sayede, uygulama çalışırken bu varlıklara erişilebilir ve kullanılabilir.