(Поддержание чистоты функции build)

@override

Widget build(BuildContext context) {

  return FutureBuilder(

    future: httpCall(),

    builder: (context, snapshot) {

      // create some layout here

    },

  );

}

class Example extends StatefulWidget {

  @override

  _ExampleState createState() => _ExampleState();

}

class _ExampleState extends State<Example> {

  Future<int> future;


  @override

  void initState() {

    future = repository.httpCall();

    super.initState();

  }


  @override

  Widget build(BuildContext context) {

    return FutureBuilder(

      future: future,

      builder: (context, snapshot) {

        // create some layout here

      },

    );

  }

}

(Понимание принципов работы концепции constrains Flutter)

(Рациональное использование операторов для сокращения количества выполняемых строк)

//Do

var path = Path()

..lineTo(0, size.height)

..lineTo(size.width, size.height)

..lineTo(size.width, 0)

..close();  


//Do not

var path = Path();

path.lineTo(0, size.height);

path.lineTo(size.width, size.height);

path.lineTo(size.width, 0);

path.close();

//Do

var y = [4,5,6];

var x = [1,2,...y];


//Do not

var y = [4,5,6];

var x = [1,2];

x.addAll(y);

//Do     

v = a ?? b; 

//Do not

v = a == null ? b : a;


//Do

v = a?.b; 

//Do not

v = a == null ? null : a.b;

//Do

if (item is Animal)

item.name = 'Lion';


//Do not

(item as Animal).name = 'Lion';

(Использование функции потоков данных Streams только в случае необходимости)

abstract class MyBloc {

  Sink foo;

  Sink bar;

}


class MyWiget extends StatefulWidget {

  @override

  _MyWigetState createState() => _MyWigetState();

}


class _MyWigetState extends State<MyWiget> {

  MyBloc bloc;


  @override

  void dispose() {

    bloc.bar.close();

    bloc.foo.close();

    super.dispose();

  }


  @override

  Widget build(BuildContext context) {

    // ...

  }

}

(Написание тестов проверки критически важных функций)

(Использование необработанных строк)

//Do

var s = r'This is demo string \ and $';


//Do not

var s = 'This is demo string \ and $';

(Использование функции относительного импорта вместо абсолютного импорта)

(Использование виджета SizedBox вместо Container)

return _isNotLoaded ? Container() : YourAppropriateWidget();

return _isNotLoaded ? SizedBox() : YourAppropriateWidget();

(Использование функции log вместо print)

//Do

log('data: $data');


//Do not

print('data: $data');

String alert = isReturningCustomer ? 'Welcome back to our site!' : 'Welcome, please sign up.';

Widget getText(BuildContext context) {

    return Row(

        children:

        [

            Text("Hello"),

            if (Platform.isAndroid) Text("Android") (here if you use ternary then that is wrong)

        ]

    );

}

//Do

const SizedBox(height: Dimens.space_normal)


//Do not

SizedBox(height: Dimens.space_normal)

(Объявление переменной как null избыточно, автоматически уже null)

//Do

int _item;


//Do not

int _item = null;

//Do

int item = 10;

final Car bar = Car();

String name = 'john';

const int timeOut = 20;


//Do not

var item = 10;

final car = Car();

const timeOut = 2000;

(Использование ключевого слова const всегда, когда это возможно)

const Container(

  width: 100,

  child: const Text('Hello World')

);

prefer_const_constructors

prefer_const_declarations

prefer_const_literals_to_create_immutables

Unnecessary_const

(Соблюдение отдельных формальных требований)

//Do

someFuture.then((_) => someFunc());


//Do not

someFuture.then((DATA_TYPE VARIABLE) => someFunc());

//Do

final _frameIconSize = 13.0;

 SvgPicture.asset(

 Images.frameWhite,

 height: _frameIconSize,

 width: _frameIconSize,

 );


//Do not

SvgPicture.asset(

Images.frameWhite,

height: 13.0,

width: 13.0,

);

Хотите связаться с владельцем
компании напрямую?
Дмитрий Тарасов
Дмитрий Тарасов
СЕО

НАПИСАТЬ