Başlık: Başlangıç

    1. const tanımını gerekli bütün yerlerde kullanın.

    const tanımını kullanarak gereksiz widget tekrar oluşturma işlemlerini engelleyiniz.

    YAPMAYINYAPIN
    Column(
      children: [
        Text('One'),
        Text('Two'),
      ],
    )
    
    Column(
      children: const [
        Text('One'),
        Text('Two'),
      ],
    )
    

    2. Widget ağacını ortaya çıkarmak için virgül kullanın.

    Kodun okunabilirliğini artırmak için girintileri kullanın.

    YAPMAYINYAPIN
    @override
    Widget build(BuildContext context) {
      return const Scaffold(body: Center(child: Text('One')));
    }
    @override
    Widget build(BuildContext context) {
      return const Scaffold(
        body: Center(
          child: Text('One'),
        ),
      );
    }

    3. Dosya, değişken ve sınıfları adlandırırken PascalCase kullanın.

    Dart programlama diline göre dosya, değişken ve sınıflarınızı adlandırın. Dart, PascalCase kullanmaktadır.

    YAPMAYINYAPIN
    class myApp {
      // ...
    }
    class MyApp {
      // ...
    }

    4. Doğru widget’ı kullandığınızdan emin olun.

    Widget’ları seçerken akıllıca seçin.  Örneğin sadece boşluk kullanımı için Container yerine Padding kullanın.

    YAPMAYINYAPIN
    Container(
      padding: const EdgeInsets.all(8),
      child: const Text("Hello"),
    )
    const Padding(
      padding: EdgeInsets.all(8),
      child: Text("Hello"),
    )

    5. Gereken her yerde private değişkeni/yöntem kullanın.

    Açığa çıkarmak istemediğiniz her yöntem/değişkende private tanımını kullanın.

    YAPMAYINYAPIN
    class Student {
    String name;
    String address;
    class Student {
      String _name;
      String _address;  Student({
        required String name,
        required String address,
      })  : _name = name,
            _address = address;
    }

    6. Gereksiz Widget öğesi kullanımından kaçının.

    YAPMAYINYAPIN
    Column(
      children: [
        // ... other widgets
        Text(_textValue),
        ElevatedButton(
          onPressed: () {
            setState(() {
              _textValue = "new value";
            });
          },
          child: Text('Update'),
        ),
        // ... other widgets
      ],
    )
    Column(
      children: [
        // ... other widgets
        NewWidgetWithTextAndButton(),
        // ... other widgets
      ],
    )

    7. İç içe geçmiş widget’ları ayırın, derinleştirmeyin.

    YAPMAYINYAPIN
    Column(
      children: [
        Container(
          // ... lengthy code
        ),
        Container(
          // ... lengthy code
        ),
        // ... lengthy code
      ],
    )
    Column(
      children: [
        FirstLengthyCodeWidget(),
        SecondLengthyCodeWidget(),
        // ... other widgets
      ],
    )

    8. Yöntemleri widget’lardan hariç tanımlayın.

    YAPMAYINYAPIN
    Widget build(BuildContext context) {
      return Scaffold(
        body: ElevatedButton(
          onPressed: () {
            // ... lengthy code
          },
          child: const Text('Do some task'),
        ),
      );
    }
    Widget build(BuildContext context) {
      return Scaffold(
        body: ElevatedButton(
          onPressed: _callTheListener,
          child: const Text('Do some task'),
        ),
      );
    }void _callTheListener() {
      // ... your code here
    }

    9. Gerekmedikçe Null kullanmayın.

    YAPMAYINYAPIN
    TextEditingController? textEditingController;
    initState() {
      super.initState();
      textEditingController = TextEditingController();
    }
    late TextEditingController textEditingController;@override
    initState() {
      super.initState();
      textEditingController = TextEditingController();
    }

    10.cascade (..) and spread operator (...)

    // Cascade operator (..)
    var paint = Paint()
      ..color = Colors.black
      ..strokeCap = StrokeCap.round
      ..strokeWidth = 5.0;// Spread operator (...)
    @override
    Widget build(BuildContext context) {
      bool isTrue = true;
      return Scaffold(
        body: Column(
          children: [
            if (isTrue) ...[
              const Text('One'),
              const Text('Two'),
              const Text('Three'),
            ]
          ],
        ),
      );
    }

    11. themes ve routes ayrı dosyalarda tanımlayın.

    YAPMAYINYAPIN
    @override
    Widget build(BuildContext context) {
      return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
          // ... other properties
        ),
        home: const HomePage(),
      );
    }
    @override
    Widget build(BuildContext context) {
      return MaterialApp(
        title: 'Flutter Demo',
        theme: appTheme,
        home: const HomePage(),
      );
    }// In a new file, add your theme
    var appTheme = ThemeData(
      primarySwatch: Colors.blue,
      // ... other properties
    );

    12. Koda gömülü (hardcoded) metinlerden kaçıının.

    YAPMAYINYAPIN
    Text('One')
    Text(AppLocalizations.of(context)!.one)

    13. Koda gömülü (hardcoded) stillerden kaçıının.

    YAPMAYINYAPIN
    Column(
      children: const [
        Text(
          'One',
          style: TextStyle(
            fontSize: 14,
            fontWeight: FontWeight.normal,
          ),
        ),
        Text(
          'Two',
          style: TextStyle(
            fontSize: 14,
            fontWeight: FontWeight.normal,
          ),
        ),
      ],
    )
    Column(
      children: [
        Text(
          'One',
          style: Theme.of(context).textTheme.subtitle1,
        ),
        Text(
          'Two',
          style: Theme.of(context).textTheme.subtitle1,
        ),
      ],
    )

    14. İlişkisel paket dahil etme kullanın.

    YAPMAYINYAPIN
    import 'package:flutter/material.dart';
    import 'package:test_project/student.dart';
    import 'package:flutter/material.dart';
    import 'model/student.dart';

    15. Gereksiz Widget oluşturmamak için StatelessWidget tercih edin.

    YAPMAYINYAPIN
    class TestWidget extends StatefulWidget {
      const TestWidget({Key? key}) : super(key: key);
      @override
      State<TestWidget> createState() => _TestWidgetState();
    }
    class TestWidget extends StatelessWidget {
      const TestWidget({Key? key}) : super(key: key);
      @override
      Widget build(BuildContext context) {
        // ... stateless content
        return Image.asset('assets/men_walking.png');
      }
    }

    16. Records kullanarak birden çok öğenin döndürülmesini kolaylaştırın.

    YAPMAYINYAPIN
    String getPersonName(Map<String, dynamic> json) {
      return json['name'];
    }
    String getPersonAge(Map<String, dynamic> json) {
      return json['age'];
    }// ✅ Do
    (String, int) getPersonDetail(Map<String, dynamic> json) {
      return (
        json['name'],
        json['age'],
      );
    }

    17. Temiz ve düzenli kod için gelişmiş switch yapısı kullanın.

    YAPMAYINYAPIN
    enum Type {
      kid,
      teen,
      adult;
      int get discount {
        switch (this) {
          case kid:
            return 30;
          case teen:
            return 20;
          case adult:
            return 5;
        }
      }
    }
    void main() {
      print(Type.kid.discount);
    }// ✅ Do
    enum Type {
      kid,
      teen,
      adult;
      int get discount => switch (this) {
        kid => 30,
        teen => 20,
        adult => 5,
      };
    }void main() {
      print(Type.kid.discount);
    }