Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
February 19, 2022 10:17 pm GMT

Flutter Linter Kurallar Blm 1: Hata Kurallar

Where there are rules, theres law,

Linting Nedir?

Linting , Programatik, Stilistik hatalar ve biimlendirilmemi kod iin kaynak kodunu kontrol etme ilemidir. Mantksal hatalar, kullanlmayan deikenler, bo if-else ifadeleri gibi kodlama srasnda yaplan baz yaygn ve yaygn olmayan hatalar belirlemede yardmc olur.

Linting'in amac, kod kalitesini iyiletirebilecek gizli hatay veya uygulamay altrrken sorunlara neden olabilecek hatalar belirleme konusunda gerek zamanl neriler almaktr.

Linter kurallar 3 gruba ayrlr. Bunlar:

  1. Hatalar: Olas kodlama hatalar.
  2. Stil
  3. Bar: Pub paketi kurulumuyla ilgili olas sorunlar .

Her kuraln ayrca bir olgunluk dzeyi vardr.

Kurallarn olgunluk dzeyleri de 3'e ayrlr. Bunlar:

Kararl-Stable
Bu kurallarn kullanm gvenlidir ve Dart dilinin en son srmleriyle ilevsel olduklar dorulanmtr. Deneysel olarak iaretlenmedike veya kullanmdan kaldrlmadka tm kurallar kararl olarak kabul edilir.

Deneysel-Experimental
Bu kurallar halen deerlendirme aamasndadr ve hibir zaman istikrara kavuturulamayabilir. Bunlar dikkatli kullanmanz gerekir.

Kullanmdan kaldrld-Deprecated
Bu kurallar artk kullanm iin nerilmemektedir ve gelecekteki bir linter yaynnda kaldrlabilir.

Hata kurallar

Hata kurallar, kodunuzdaki olas hatalar ve dier hatalar tanmlar.

Always_use_package_imports

lib/. iindeki dosyalar iin relative imports'dan (greli ie aktarmalardan) kann.

Ayn yeyi iki farkl ekilde ie aktarmaktan kanmak iin lib/dizindeki dosyalar iin mutlak ie aktarmay (absolute imports) kullandnzdan emin olun.

Doru kullanm:

import 'package:foo/bar.dart';import 'package:foo/baz.dart';import 'package:foo/src/baz.dart';

Yanl kullanm:

import 'baz.dart';import 'src/bag.dart'import '../lib/baz.dart';

avoid_dynamic_calls

"dynamic" bir hedefte method arlarndan veya property eriimlerinden kann.

Aka veya dolayl olarak statik olarak yazlan dynamic bir obje zerindeki method arlarndan veya zellik(properties) eriimlerinden kann. Dinamik arlar, her alma zaman ortamnda ve derleyicide biraz farkl olarak ele alnr, ancak ou retim modu (ve hatta baz gelitirme modlar), dinamik arlarla ilikili hem derleme boyutu hem de alma zaman performans cezalarna sahiptir.

Ek olarak, "dynamic" yazlan hedefler, ou statik analizi devre d brakr.

Yanl kullanm:

void explicitDynamicType(dynamic object) {  print(object.foo());}void implicitDynamicType(object) {  print(object.foo());}abstract class SomeWrapper {  T doSomething<T>();}void inferredDynamicType(SomeWrapper wrapper) {  var object = wrapper.doSomething();  print(object.foo());}void callDynamic(dynamic function) {  function();}void functionType(Function function) {  function();}

Doru kullanm:

void explicitType(Fooable object) {  object.foo();}void castedType(dynamic object) {  (object as Fooable).foo();}abstract class SomeWrapper {  T doSomething<T>();}void inferredType(SomeWrapper wrapper) {  var object = wrapper.doSomething<Fooable>();  object.foo();}void functionTypeWithParameters(Function() function) {  function();}

avoid_empty_else

Bo else ifadelerinden kann.

Yanl kullanm:

if (x > y)  print("1");else ;  print("2");

avoid_print

retim kodunda "print" arlarndan kann.

void f(int x) {  print('debug: $x');  ...}

avoid_returning_null_for_future

Future iin null dndrmekten kann.

avoid_slow_async_io

Yava asenkron dart:io yntemlerinden kann.

Aadaki asenkron dosya I/O methodlarn kullanmaktan kann, nk bunlar senkron emsallerinden ok daha yavatr.

Directory.exists
Directory.stat
File.lastModified
File.exists
File.stat
FileSystemEntity.isDirectory
FileSystemEntity.isFile
FileSystemEntity.isLink
FileSystemEntity.type

Yanl kullanm:

import 'dart:io';Future<Null> someFunction() async {  var file = File('/path/to/my/file');  var now = DateTime.now();  if ((await file.lastModified()).isBefore(now)) print('before'); // LINT}

Doru kullanm:

import 'dart:io';Future<Null> someFunction() async {  var file = File('/path/to/my/file');  var now = DateTime.now();  if (file.lastModifiedSync().isBefore(now)) print('before'); // OK}

avoid_type_to_string

Sonular kltlebileceinden retim kodunda ".toString()" kullanmaktan kann.

Yanl kullanm:

void bar(Object other) {  if (other.runtimeType.toString() == 'Bar') {    doThing();  }}Object baz(Thing myThing) {  return getThingFromDatabase(key: myThing.runtimeType.toString());}

Doru kullanm:

void bar(Object other) {  if (other is Bar) {    doThing();  }}class Thing {  String get thingTypeKey => ...}Object baz(Thing myThing) {  return getThingFromDatabase(key: myThing.thingTypeKey);}

avoid_types_as_parameter_names

Tipleri paremetre ad olarak kullanmaktan kann.

Yanl kullanm: m(f(int));
Doru kullanm: m(f(int v));

avoid_web_libraries_in_flutter

Flutter Flutter web plugin paketleri dnda yalnzca web kitaplklar kullanmaktan kann.

Web eklentileri olmayan Flutter paketlerinde web kitaplklar, dart:html, dart:js ve dart:js_util kullanmaktan kann. Bu kitaplklar bir web context dnda desteklenmez; bunlara bal olan ilevsellik Flutter mobilde runtime da baarsz olur ve Flutter web'de kullanlmalar genellikle nerilmez.

Web kitapl eriimine u durumlarda izin verilir:

web'i desteklenen bir context olarak bildiren plugin paketleri

aksi takdirde, dart:html, dart:js ve dart:js_util'in import edilmesine izin verilmez.

cancel_subscriptions

dart.async.StreamSubscription rneklerini iptal edin.

StreamSubscription rneklerinin-instances iptal edilmesi, bellek szntlarn ve beklenmeyen davranlar (unexpected behavior) nler.

Yanl Kullanm:

class A {  StreamSubscription _subscriptionA; // LINT  void init(Stream stream) {    _subscriptionA = stream.listen((_) {});  }}

Yanl kullanm:

void someFunction() {  StreamSubscription _subscriptionF; // LINT}

Doru kullanm:

class B {  StreamSubscription _subscriptionB; // OK  void init(Stream stream) {    _subscriptionB = stream.listen((_) {});  }  void dispose(filename) {    _subscriptionB.cancel();  }}

Doru kullanm:

void someFunctionOK() {  StreamSubscription _subscriptionB; // OK  _subscriptionB.cancel();}

close_sinks

Sink rneklerini kapatmak, bellek szntlarn(memory leaks) ve beklenmeyen davranlar(unexpected behavior) nler.

Yanl kullanm:

class A {  IOSink _sinkA;  void init(filename) {    _sinkA = File(filename).openWrite(); // LINT  }}

Yanl kullanm:

void someFunction() {  IOSink _sinkF; // LINT}

Doru kullanm:

class B {  IOSink _sinkB;  void init(filename) {    _sinkB = File(filename).openWrite(); // OK  }  void dispose(filename) {    _sinkB.close();  }}

Doru kullanm:

void someFunctionOK() {  IOSink _sinkFOK; // OK  _sinkFOK.close();}

comment_references

Yalnzca belge yorumlarndaki kapsam tanmlayclarna (scope identifiers) bavurun.

Deiken, method veya keli parantez iinde adlar yazarsanz, dartdoc ad arar ve belgelerine balanr. Tm bunlarn ie yaramas iin, parantez iine alnm belgelerdeki tm tanmlayclarn kapsam iinde olduundan emin olun.

rnein:

Doru kullanm:

/// [a] veya [b]'den byk olan dndrn.int max_int(int a, int b) { ... }

te yandan, outOfScopeId'in kapsam d olduunu varsayarsak:

Yanl kullanm:

/// [value], [outOfScopeId] deerinden bykse true deerini dndrn.bool isOutOfRange(int value) { ... }

Keli parantez yorum biiminin, aklamalarn olduka doal bir biim kullanarak bildirimlere bavurmasna izin verecek ekilde tasarlandn, ancak keyfi ifadelere izin vermediini unutmayn. zellikle, keli parantez iindeki kod referanslar, aadakilerden herhangi birini ierebilir:

Tanmlaycnn comment kapsamndaki herhangi bir tanmlayc(identifier) olduu tek bir tanmlayc (dokman yorumlarnda kapsamda ne olduuna ilikin spesifikasyona bakn),

ilk tanmlaycnn kapsamdaki bir snfn ad ve ikincisinin snfta bildirilen bir yenin ad olduu bir nokta ile ayrlm iki tanmlayc,

tek bir tanmlayc ve ardndan bir parantez ifti, burada tanmlayc kapsamdaki bir snfn addr (snfn adsz constructor'na atfta bulunmak iin kullanlr),

veya bir nokta ile ayrlm ve ardndan bir ift parantez ile ayrlm iki tanmlayc; burada ilk tanmlayc kapsamdaki bir snfn ad ve ikincisi adlandrlm bir constructor'n addr (kesinlikle gerekli deildir, ancak tutarllk iin izin verilir).

control_flow_in_finally

Son bloklarda kontrol ak kullanmaktan kann.
Son bloklarda kontrol aknn kullanlmas, kanlmaz olarak, hata ayklamas zor olan beklenmeyen davranlara neden olacaktr.

Doru kullanm:

class Ok {  double compliantMethod() {    var i = 5;    try {      i = 1 / 0;    } catch (e) {      print(e); // OK    }    return i;  }}

Yanl kullanm:

class BadReturn {  double nonCompliantMethod() {    try {      return 1 / 0;    } catch (e) {      print(e);    } finally {      return 1.0; // LINT    }  }}

Yanl kullanm:

class BadContinue {  double nonCompliantMethod() {    for (var o in [1, 2]) {      try {        print(o / 0);      } catch (e) {        print(e);      } finally {        continue; // LINT      }    }    return 1.0;  }}

Yanl kullanm:

class BadBreak {  double nonCompliantMethod() {    for (var o in [1, 2]) {      try {        print(o / 0);      } catch (e) {        print(e);      } finally {        break; // LINT      }    }    return 1.0;  }}

diagnostic_describe_all_properties
Debug methodlarnda tm public property'leri implemente edin.

Diagnosticable'n uygulayclar, alma zamannda hata ayklanabilirliini iyiletirmek iin bir debugFillProperties(...) veya debugDescribeChildren(...) methodu tm public zelliklere bavurmaldr.

Yanl kullanm:

class Absorber extends Widget {  bool get absorbing => _absorbing;  bool _absorbing;  bool get ignoringSemantics => _ignoringSemantics;  bool _ignoringSemantics;  @override  void debugFillProperties(DiagnosticPropertiesBuilder properties) {    super.debugFillProperties(properties);    properties.add(DiagnosticsProperty<bool>('absorbing', absorbing));    // Missing reference to ignoringSemantics  }}  

Doru kullanm:

class Absorber extends Widget {  bool get absorbing => _absorbing;  bool _absorbing;  bool get ignoringSemantics => _ignoringSemantics;  bool _ignoringSemantics;  @override  void debugFillProperties(DiagnosticPropertiesBuilder properties) {    super.debugFillProperties(properties);    properties.add(DiagnosticsProperty<bool>('absorbing', absorbing));    properties.add(DiagnosticsProperty<bool>('ignoringSemantics', ignoringSemantics));  }}  

empty_statements

Bo ifadelerden kann.

Bo ifadeler neredeyse her zaman bir hatay gsterir.

rnein,

Yanl kullanm:

if (complicated.expression.foo());  bar();

Dart format ile biimlendirilen hata bariz hale gelir:

if (complicated.expression.foo()) ;bar();

Doru kullanm:

if (complicated.expression.foo())  bar();

invariant_booleans

Koullu ifadeler koulsuz olarak true veya false olarak deerlendirilmemelidir.

Bu kural u anda deneyseldir. (experimental)

Derleme zamannda karlabilecek koullar test ETMEYN veya ayn koulu iki kez test etmeyin.

False'dan baka bir ey olamayacak bir koul kullanan koullu ifadeler, kod bloklarn ilevsiz hale getirme etkisine sahiptir. Koul, true dnda hibir eyi deerlendiremezse, koullu ifade tamamen gereksizdir ve kodu daha az okunabilir hale getirir. Kodun programcnn amac ile uyumamas olduka olasdr. Ya koul kaldrlmal ya da her zaman true veya false olarak deerlendirilmemesi ve gereksiz testler yapmamas iin gncellenmelidir.

Yanl kullanm:

// foo ayn ifadede bara hem eitdir hem de eit olamazif(foo == bar && something && foo != bar) {...}

Yanl kullanm:

void compute(int foo) {  if (foo == 4) {    doSomething();   // bu noktada foo'nun 4'e eit olduunu biliyoruz, bu nedenle sonraki koul her zaman false    if (foo > 4) {...}    ...  }  ...}

Yanl kullanm:

void compute(bool foo) {  if (foo) {    return;  }  doSomething();  // burada foo'nun deeri her zaman false'dr  if (foo){...}  ...}

Doru kullanm:

void nestedOK() {  if (foo == bar) {    foo = baz;    if (foo != bar) {...}  }}

Doru kullanm:

void nestedOk2() {  if (foo == bar) {    return;  }  foo = baz;  if (foo == bar) {...} // OK}

Doru kullanm:

void nestedOk5() {  if (foo != null) {    if (bar != null) {      return;    }  }  if (bar != null) {...} // OK}

iterable_contains_unrelated_type

likisiz(unrelated) trlerin referanslaryla Iterable.contains ars.

Yanl kullanm:

void someFunction() {  var list = <int>[];  if (list.contains('1')) print('someFunction'); // LINT}

Yanl kullanm:

void someFunction3() {  List<int> list = <int>[];  if (list.contains('1')) print('someFunction3'); // LINT}

Yanl kullanm:

void someFunction8() {  List<DerivedClass2> list = <DerivedClass2>[];  DerivedClass3 instance;  if (list.contains(instance)) print('someFunction8'); // LINT}

Yanl kullanm:

abstract class SomeIterable<E> implements Iterable<E> {}abstract class MyClass implements SomeIterable<int> {  bool badMethod(String thing) => this.contains(thing); // LINT}

Doru kullanm:

void someFunction10() {  var list = [];  if (list.contains(1)) print('someFunction10'); // OK}

Doru kullanm:

void someFunction1() {  var list = <int>[];  if (list.contains(1)) print('someFunction1'); // OK}

Doru kullanm:

void someFunction4() {  List<int> list = <int>[];  if (list.contains(1)) print('someFunction4'); // OK}

Doru kullanm:

void someFunction5() {  List<ClassBase> list = <ClassBase>[];  DerivedClass1 instance;  if (list.contains(instance)) print('someFunction5'); // OK}abstract class ClassBase {}class DerivedClass1 extends ClassBase {}

Doru kullanm:

void someFunction6() {  List<Mixin> list = <Mixin>[];  DerivedClass2 instance;  if (list.contains(instance)) print('someFunction6'); // OK}abstract class ClassBase {}abstract class Mixin {}class DerivedClass2 extends ClassBase with Mixin {}

Doru kullanm:

void someFunction7() {  List<Mixin> list = <Mixin>[];  DerivedClass3 instance;  if (list.contains(instance)) print('someFunction7'); // OK}abstract class ClassBase {}abstract class Mixin {}class DerivedClass3 extends ClassBase implements Mixin {}

list_remove_unrelated_type

likisiz trlerin referanslaryla remove ars.

Parametre trnden farkl trde bir rnekle(instance) Listede remove yntemini armayn.

Bunu yapmak, liste elemanlar zerinde == esini arr ve byk olaslkla false dndrr.

Yanl kullanm:

void someFunction() {  var list = <int>[];  if (list.remove('1')) print('someFunction'); // LINT}

Yanl kullanm:

void someFunction3() {  List<int> list = <int>[];  if (list.remove('1')) print('someFunction3'); // LINT}

Yanl kullanm:

void someFunction8() {  List<DerivedClass2> list = <DerivedClass2>[];  DerivedClass3 instance;  if (list.remove(instance)) print('someFunction8'); // LINT}

Yanl kullanm:

abstract class SomeList<E> implements List<E> {}abstract class MyClass implements SomeList<int> {  bool badMethod(String thing) => this.remove(thing); // LINT}

Doru kullanm:

void someFunction10() {  var list = [];  if (list.remove(1)) print('someFunction10'); // OK}

Doru kullanm:

void someFunction1() {  var list = <int>[];  if (list.remove(1)) print('someFunction1'); // OK}

Doru kullanm:

void someFunction4() {  List<int> list = <int>[];  if (list.remove(1)) print('someFunction4'); // OK}

Doru kullanm:

void someFunction5() {  List<ClassBase> list = <ClassBase>[];  DerivedClass1 instance;  if (list.remove(instance)) print('someFunction5'); // OK}abstract class ClassBase {}class DerivedClass1 extends ClassBase {}

Doru kullanm:

void someFunction6() {  List<Mixin> list = <Mixin>[];  DerivedClass2 instance;  if (list.remove(instance)) print('someFunction6'); // OK}abstract class ClassBase {}abstract class Mixin {}class DerivedClass2 extends ClassBase with Mixin {}

Doru kullanm:

void someFunction7() {  List<Mixin> list = <Mixin>[];  DerivedClass3 instance;  if (list.remove(instance)) print('someFunction7'); // OK}abstract class ClassBase {}abstract class Mixin {}class DerivedClass3 extends ClassBase implements Mixin {}

literal_only_boolean_expressions
Boole ifadesi yalnzca literal'lerden oluur.

False'dan baka bir ey olamayacak bir koulu kullanan koullu ifadeler (conditional statements), kod bloklarn ilevsiz hale getirme etkisine sahiptir. Koul, true dnda hibir eyi deerlendiremezse, koullu ifade tamamen gereksizdir ve kodu daha az okunabilir hale getirir. Kodun programcnn amac ile uyumamas olduka olasdr. Ya koul kaldrlmal ya da her zaman true veya false olarak deerlendirilmemesi iin gncellenmelidir.

Yanl kullanm:

void bad() {  if (true) {} // LINT}

Yanl kullanm:

void bad() {  if (true && 1 != 0) {} // LINT}

Yanl kullanm:

void bad() {  if (1 != 0 && true) {} // LINT}

Yanl kullanm:

void bad() {  if (1 < 0 && true) {} // LINT}

Yanl kullanm:

void bad() {  if (true && false) {} // LINT}

Yanl kullanm:

void bad() {  if (1 != 0) {} // LINT}

Yanl kullanm:

void bad() {  if (true && 1 != 0 || 3 < 4) {} // LINT}

Yanl kullanm:

void bad() {  if (1 != 0 || 3 < 4 && true) {} // LINT}

NOT: (;;) edeerine tercih edilen while (true) { } deyimi iin bir istisna yaplmtr.

Doru kullanm:

void good() {  while (true) {    // Do stuff.  }}

no_adjacent_strings_in_list

Listede bitiik dizeleri kullanmayn.

Doru kullanm:

List<String> list = <String>[  'a' +  'b',  'c',];

Yanl kullanm:

List<String> list = <String>[  'a'  'b',  'c',];

no_duplicate_case_values

Ayn deerde birden fazla case kullanmayn.

Bu genellikle bir yazm hatas veya constant'n deitirilmi deeridir.

Doru kullanm:

const int A = 1;switch (v) {  case A:  case 2:}

Yanl kullanm:

const int A = 1;switch (v) {  case 1:  case 2:  case A:  case 2:}

no_logic_in_create_state

"createState" iine herhangi bir mantk koymayn.

createState() uygulamalar, bir state nesnesinin yeni bir rneini (instance) dndrmeli ve baka bir ey yapmamaldr. Widget alan araclyla durum eriimi tercih edildiinden, verilerin zel constructor parametreleri kullanlarak state nesnelerine iletilmesinden de kanlmaldr ve , state constructor'na hibir argman iletilmemelidir.

Yanl kullanm:

MyState global;class MyStateful extends StatefulWidget {  @override  MyState createState() {    global = MyState();    return global;  } }
class MyStateful extends StatefulWidget {  @override  MyState createState() => MyState()..field = 42;}
class MyStateful extends StatefulWidget {  @override  MyState createState() => MyState(42);}

Doru kullanm:

class MyStateful extends StatefulWidget {  @override  MyState createState() {    return MyState();  }}

prefer_relative_imports

lib/ altndaki dosyalar iin relative import'u tercih edin.

Relative(greceli) ve absolute(mutlak) ie aktarmalarn her ikisini birden kullanrken ayn yenin iki farkl ekilde ie aktarld bir durumla karlalmas mmkndr.
Bundan kanmak iin lib/ klasrndeki dosyalar iin srekli olarak relative importlar (greceli ie aktarmalar) kullandnzdan emin olun.

Doru kullanm: import 'bar.dart';

Yanl kullanm: import 'package:my_package/bar.dart';

prefer_void_to_null

Void'in alaca yerlerde Null trn kullanmayn.

Yanl kullanm:

Null f() {}Future<Null> f() {}Stream<Null> f() {}f(Null x) {}

Doru kullanm:

void f() {}Future<void> f() {}Stream<void> f() {}f(void x) {}

Baz istisnalar, zel ilev trlerinin formle edilmesini ierir:

Null Function(Null, Null);

ve herhangi bir map veya list tr iin read-only konumlara gemek iin gvenli olan empty literal'ler (deimezler) yapmak iin:

<Null>[];<int, Null>{};

test_types_in_equals

Trlerin test edilmemesi, snfnzn tketicileri iin beklenmeyen null pointer (bo iareti) istisnalarna (exceptions) neden olabilir.

Doru kullanm:

class Field {}class Good {  final Field someField;  Good(this.someField);  @override  bool operator ==(Object other) {    if (identical(this, other)) {      return true;    }    return other is Good &&        this.someField == other.someField;  }  @override  int get hashCode {    return someField.hashCode;  }}

Yanl kullanm:

class Field {}class Bad {  final Field someField;  Bad(this.someField);  @override  bool operator ==(Object other) {    Bad otherBad = other as Bad; // LINT    bool areEqual = otherBad != null && otherBad.someField == someField;    return areEqual;  }  @override  int get hashCode {    return someField.hashCode;  }}

throw_in_finally

Son bloklarda istisna(exceptions) atmaktan kann.

Nihai bloklarda istisnalar atmak, hata ayklamas zor olan beklenmeyen davranlara(unexpected behavior) neden olacaktr.

Doru kullanm:

class Ok {  double compliantMethod() {    var i = 5;    try {      i = 1 / 0;    } catch (e) {      print(e); // OK    }    return i;  }}

Yanl kullanm:

class BadThrow {  double nonCompliantMethod() {    try {      print('hello world! ${1 / 0}');    } catch (e) {      print(e);    } finally {      throw 'Find the hidden error :P'; // LINT    }  }}

unnecessary_statements

Gereksiz ifadeler kullanmaktan kann.

Ak bir etkisi olmayan ifadeler genellikle gereksizdir veya blnmelidir.

rnein,

Yanl kullanm:

myvar;list.clear;1 + 2;methodOne() + methodTwo();foo ? bar : baz;

Bunun gibi kodlar eksik bir dnceyi gsterir ve bir hatadr.

Doru kullanm:

some.method();const SomeClass();methodOne();methodTwo();foo ? bar() : baz();return myvar;

unrelated_type_equality_checks

Eitlik operatrn ilikisiz trlerin referanslarn karlatrrken kullanmayn.

Hibirinin dierinin alt tr olmad bir trn referanslarn karlatrmak, byk olaslkla false dndrr ve programcnn amacn yanstmayabilir.

package:fixnum'daki Int64 ve Int32, int2in sa tarafta olmas kouluyla int ile karlatrmaya izin verir. Lint, buna zel bir durum olarak izin verir.

Yanl kullanm:

void someFunction() {  var x = '1';  if (x == 1) print('someFunction'); // LINT}

Yanl kullanm:

void someFunction1() {  String x = '1';  if (x == 1) print('someFunction1'); // LINT}

Yanl kullanm:

void someFunction13(DerivedClass2 instance) {  var other = DerivedClass3();  if (other == instance) print('someFunction13'); // LINT}class ClassBase {}class DerivedClass1 extends ClassBase {}abstract class Mixin {}class DerivedClass2 extends ClassBase with Mixin {}class DerivedClass3 extends ClassBase implements Mixin {}

Doru kullanm:

void someFunction2() {  var x = '1';  var y = '2';  if (x == y) print(someFunction2); // OK}

Doru kullanm:

void someFunction3() {  for (var i = 0; i < 10; i++) {    if (i == 0) print(someFunction3); // OK  }}

Doru kullanm:

void someFunction4() {  var x = '1';  if (x == null) print(someFunction4); // OK}

Doru kullanm:

void someFunction7() {  List someList;  if (someList.length == 0) print('someFunction7'); // OK}

Doru kullanm:

void someFunction8(ClassBase instance) {  DerivedClass1 other;  if (other == instance) print('someFunction8'); // OK}

Doru kullanm:

void someFunction10(unknown) {  var what = unknown - 1;  for (var index = 0; index < unknown; index++) {    if (what == index) print('someFunction10'); // OK  }}

Doru kullanm:

void someFunction11(Mixin instance) {  var other = DerivedClass2();  if (other == instance) print('someFunction11'); // OK  if (other != instance) print('!someFunction11'); // OK}class ClassBase {}abstract class Mixin {}class DerivedClass2 extends ClassBase with Mixin {}

unsafe_html

Gvenli olmayan HTML API'lerinden kann.

Bir AnchorElement esinin href alanna dorudan atama
Bir EmbedElement, IFrameElement, ImageElement veya ScriptElement esinin src alanna dorudan atama
Bir IFrameElement esinin srcdoc alanna dorudan atama
Element'in createFragment yntemini arma
Window open methodunu arma
Element'in setInnerHtml yntemini arma
Element.html constructor'n arma
DocumentFragment.html constructor'n arma

Yanl kullanm:

var script = ScriptElement()..src = 'foo.js';

use_build_context_synchronously

Asenkron boluklarda BuildContexts kullanmayn.

BuildContext'i daha sonra kullanmak zere saklamak, tehis edilmesi zor kmelere yol aabilir. Asenkron boluklar rtk olarak BuildContext'i depolar ve kod yazarken gzden karlr.

Bir StatefulWidget'tan bir BuildContext kullanldnda, asenkron bir boluktan sonra mounted property kontrol edilmelidir.

Doru kullanm:

void onButtonTapped(BuildContext context) {  Navigator.of(context).pop();}

Yanl kullanm:

void onButtonTapped(BuildContext context) async {  await Future.delayed(const Duration(seconds: 1));  Navigator.of(context).pop();}

Doru kullanm:

class _MyWidgetState extends State<MyWidget> {  ...  void onButtonTapped() async {    await Future.delayed(const Duration(seconds: 1));    if (!mounted) return;    Navigator.of(context).pop();  }}

use_key_in_widget_constructors

Widget constructor'larnda key kullann.

Public widget'lar olutururken key kullanmak iyi bir yoldur.

Yanl kullanm:
class MyPublicWidget extends StatelessWidget {}

Doru kullanm:

class MyPublicWidget extends StatelessWidget {  MyPublicWidget({Key? key}) : super(key: key);}

valid_regexps

Geerli bir regular expression syntax' kullann.

Regular expression (normal ifade rnekleri) olutururken geerli regular expression sz dizimini kullann.

Invalid syntax ile oluturulan regular ifadeler, alma zamannda bir FormatException oluturacaktr, bu nedenle bundan kanlmaldr.

Yanl kullanm: print(RegExp(r'(').hasMatch('foo()'));

Doru kullanm: print(RegExp(r'\(').hasMatch('foo()'));

Bu makalede Linter kurallarnn ilk grubu olan error kurallarn inceledik. Bir sonraki makalede Stil kurallarn inceleyeceiz.

References:
https://medium.com/podiihq/setting-up-lint-rules-in-dart-flutter-1ebbed0418a6
https://medium.flutterdevs.com/lint-rules-in-flutter-efbcf05daeb5
https://dart.dev/tools/linter-rules#directives_ordering
https://dart-lang.github.io/linter/lints/


Original Link: https://dev.to/gulsenkeskin/flutter-linter-kurallari-bolum-1-hata-kurallari-3d4j

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To