Новое приложение «Медузы». Почему Flutter?

    Технический директор Борис Горячев рассказывает, как «Медуза» работала над ним целый год и почему оно написано на Flutter


    12 мая состоялся релиз новых мобильных приложений «Медузы» (iOS, Android) — почти через два года после того, как мы решили их переписать. Почему так долго? Почему не нативные приложения? Почему именно Flutter? Обо всем этом рассказывает технический директор «Медузы» Борис Горячев.



    В отличие от наших старых приложений, новые мы решили не делать нативными. Во-первых, писать два раза один и тот же код утомительно. Во-вторых, никогда не получится сделать так, чтобы в двух разных проектах, написанных разными людьми, все было синхронно и одинаково. Обычно кто-то работает медленнее, кто-то ушел в отпуск, у кого-то технический долг, который надо закрыть. Весь наш опыт создания и поддержки нативных приложений подсказывал нам — либо мы что-то делаем не так, либо это просто не наш путь. И мы начали искать свой. Пробовали React Native и Ionic, думали про подход Basecamp — все в веб + тонкая нативная прослойка, даже порывались пойти в сторону Progressive Web App и остаться веб-онли.

    Примерно тогда же я побывал на конференции Google I/O и там познакомился с людьми, делающими Flutter. Сразу попробовал Dart и поработал немного на Flutter, но на тот момент технология еще не была готова для «Медузы»: нельзя было встраивать внутрь наших материалов разный интерактив и эмбеды, а для медиа это критично. Так что я решил подождать, пока Flutter подрастет.

    За время ожидания мы много чего сделали на стороне веба: переписали сайт, написали новую версию AMP. Написали и перевели все проекты «Медузы» на ui-kit — единую библиотеку компонентов, которую использует сайт и благодаря которой возможно огромное количество наших игровых механик. Мы разделили десктопные и мобильные версии сайта, так что раздающие страницы (главная и страницы разделов) стали формироваться в двух разных местах по своим правилам.

    Параллельно с работой по сайту мы думали над новым приложением — придумывали его навигацию, смыслы, экраны, фичи и так далее.



    Параллельно происходили важные изменение в структуре технического отдела. Мы стали активно использовать Google-календарь и другие инструменты планирования совещаний, перешли с Trello на Basecamp. Это настолько очевидно, что даже странно об этом рассказывать. Но потребовалось много времени и сил, чтобы упорядочить хаос. Четкая повестка совещаний, быстрый фоллоу-ап, файлы, которые не теряются, и скоупы хилл чарт позволили в итоге справиться с огромным потоком задач и не умереть.

    Почему все-таки Flutter. И немного про Dart


    Когда люди узнают про Flutter, они неизбежно узнают и про Dart. Кажется, он считается, самым большим минусом Flutter, но ровно до тех пор, пока не попробуешь на нем писать. Он действительно прикольный. После JavaScript так особенно.

    Dart — это язык программирования, который был разработан в Google. Его анонсировали в 2011 году, то есть это еще пока молодой язык. Он не стал major языком программирования (по крайней мере пока), но при этом его очень активно используют в самой компании. Помимо Google, есть и другие большие компании, например, Wrike, которые используют Dart и пишут на нем фуллстек.

    Поскольку и Dart, и Flutter поддерживаются одной компанией, это дает возможность менять язык под нужды Flutter. Насколько я знаю, обе команды активно взаимодействуют друг с другом, поэтому в языке постоянно появляются фишки, позволяющие писать более приятный код на Flutter.

    Я не буду пытаться объяснить, из чего состоит Flutter, — Википедия справится с этой задачей лучше, но скажу только, что среди авторов есть люди, которые сделали рендеринг в Chromium.

    В декабре 2018 года команда Flutter выпустила библиотеку встраивания Webview в Flutter. Она была сырой и, кстати, до сих пор еще не вышла из Developers Preview Status, но этот факт не помешал начать прикидывать структуру будущего приложения. Несколько месяцев я экспериментировал в свободное от работы время, а потом было принято окончательное решение.

    Сначала я сел писать новую версию API специально для приложения. Идеологию этого API можно сформулировать так: если что-то можно сделать на бэкенде, значит, надо это делать на бэкенде. И не потому, что сделать что-то на клиенте сложно. Дело в том, что релизы в App Store и Google Play — это трудоемкий и долгий процесс. Нужно подстраиваться под их графики работы и помнить, что не все пользователи сразу обновят приложение. Этого можно избежать, когда основная логика происходит у тебя на сервере. Надо подвинуть заголовок на 10 пикселей вниз? Пожалуйста. Быстро убрать или добавить компонент? Нет проблем!



    По этой же причине API для мобильного приложения содержит максимально простые компоненты, из которых рекурсивно собирается почти любой материал. Я говорю «почти», потому что игры мы показываем через WebView. Приложению без разницы, что показывать — карточку, подкаст, новость или «Шапито». Все обрабатывается одним кодом, а задача приложения — взять компонент и отрендерить его (или пойти в список его детей и вызваться рекурсивно).

    Еще один важный аргумент в пользу Flutter: разработчик «контролирует все пиксели». Когда нужно сделать так, чтобы везде были правильные тени, как в макете в Sketch, или хочется, чтобы прозрачность менялась по кривым, или нужно, чтобы размеры шрифтов и вся типографика были настраиваемыми, — в Flutter все просто и реалистично.

    Еще одна киллер-фича Flutter — комфорт разработки. Hot-reload, к которому я так привык в веб-разработке, и быстрая скорость перезагрузки приложения без потери состояния максимально облегчают работу. Тебе не нужно сидеть и ждать, пока пересобирается приложение, потом ждать, пока заработает новый код, и повторять состояние, в котором ты работаешь. Все происходит действительно быстро и круто.

    Экосистема


    Хотя Flutter и Dart пока не очень популярные технологии, у нас не возникло проблем с поиском библиотек. Большая часть того, что нужно в приложении, есть либо в самом фреймворке, либо на pub.dev. Комьюнити очень приятное и готово помогать. Это общение — настоящий глоток свежего воздуха, очень поддерживало.

    Кроме того, сам Google хорошо поддерживает Flutter. Мы используем Firebase для пушей, аналитики, профилей и хранения пользовательских данных (история чтения, позиции эпизодов, закладок), и там все «просто работает». Конечно, мне как человеку, который никогда раньше не писал нативных приложений, иногда дико лезть в gradle файлы или ставить проперти в info.plist. Но обычно все гуглится, и там нет ничего невероятно сложного.

    Отличия платформ


    Про разницу iOS и Android можно говорить бесконечно. Как правило, сразу вспоминают о том, что паттерны должны быть привычными пользователю и что надо обязательно следовать дизайн-гайдлайнам. Мы с этим согласны, но не совсем. Важно помнить и про свой фирменный стиль, и про здравый смысл, и про логику поведения уже знакомых тебе пользователей.

    Если взглянуть на историю самих платформ, то мы видим, что одни паттерны меняются вместе с устройствами, а другие перетекают из системы в систему. Это не скрижали, ничего не стоит на месте. Есть десятки крутых примеров, когда компании отступают от рекомендаций Google и Apple и делают так, как считают правильным.



    Самый простой и яркий пример — свайп назад в iOS. Область экрана, которая принимает свайп, по умолчанию супермелкая, около 20 пикселей. Именно так устроено приложение Mail на айфонах, и это очень неудобно. У Twitter эта область немного расширена, а у Telegram она просто огромная! В Telegram на Android свой особенный тип навигации из списка чатов в чат, это нечто среднее между iOS и Android. Да, гайдлайны — это классно, но на iPhone XR тянуться пальцем в верхний левый край устройства очень неудобно. Так что мы решили (конечно, с опорой на данные), что в приложении «Медузы» кнопка «Назад» на iOS будет внизу. А на Android ее не будет вообще. Для этого есть свайпы (как наши собственные, так и новые свайпы Android) и системная кнопка «Назад».

    Рассказывает моя коллега, арт-директор «Медузы» Настя Яровая:

    У меня маленькие руки и большой телефон. Смешно вроде бы, но это повлияло на два важных решения в процессе разработки. Сначала я предложила значительно увеличить зону свайпа назад (увеличили до 50%) — первое отступление от гайдлайнов. Потом, когда мы работали над навигацией и функциональными кнопками внутри материала, я предложила кнопку «назад» поставить в общее меню внизу — это еще одно отступление от привычного паттерна в интерфейсе. Теперь до нее можно дотянуться большим пальцем, ведь в основном скроллят именно им.


    Мы знаем, что нам точно прилетит за то, что мы нарушили ряд рекомендаций Apple и Google. Но мы, если что, тоже пользуемся телефонами и понимаем, что многие паттерны устарели, так как были придуманы для устройств в два раза меньше.

    Немного практики: как это устроено в Flutter


    После React и других реактивных фреймворков собрать прототип на Flutter можно за пару дней. Генеральная идея Flutter — everything is a widget. Flutter дает две (на самом деле три) парадигмы: можно использовать material виджеты, которые следуют концепции material design. Можно использовать Cupertino widgets — виджеты, которые выглядят и ведут себя как в iOS. И можно все писать самому.

    Грубо говоря, есть два вида виджетов, с которым взаимодействует разработчик: stateless и stateful.

    Stateless виджеты — это плюс-минус виджеты, которые не держат внутри себя логики, которая должна менять состояние виджета.

    В stateful виджетах есть функция setState (привет, реакт!). Ты меняешь state, и виджет перерисовывается.

    Но конечно, большое приложение на простых setState далеко не уедет, поэтому нужно решение стейт-менеджмента.

    Для Flutter есть несколько решений. Например, есть BloC паттерн, в котором используются стримы и события из источников данных, в них лежит бизнес-логика, которая провоцирует рождение новых событий. Эти события слушаются виджетами, и виджеты реагируют на изменения.

    Тем, кто приходит после React, может захотеться попробовать Redux. По идее, не должно возникнуть проблем, если вы писали на React, используя этот подход.

    Я пробовал оба подхода и в итоге выбрал третий. Приложение «Медузы» использует Provider. Это библиотека, которую написали не в Google, но интересно, что Google, попробовав Provider у себя, начал отказываться от своего BloC и даже решил повторить Provider как отдельную библиотеку. Но в итоге отказался от идеи повторять чужой код и начал использовать и поддерживать то, что родилось как open source.

    Устройство Provider довольно простое. Это виджет, внутри которого есть состояние. Это состояние меняется функциями, которые внутри вызывают notifyListeners(). Те виджеты, которые должны реагировать на изменения, находятся в дереве виджетов — они либо прямые дети Provider виджета, либо дети его детей. Когда notifyListeners() вызывается, дети получают через контекст новые значения и происходит rebuild.

    Обычно провайдеры объявляются в самом «верху» приложения, и можно использовать много провайдеров сразу — каждый отвечает за свою бизнес-логику.

    Сейчас мы используем восемь провайдеров, которые «слушаются» в разных местах приложения. Например, вот как работает провайдер закладок, благодаря которому читатели могут сохранять понравившиеся материалы, читать их офлайн и с одного и того же места на разных устройствах.

    На инстанс добавляется реакция на изменения документа из Firebase, который содержит ключи материалов, отложенных читателями в закладки. На каждый onChange этого документа обновляется связанная переменная в провайдере и вызывается notifyListeners. В результате все виджеты, которые слушают этот провайдер, показывают правильную иконку.

    Через провайдеры также сделано переключение темы приложения. У приложения есть ThemeProvider, который внутри себя содержит два инстанса тем — и, по сути, это просто Map с нашим неймингом цветов и самими цветами.

    В итоге правильный цвет приходит в виджет примерно так:

    TextSpan(
    	text: block['data']['first'],
    	style: TextStyle(
    		color: Provider.of<ThemeProvider>(context)
            .current
            .bodyFontColor,                            
      fontFamily: 'Proxima Nova',
    ));

    Код провайдера, если его упростить, будет таким:

    class ThemeProvider extends ChangeNotifier {
      CustomThemeData current;
      
      CustomThemeData blackTheme = CustomThemeData(
        name: 'black',
        bodyFontColor: Color.fromRGBO(184, 184, 184, 1),
        ...
      );
      
      CustomThemeData lightTheme = CustomThemeData(
        name: 'black',
        bodyFontColor: Color.fromRGBO(184, 184, 184, 1),
        ...
      );
      
      ThemeProvider(withTheme, withFontMultiplier, withAutoTheme) {
        theme = withTheme;
        autoTheme = withAutoTheme;
        current = withTheme == 'light' ? lightTheme : blackTheme;
      }
    }

    Соответственно, при изменении current переменной все без исключения виджеты, которые забирают цвета из темы, будут показаны правильно.

    Что дальше


    В последние недели мы активно тестировали новое приложение на группе из нескольких сотен читателей «Медузы». О том, как проходило тестирование, мы расскажем в отдельном материале, а я только отмечу, что Flutter оправдал все мои надежды. Да, ему есть куда развиваться, да, не все библиотеки feature-rich, но, наблюдая скорость, с которой это все движется, я, по крайней мере для себя, делаю вывод, что Flutter с «Медузой» надолго.
    Meduza: dev
    Мы разрабатываем «Медузу»
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 110

      0

      не подскажете, какая команда (размер, состав) участвовала в разработке? Что используете для рендеринга видео (не embedded youtube)?

        +11
        Именно в разработке — 1 человек. я написал и приложение и бекенд.
        Ютюб, твиттеры, фейсбуки и все эмбеды это webview встроенные в flutter
          0
          Как вы обошли проблему с клавиатурой в Android у webview, при эмебеде твиттеров, фейсбуков и пр.?
            0
            Не очень ясен вопрос. Но если что, мы стараемся не показывать эмбеды где нужна клавиатура. Это нам не очень нужно :)
            +2

            Тогда пользуясь случаем скину сразу список первых найденных багов на андроид:


            1. скролл какой-то тугой, ниже уже писали про это
            2. шапка сайта в эмбеде не тру + скачит логотип при загрузке видео
            3. шапка появляется и исчезает при открытии поста видео
            4. здесь вообще похоже на зацикливание обновления state. Эта проблема не позволяет просматривать пост. видео
              0
              Спасибо, конечно, но это старое приложение :)
              0
              А какие технологии/фреймворки у вас в бекенде?
                0
                ruby и немножко elixir
            +16
            Очень интересно посмотреть на сравнение жора ресурсов и батареи между новым приложением и старым. У меня все это использование не-нативных приложений почти всегда ассоциируется только с желанием создателей сэкономить деньги.
              +16
              Ну это очень правильная ассоциация :)
                –2
                А когда вы апгрейдили домашний или рабочий комп ради винды 7 и выше таких вопросов не было? А сейчас люди такое делают на РС даже ради одной игрушки. Сразу для минусаторов скажу — я их не поддерживаю
                  +6
                  А раньше люди апгрейдили комп ради Quake. Ничего не меняется.
                    +7
                    Вопрос про апгрейд чего-либо из-за каких-то приложений я не поднимал и он меня слабо интересует. Тем более вы не угадали как и почему я делаю апгрейды.

                    Я хочу знать насколько переход на не-нативные приложения ухудшает (или улучшает) производительность и потребление ресурсов устройства на примере двух реализаций одного и того же приложения. Не больше и не меньше.
                  +1
                  Если что, Provider не является «архитектурой» и уж точно никак не противопоставляется BLoC'у, Redux'у или MobX'у.
                  Это уже написано везде где только можно.
                  Также это слова самого создателя (по тайм марке):
                  www.youtube.com/watch?v=BulIREvHBWg&feature=youtu.be&t=107

                  Это просто альтернатива DI на стороне UI, не более.

                  По сути provider и появился из виджетов пакета `flutter_bloc` (попрошу заметить, не самой архитектурной либы `bloc`). Когда оказалось, что оберточка над путаным InheritedWidget это действительно то что нужно (это уже слова из шоу флатера на ютубе Widgets of the week).

                  Ну и да, BLoC это представленный подход гуглом, тут все верно. Только вот реализация и поддержка известной библиотеки `bloc` принадлежит не гуглу, а felangel (дискорд чата discord.gg/Hc5KD3g, гитхаб, думаю, проблем найти нет).
                  Ну и естественно от архитектуры в пользу виджета (компонента UI) никто не отказывался :DDD

                  В остальном — большие молодцы.
                  Такие success story это то что нужно с невероятной скоростью растущему комьюнити дарта и флатера.
                    +1
                    Вероятно я не очень правильно сформулировал, но я не пытался сравнивать архитектуры, а скорее рассказал о том, как я подошел к проблеме стейта в приложение.

                    Фразе «google начали отказываться от своего BloC» — про то, что на сколько я знаю они делали и делают внутренние проекты используя блок как паттерн (не конкретную библиотеку) и начали уходить в строну использования просто provider (он же InheritedWidget) youtu.be/d_m5csmrf7I
                      0
                      Не совсем понятно, как вы все-таки организовали хранения стейта… Провайдер всего лишь передает некие объекты по дереву виджетов…
                    +2
                    А почему не подошёл React Native?
                      +8
                      Может быть, потому что ReactNative очень медленный по сравнению с flutter. Flutter реально очень быстрый.
                        +2
                        Да, там нужно прям точить апи так чтобы было не много хождения данных между js и нативными слоями. Плюс когда я пробовал его там были приколы с неподдержкой части js и странные штуки при работе js на android / ios. Но я не исключаю варианта, что это я что-то не так делал)
                      +1
                      Текущая версия грешна долгоживущими багами (например, тултипы появляются не рядом с текстом, а где-то в самом конце статьи далеко за пределами экрана), которые никто не фиксит годами. Поэтому очень жду новую версию на пощупать.
                        0
                        На андроиде новая версия точно доступна. Правда почему-то как новое приложение.
                          0
                          Meduza X, уже во всех апсторах страны.
                            0
                            Мне сразу было интересно, исправлен ли этот баг и я специально искал достаточно объёмные новости со сносками, чтобы проверить это. Кажется, что исправлен. По крайней мере у меня сноски появляются корректно, рядом с текстом.
                            +6
                            Пробовали React Native и Ionic, думали про подход Basecamp — все в веб + тонкая нативная прослойка, даже порывались пойти в сторону Progressive Web App и остаться веб-онли.

                            Хотелось бы чуть больше узнать про то почему другое не зашло. (я сам выбрал Ionic так как нужно было и web версию)


                            И как там сейчас у Flutter с web представлением?

                              0
                              Они пилят веб и пилят десктоп. Я пару раз собирал just for fun приложение под веб и под mac — было забавно, но пока нам это не нужно.

                              Не зашло просто потому что это дело вкуса :)
                                0
                                И как там сейчас у Flutter с web представлением?

                                Более менее норм, AMP странички вообще на ура кажет, быстро и качественно
                                +1

                                А можете рассказать поподробней про ваш api и формат ответа от сервера? Это что-то похожее на html, только в виде json, в котором вы можете двигать разные компоненты? Или вы двигаете их через кастомные параметры которые загружаете при старте приложения? Интересно было бы посмотреть как это выглядит

                                  +1
                                  Я думаю что попозже напишу про это. Но общая идея такая: meduza.io/api/f1/news/2020/05/13/deputaty-gosdumy-nachali-nosit-otpugivayuschie-virus-znachki

                                  В общем случае есть массив, который содержит «блоки» — так мы называем единицу «контента»

                                  {type: "p", data: ["t": "text", "v": "...."]}

                                  Это структура рендерится мапом в коллекцию виджетов (их сложность определяется необходимостью — это может быть просто Container, может быть сложный виджет, где есть состояния и тд)

                                  html используется только для эмбедов, из него собирается микро страничка, которая рендерится через webview.

                                  Ну и комбинации этих блоков могут быть любыми. То есть это все может рендерится рекурсивно.
                                    0

                                    У Spotify похожий подход, по крайней мере был пару лет назад. Для того чтобы динамически управлять структурой вьюх для разных юзеров на основе их предпочтений и поведения. Посмотрите их, может чего полезного найдется.

                                  +6
                                  На иос по привычке потянулся в левый верхний угол чтобы вернуться к предыдущему экрану, а стрелка назад оказывается внизу слева. Иногда при скролле замечал просадку фпс на iphone 8 plus. В итоге, продолжил пользоваться старым, просто потому что привык к нему.
                                    +2
                                    Оо, за кнопку возврата назад внизу экрана — отдельное огромное спасибо Султану. Наконец-то большой айфон перестанет падать на лицо.
                                      +5
                                      Так привык к свайпам уже давно, что не помню когда приходилось где то тыкать на кнопку назад
                                      +5
                                      Нет ли в планах выложить в open-source код приложения?
                                        +3
                                        Нет :)
                                          –1
                                          почему нет?
                                            0

                                            А почему да? Что они выиграют от того, что приложение, заточенное на их бэкенд, станет opensource?

                                              –1
                                              Лучи добра от сообщества, помощь из вне.

                                              Чем больше, опенсорса, тем лучше:
                                              # У людей появляется хороший пример использования технологии
                                              # У команды потенциально появляются контребьютеры
                                                0

                                                Так а кто станет контрибьютить в хрень, которая не работает без бэкенда, на реализацию которого нужно убить полгода?

                                                  –1
                                                  котребьютить могут и через баг репорты. Ну и интеграционные тесты никто не отменял.
                                        +2
                                        поздравляю с релизом!)
                                          +2

                                          Спасибо за статью, активно пользуюсь приложением со старта тестирования (старым тоже пользовался) на андроиде — на мой взгляд, фреймворк прекрасно отрабатывает сам задачи в приложении! Удачи Вам и успехов в улучшении приложения!

                                            +2
                                            Ребята, спасибо за статью! Ждем вас на DartUP (dartup.ru) в этом году. Надеюсь, все нормализуется, и встретимся лично :)
                                              +5
                                              чем такое приложение лучше сайта?
                                                +22

                                                Больше возможностей для слежки, то есть аналитики, и показа рекламы. А, или вы спрашивали чем лучше для пользователей?

                                                  0

                                                  именно такое — оффлайн режимом. В метро очень актуально. Второе — установка из магазина — не все пользователи захотят заморачиваться добавлением на главный экран

                                                    0
                                                    именно такое — оффлайн режимом

                                                    т.е. приложение сразу получает полный текст новостей и хранит его?
                                                      0
                                                      Если добавляешь запись в закладки — да. Можно большие публикации добавлять в закладки, чтобы читать в моменты, когда интернет недоступен, либо слабодоступен.
                                                      0
                                                      Так а зачем оно вообще на главном экране, в любом виде?
                                                        0
                                                        Большинству удобно добавить иконку, а не вбивать ссылки в браузере.
                                                        Я например так сделал с facebook — PWA ничего не весит, не бесит оповещениями.
                                                          0
                                                          Зачем вбивать? У вас в браузере нет закладок? Быстрого вызова на странице новой вкладки?
                                                            0

                                                            Зачем делать путь дольше, если можно быстрее и проще? Особенно если таких сайтов куча. Но это вкусовщина, тут каждому свое — у меня куча сайтов иконками сделана.

                                                        0

                                                        Так можно просто сайт сделать PWA и получить всё тоже самое.

                                                      +1

                                                      Устанавливая новое приложение, больше всего опасался, что оно будет тормозить, поскольку чаще всего после таких обновлений на не нативные версии только замедление работы и наблюдал. Но оказалось, что визуально оно даже быстрее старого работает, время «холодного старта» только, кажется, чуть-чуть увеличилось.
                                                      Спасибо, большую работу проделали, наконец-то дождался этого обновления.

                                                        +4
                                                        Противоположные впечатления, не то чтобы оно тормозит, но привычная плавность пропала, в некоторых сценариях откровенная дерготня. Это на не самом последнем iphone xs, досадно
                                                        0
                                                        Только ли у вас firebase?
                                                          +9

                                                          Немного оффтоп, про:


                                                          Поскольку и Dart, и Flutter поддерживаются одной компанией, это дает возможность менять язык под нужды Flutter. Насколько я знаю, обе команды активно взаимодействуют друг с другом, поэтому в языке постоянно появляются фишки, позволяющие писать более приятный код на Flutter.

                                                          Ох, уже была грустная история, когда язык менялся под нужны фреймворка и стал с ним ассоциироваться. И вне фреймворка этот язык стал никому не нужен… Наверное, многие догадались, что речь про Ruby и Ruby on Rails.

                                                            0

                                                            И каким же образом Ruby менялся под нужны Rails? На сколько я знаю, Matz наоборот вставлял им палки в колеса. Rails Team сами добавляли нужный им функционал. Да и наличие патчей railsexpress опять же говорит об обратном.

                                                              0

                                                              Не помню, чтобы Ruby менялся под RoR.
                                                              А вне Web (кроме RoR используют еще Sinatra и еще несколько других) он слабо используется потому, что просто качественных либ/фреймворков для остального так и не смогли написать:


                                                              • не глючных Gui нет, емнип
                                                              • альтернативу NumPy начали писать, но догнать не могут (не глворя уже об Apache Arrow).

                                                              Как мне кажется, есть две причины:


                                                              • В руби всем нравится гибкость в написании DSL. А в областях, где исторически менее принято использовать DSL, гибкость руби становится не очень нужной.
                                                              • это глубоко имхо, но рубишный GC вставлял палки в колёса. Для GUI люди ошибались с привязкой рубишных объектов с элеметами ui, в результате получали трудновоспроизводимые баги. А для вычислений, отложенное освобождение не позволяет хорошо следить за потреблением памяти (хотя Julia как-то с этим справляется).

                                                              В обоих случаях питоновский RC оказался более удобным: менее error prone в GUI и более предсказуемым в числодробилках.

                                                              +4

                                                              Зачем нужно приложение если есть браузер?

                                                                +1
                                                                Я ради подкастов скачал (но их можно слушать и в других местах, конечно).
                                                                Ещё именно у Медузы в браузере есть баг — в режиме «показывать по порядку» новости часто появляются с задержкой. Переключишься в «редакторский» режим — новость есть, обратно — нет. А иногда бывает и вовсе ничего не грузится — шапка и подвал, а ленты нет.
                                                                  0

                                                                  Не пробовал, если честно, по-порядку. Подкасты вообще тяжелый случай — это надо отвлечься на это время и слушать, а некогда.


                                                                  Вот интересно, есть ли какие агрегаторы у "профессиональных" потребителей новостей и востребован ли такой продукт, который а-ля rss reader вырежет все кроме нужного в статье, каталогизирует и версионирует правки

                                                                    0
                                                                    Ещё именно у Медузы в браузере есть баг — в режиме «показывать по порядку» новости часто появляются с задержкой.

                                                                    Так может лучше этот баг пофиксить, а не только новое приложение для мобилок запилить? Тем более что этот баг там с момента разделения новостей «по порядку» и «по важности»
                                                                  +4
                                                                  Сейчас же можно вынести сайт в отдельный значок приложения. Будет запускаться браузер без навигации.
                                                                  Отдельное приложение жрет память и батарею, может висеть фоном.

                                                                  Для новостного сайта это сомнительное решение.

                                                                  Для меня лично новостными источниками стали каналы в телеграмме. Нет необходимости отдельно что-то запускать и загружать, всё в одном месте и только то что меня интересует.
                                                                    +3

                                                                    Хотел быстро перейти в начало ленты и нажал на системные часы, как это работает во всех приложениях на iOS, но ничего не произошло

                                                                      0
                                                                      Да, это есть в задачах — будет фикс.
                                                                        0

                                                                        плюсую, у меня андроид с оболочкой flyme, где такая возможность на уровне системы реализована (с нативными приложениями)

                                                                          +2
                                                                          Репортил об этой проблеме еще с первой беты в закрытом тесте еще в марте =(
                                                                          +6
                                                                          К сожалению, новое приложение на iOS имеет некоторое количество крайне раздражающих проблем.
                                                                          Самая большая — пока не закончится предыдущая анимация горизонтального скролла или выхода из новости, жесты вертикального скролла просто игнорируются. Я привык закрывать новость жестом и сразу прокручивать экран вниз, и каждый раз впадаю в ступор, когда скролл просто не происходит, будто приложение зависло.
                                                                          Сам горизонтальный скролл между «табами» слишком чувствительный, регулярно случайно перелистываю, а при возврате обратно теряется положение в списке новостей.
                                                                          Отсутствие привычной навигации в верхнем левом углу компенсируется «почти нативным» жестом от края экрана, но почему эта навигация присутствует на экранах настроек?
                                                                          Чекбоксы настройки оповещений, изменяющие своё состояние только после ответа от сервера (примерно через секунду) создают впечатление промаха по нему или зависания.
                                                                          На айпаде в портретной ориентации список новостей выглядит узкой колонкой по центру с большими чёрными полями. Этим даже можно было бы как-то пользоваться, если бы поля откликались на вертикальный скролл, но ими можно только свайпать между «табами».
                                                                          Скролл списка новостей регулярно пропускает фреймы даже на последнем айфоне.
                                                                          Про то, насколько плохо работает редактирование текста в «обратной связи» можно написать эссе.

                                                                          В старом приложении тоже было достаточно проблем, а новое действительно работает быстрее. Но если улучшений не будет, а старое приложение умрёт, то лично у меня просто не будет удобного способа регулярно читать медузу, текущим я не могу пользоваться.
                                                                            0
                                                                            Почему всё-таки не стали использовать progressive web application? Просто разрывает любопытство.
                                                                              0
                                                                              Возможно, потому что на iOS поддержка PWA только-только перешла из противозачаточного состояние в зачаточное?
                                                                                +2
                                                                                Можно поподробнее: что не работает?
                                                                              +1
                                                                              телефон Huawei P10Lite зашел на плей маркет, скачал приложение. Сразу сверху сообщение что приложение обновилось. Типа скачайте по этой ссылке, перекинуло на другое приложение которое тоже скачал, тем интереснее сравнить было/стало. Если Первое было не знаю на чем, на нативное не очень похоже, но на моем телефоне очень сильные лаги при скроле :( прям задержки, дергания. На Flatter версии вообще скролл не привычный, такой более медленный, и FPS как будто меньше :( не привычно немного.
                                                                                +3
                                                                                Лагает новое приложение на iPhone Max, это вроде не слабый телефон. Скроллинг. Нижнее меню меняется и сбивает с толку, эта задумка сродни творению от Мегафона «eMotion» где нижнее меню вообще не предсказуемо. Это плохо. Надо равняться на лучшие решения и интерфейсы. Пока двоечка. Не нативно и противно.
                                                                                  0
                                                                                  Было бы круто увидеть небольшой пример реализации вашей верстки на основе API. В целом все понятно, но тонкость как всегда в реализации)
                                                                                    +2
                                                                                    Так что я решил подождать, пока Flutter подрастет
                                                                                    и пока не делать приложение?
                                                                                      +2
                                                                                      Сравнил старое и новое приложение по плавности на своем андройде. Старое приложение открывается за 1 секунду, новое 3 секунды. Притом иконка М которая появляется при открывании приложения дергается, может это конечно фича). При переходе назад из новости есть подергивания.

                                                                                        +3

                                                                                        iPhone 5se. Новое приложение тормозит при скроллинге как ленты новостей, так и текста новости.

                                                                                          0

                                                                                          Кмк, с redux-ом там все не очень хорошо, из-за маленького комьюнити. В общем оно все работает привычно после react-а и даже можно redux devtools подрубить, что просто великолепно, но в соотв. либе есть косяки, которые не фиксят очень долго из-за чего приходится страдать. Однако больше всего опечалила необходимость поддержки адовых copyWith, hashCode и ==. Очень не хватает аналога immutable.js.


                                                                                          В итоге для небольшого приложения, если не хочется оверхеда кода bloc/redux, то удобно юзать streambuilder-ы и хранить все потоки в каком-нить синглтоне, model и viewmodel по вкусу :)


                                                                                          Отдельно убил момент, что rxdart оказывается никакой не rx, работает там все иначе, а последнее время и именуется иначе. Нафиг было "занимать" такое имя библы, собирались вроде переименоваться, но так и не переименовались.


                                                                                          Еще если надо много работать с нативным слоем, то где-то года полтора назад (сейчас может ситуация изменилась) у меня оверхед получался в 20-50мс при вызове java/kotlin методов, на телефоне среднего уровня.
                                                                                          Т.е. в нативном слое читаем диск, декодим, получаем bytearray, пуляем его во flutter, там он нам доступен через 20мс. От размеров bytearray (менял в несколько раз) время почти не зависело.


                                                                                          Но в целом flutter очень нравится!

                                                                                            0
                                                                                            почему не mobx?
                                                                                              0

                                                                                              Да можно и mobx, но я его не пробовал во flutter. По сравнению с redux, наверное, вопрос вкуса и специфики задачи. По сравнению с bloc — аналогично, но на стороне bloc большее кол-во инфы в инете. По сравнению с кондовым вариантом "стримбилдеры+все нужные стримы в синглтоне", у последнего существенно меньше дополнительного кода, что, кмк, плюс для простого приложения.

                                                                                            +1

                                                                                            Новое приложение—это то, что вынудило подписаться на телеграмм-канал Медузы. Специально оставил два приложения (старое и новое), для того чтобы сравнить, и новое лагает очень сильно. К изменениям во взаимодействии с пользователем со временем можно привыкнуть и оно покажется удобным, но двигающийся рывками интерфейс и огромные серые куски в половину экрана с текстом «Реклама» (без картинок и рекламы) немного раздражают. А по поводу большого экрана: на айфоне всегда можно дважды тапнуть по кнопке Home, чтобы пододвинуть к большому пальцу верх экрана.

                                                                                              +1

                                                                                              Спасибо за статью. А вы не могли бы подробнее рассказать как достигается фича "быстро убрать или добавить компонент" с сервера?

                                                                                                0
                                                                                                Большая уважуха за то что сделали.
                                                                                                Но тут конечно Flutter дает и минусы — многие люди привыкли к определенным эффектам операционки, Flutter приложения будут выглядеть «чуть по другому» и придется потратить время чтобы это все компенсировать.
                                                                                                  0
                                                                                                  Google, попробовав Provider у себя, начал отказываться от своего BloC

                                                                                                  В InheritedWidget вроде бы нет проверки aspect для элементов как в InheritedModel, может сказаться на скорости выполнения.

                                                                                                  Если для виджета как зависимости указаны два провайдера возможен ли вызов didChangeDependencies только когда изменения наступили в обоих провайдерах? Или элемент в дереве будет пересобираться каждый раз когда изменится один из провайдеров?
                                                                                                    0
                                                                                                    А на чем написан основной сайт? На чем бекенд, какой фронт, делаете ли вы ssr для ботов?
                                                                                                      0
                                                                                                      react, ssr да, сайт берет json из http json api
                                                                                                      +2
                                                                                                      К сожалению, вынужден присоединиться к негативным отзывам.

                                                                                                      Вчера утром скачал новое приложение. Основная мысль: почему все стало так плохо? А вот и ответ подоспел – использование псевдонативного веба вместо натива.

                                                                                                      А всегда любил приложение «Медузы» за прекрасный дизайн и отзывчивость интерфейса. Что мы имеем в новом приложении:

                                                                                                      * Торможение прокрутки и общая неотзывчивость.
                                                                                                      * Нерабочий тап вверху экрана, чтобы перейти наверх.
                                                                                                      * Нерабочий жест «назад» в настройках.
                                                                                                      * Нерабочая прокрутка с помощью перемещения скроллбара.
                                                                                                      * Тормозные, не плавные элементы интерфейса, например, переключатели (специально сравнивал с нативными).

                                                                                                      В общем, для меня это очередное подтверждение, что натив — прекрасен, а все эти webview’шные псевдонативы — фигня. Извините.
                                                                                                        +1
                                                                                                        flutter это не веб
                                                                                                          0
                                                                                                          Не веб, здесь я ошибся. Но и не натив.
                                                                                                          И тормоза элементов интерфейса и прочие перечисленные проблемы это не отменило.
                                                                                                        0
                                                                                                        Ужасное приложение получилось на андроиде:
                                                                                                        — Лаги при прокрутке
                                                                                                        — Лаги при открытии статей с большим кол-вом медиа
                                                                                                        — Не умеет открывать ссылки на статьи (очень нужная для меня фича, т.к. я обычно переходил в приложение из телеграмма)
                                                                                                        — Не умеет открывать ютуб видео в приложении ютуба (по тапу на заголовок видео, в нативном приложении всё работало)
                                                                                                        — Иконка шаринга из iOS (ну позор жи)

                                                                                                        Вы экономите на опыте юзера, плохо такими быть.
                                                                                                          0
                                                                                                          Я думаю это скорее косяки первой версии, исправят, тут ничего фундаментального нет — эти недостатки — точно не свойства Flutter
                                                                                                            0
                                                                                                            А я и не говорю что это косяки flutter'а, я сейчас не как андроед дев бомблю, а как юзер, которому стало сильно не удобно с новым приложением =(
                                                                                                            Год писать, тестировать и в итоге не поддерживать диплинки, это очень по наплювательски, я бы себе такого не позволил (фича делается за один рабочий день максимум — по крайней мере в нативе)
                                                                                                              0
                                                                                                              Я думаю что как раз из-за того что фича на день — и отложили в бэклог. Для одного человека на год, да еще с бэком и управлением контентом описанным — отличный результат.
                                                                                                                0
                                                                                                                Ну такое, зачем тогда было торопится с релизом и выпускать сырую версию?
                                                                                                                  0
                                                                                                                  Я думаю это зависит от процессов в компании и приемки — видели ли их дизайнеры эту версию, раз несколько сотен тестирующих сказали что им ок — ну значит уже для большинства ок.

                                                                                                                  Я тоже думаю она вполне норм для выпуска, я бы правда перед выпускам показал бы «пиксельным придирам» — которые бы все это ненативное отметили бы, но может их тупо в медузе и не было.
                                                                                                                –1
                                                                                                                Если вы, прочитав статью сделали вывод, что оно писалось год, то я могу порекомендовать прочитать статью еще разок.
                                                                                                            +1
                                                                                                            Несколько вещей, сразу бросаются в глаза

                                                                                                            — Нельзя выделить текст
                                                                                                            — Почему-то подергивается что-то при скролле на главной и при открытии новой статьи — видимо нужна фоновая подкачка или что-то типа того.
                                                                                                            — Очень какой-то тугой свайп назад на статье — привычная моторика ломается — я привык при определенном усилии что оно уже свайпнулось, а тут — назад отъезжает, как будто недотянул
                                                                                                            — Почему-то пропускает жесты на главной — я тэпаю на картинку, а редирект только со второго раза
                                                                                                            — Стрелка «назад» внизу — понимаете, на Android она и так есть, аппаратная, а на iOS все привыкли свайпать, я думаю лучше такие вещи не придумывать, как бы артдиректор не просил :)

                                                                                                            Но в целом приложение очень понравилось, шустрое, клевое, я думаю быстро все исправите
                                                                                                              0
                                                                                                              Это огромная проблема Flutter — — Нельзя выделить текст. Особенно для Flutter Web ;-)
                                                                                                                0
                                                                                                                Да вы чо? Обалдеть

                                                                                                                Хотя я вот погуглил — есть же виджет — api.flutter.dev/flutter/material/SelectableText-class.html

                                                                                                                Или не подходит?

                                                                                                                Я правда совсем не Flutter разработчик, на React-Native пишу, пока облизываюсь в сторону Flutter
                                                                                                                  0
                                                                                                                  Это огромная проблема Flutter — — Нельзя выделить текст. Особенно для Flutter Web ;-)

                                                                                                                  Это не так, у нас есть как мобильные, так и web приложения написанные на Flutter и текст там очень хорошо можно выделять.
                                                                                                                    0
                                                                                                                    Вот смотрите — ничего не выделяется gallery.flutter.dev/#/shrine. Для web выглядит ужасно.
                                                                                                                    Выделять текст на кнопках может быть не самое важное, но в тексте в галлерее.
                                                                                                                      0
                                                                                                                      Вот смотрите — ничего не выделяется gallery.flutter.dev/#/shrine. Для web выглядит ужасно.
                                                                                                                      Выделять текст на кнопках может быть не самое важное, но в тексте в галлерее.

                                                                                                                      Вполне возможно что здесь: gallery.flutter.dev/#/shrine выделять текст и не планировалось.

                                                                                                                      Вот так выглядит выделение текста с flutter в web:
                                                                                                                      image
                                                                                                                +2
                                                                                                                Баг (iPhone SE, возможно и на других): если в карточке есть релевантная новость, то с каждым переходом все глубже через эти новости приложение начинает больше и больше лагать. На 4м уровне вложенности новостей приложение спокойно зависает. А если хотя бы на 2-3+ уровне свернуть и развернуть, то приложение зависает намертво. Как будто с каждым переходом прошлая вьюха не чистится и все также продолжает слушать скроллы и т.п, из-за этого дикие лаги.
                                                                                                                  0

                                                                                                                  Подтверждаю и не на SE: после трёх вложенных экранов и перехода на «морду» приложение зависает наглухо: не скроллится, не работают кнопки. Но и не крэшится, хотя если течёт, то тут лучше бы падало.

                                                                                                                    0

                                                                                                                    Интересно, текущая память—это особенность фреймворка вообще или неправильная реализация при имеющихся гайдлайнах?

                                                                                                                    0
                                                                                                                    Иконки в приложении очень низкого качества. Что использовали для них?
                                                                                                                      +1
                                                                                                                      про кнопку назад — крайне неудобное расположение, меняет весь привычный опыт использования на негативный. А так же из коробки имеются прекрасные жесты от левого угла экрана — интерактивное смахивание вправо для возврата на предыдущий экран без кнопок и прочего, при использование UINavigationController конечно)
                                                                                                                      Но в целом — flutter символизирует просадки фпс, не родные элементы (нажатия highlight), отскоки у скроллов и таблиц, куча чего еще инородного, что для обычного пользователя вызывает некое отторжение и в целом приложение смотрится из-за этого дешево.
                                                                                                                        0

                                                                                                                        Новое приложение не понравилось, лагучее и неприятное (SE 1 поколения, 13.4.1).
                                                                                                                        Поставил себе на рабочий стол ярлычок на веб-страницу.

                                                                                                                          0
                                                                                                                          Рассматривался ли xamarin?
                                                                                                                            0
                                                                                                                            нельзя подкасты скачивать, и хранить в приложении, только слушать стрим.
                                                                                                                            Подписываться в основном приложении я не хочу, так как слушаю их только выборочно.
                                                                                                                            Так что стало хуже.

                                                                                                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                                                            Самое читаемое