Comments 53
Фронтендер, как вечный новичок в этом непостоянном мире. Никакого спокойствия.
Не, не кинул. Но ситуация в стране изменилась.
Коммент из будущего.
Писать наверное удобнее всего на нем UI(Во всяком случае для меня)
Но вот он жутко тормознутый… я об этом писал в других топиках про flutter на хабре, но с тех пор впечатление о тормознутости только усилилось.
flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel beta, v0.8.2, on Linux, locale ru_RU.utf8)
[!] Android toolchain - develop for Android devices (Android SDK 27.0.3)
✗ Android license status unknown.
[✓] Android Studio (version 3.0)
Ну вот такое окружение.
Про версию системы я не корректно выразился. Я хотел узнать про версию Android\ios. Слышал, что на 4 Android может лагать.
Сам я на эмуляторе с 8 Android, на ios симуляторах, на реальном устройстве с 8 Android лагов не встречал даже на дебажной сборке.
А вот в моем опыте Android 4 работает лучше чем 5 й.(причем 5й по железу лучше)
6й также как 4 й работает.Я не проверял на 8м но дело в том, что всё относительно… я разрабатываю на java. И вот думаю… а повторю что-то на flutter… и отличия по производительности огромные.Ладно я смерился что apk в 12 раз больше… ладно оперативки в 10 раз больше потребляет… Но слишком медленно… Да… возможно нет ещё опыта (и возможно криворукий)… но беру примеры, в группе samples что сам flutter предлагает к изучению.(и там есть что-то подобное задачки) и вот эти рекомендованные, сделанные специалистами. тоже тормозят
Про привыкание не надо, зачем привыкать, скажем, к кровати без матраса?
Согласен на все 100% — код на Flutter безобразен и хаотичен! Просто не понятно, как обычные два текстовых поля могут занимать 118 строк кода, который представляет собой ужаснейшую кашу?!
Но дело не в фреймворке, а в моем решении не разбивать приложение на модули в первой части.
Это конечно же не все. Смешивание данных и отображения тоже является плохим подходом. Дальше я постараюсь показать как разделить эти две сущности. И даже то, как вынести стилизацию — в Flutter это очень простая задача (не в сравнении с веб, но в сравнении с другими нативными или околонативными решениями).
И смотря код… там оно просто как будто сделано «мимоходом»,-играючи…
Смотря на код простейшего экрана с двумя полями, который сделан — такое ощущение — с помощью молотка и зубила, мне страшно представить, как будет выглядеть код более менее сложного UI.
После React довольно легко привыкнуть, хотя это индивидуально.За эти внешние неудобства кода следует некоторая бонусная «оплата»… Много разных кнопок на любой вкус, легко делать градиенты, отступы, нахлесты, вертикальный скролинг(или как его называют ) sliding(слайдинг), закругления, отдельные темы,- всё просто делается из коробки.Т.е можно получить насыщенный интерфейс как в вебе.На java(kotlin) это на порядок сложнее.
Качество реализации мне понравилось гораздо больше, чем React Native
А вот впечатления от Dart, от того как сделано управление состояниями, и как сделано построение UI. После react-native и react-redux -это какая-то дичь, будет жаль если так и останется.
Правда для redux я тоже использую reduxsauce и redux-saga, может быть появяться какие-то библиотеки, которые сделают кодинг более кратким и приятным.
Интересно, что именно не понравилось в управлении состоянием? Хранение состояние внутри виджета? Использование setState для обновления?
У Flutter только недавно появился InheritedModel в добавок к InheritedWidget.
А коммьюнити только начинает решать существующие проблемы и перетаскивать хорошие решения на платформу, в том числе и redux-подобные.
Простой пример — таблица с большим количеством элементов, которой прилетает большое количество сигналов по обновление состояния. Сделайте бенчмарк и покажите насколько флаттер эффективен. С анимациями, с многопоточностью и т.д.
Есть такая концепци, как протекающая абстракция, которую ввёл Спольски. Суть в том, что на сколько бы не был прекрасна ваша абстракция, вы всё равно столкнётесь с проблемами, которые заложены в архитектуре нижних слоёв. Что-то мне подсказывает, что нативная разработка не будет заменена подобными фрейморками, только лишь из-за того, что существует это фундаментальная проблема.
В основе Flutter графический движок используемый в браузере Chrome, который себя уже давно хорошо зарекомендовал. Он легко выполняют свою работу не проваливаясь ниже 60fps.
В добавок к этому виджеты Flutter интересным образом оптимизированы. Вот, к примеру, трюк со списком из списков (1000х1000 элементов). Отрисовывается и отлично работает даже в development режиме с включенным Hot-reload. И продолжает так же хорошо работать при увеличении каждого списка в 10 раз. (MacBook Pro 2015, 16гб, версия без видюхи)
import 'package:flutter/widgets.dart';
import 'dart:math';
main() => runApp(App());
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Directionality(
child: Container(
child: ListScreen(),
color: Color(0xFF386DA7),
),
textDirection: TextDirection.ltr,
);
}
}
class ListScreen extends StatelessWidget {
final double cellSize = 60;
final itemsAmount = 1000;
final rng = new Random();
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: itemsAmount,
itemExtent: cellSize,
itemBuilder: (BuildContext context, int index) {
return ListView.builder(
itemCount: itemsAmount,
itemExtent: cellSize,
scrollDirection: Axis.horizontal,
itemBuilder: (BuildContext context, int index) {
return Container(
color: Color(0xFF000000 + rng.nextInt(0xFFFFFF)),
child: Text(rng.nextInt(0xFFFFFF).toRadixString(16)),
);
},
);
},
);
}
}
Этот пример будет работать даже с картинками загруженными из интернета.
Дело в том, что я не занимаюсь мобильной разработкой, и в ближайшее время не планирую ею заниматься. Но меня очень заинтересовал Flutter и мне захотелось разобраться с ним.
Записывать — это один из способов лучше запомнить, а объяснять — лучший способ разобраться, ведь так? )
Еще пишут на главной странице:
Google is hiring Flutter engineers!
medium.com/2dimensions/flare-launch-d524067d34d8
...
onTap: () {
_onPressed();
},
написать
...
onTap: _onPressed,
то получится то же самое — будет вызвана функция
_onPressed
.Подскажите пожалуйста, если я захочу на flutter приложение интернет магазин, можно будет в нем иметь интеграцию с моимскладом например? Чтобы товары обновлять, наличие обновлять на складах? Или этот вопрос использования апи моего склада например им все
Благодарю за классную статью!
У меня последний код не запустился с ошибками. Неужели этот код уже не актуален через 3 года для текущей версии Flutter?
lib/main.dart:95:47: Error: An optional named parameter can't start with '_'. _CounterButton(this._count, {@required this._onPressed}); ^^^^^^^^^^ lib/main.dart:62:13: Error: No named parameter with the name 'onPressed'. onPressed: () { ^^^^^^^^^ lib/main.dart:95:3: Context: Found this candidate, but the arguments don't match. _CounterButton(this._count, {@required this._onPressed}); ^^^^^^^^^^^^^^
FAILURE: Build failed with an exception.
За 3 года в нем поменялось абсолютно всё...
какой хороший язык - не тот, что эти enterprise-языки. Кажется даже гошечка такого не делает, хотя не сильно старше Dart
Пока что Flutter выглядит, как большая бочка с навозом.
А в следующей статье мы рассмотрим ...
С учётом того, как здорово и достаточно легко к усвоению у вас получилось написать этот материал для новичков, спустя столько времени я всё ещё жду следующую часть ;) Просмотры это доказывают!
Так что можете считать это "спасибом" из будущего. Что удивительно, всё +- актуальным остаётся и по сей день.
Про Flutter, кратко: Основы