Расскажи про задачи, которые не смог решить с первого раза

«Расскажи про задачи, которые не смог решить с первого раза» — вопрос из категории Софт-скиллы, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

Одна из сложных задач была связана с реализацией высокопроизводительного кастомного графика для отображения реальных финансовых данных. Проблема заключалась в лагах при скроллинге и масштабировании большого набора точек (десятки тысяч) с помощью CustomPainter.

Первоначальный подход и проблема: Я использовал Canvas.drawPoints(PointMode.points, pointsList, paint). На слабых Android-устройствах при взаимодействии FPS падал ниже 30. Профилирование в Dart DevTools показало, что основное время тратилось на перерисовку всего холста и преобразование данных в List<Offset> при каждом кадре.

Решение и итерации:

  1. Кеширование отрисованного кадра: Использовал RepaintBoundary для виджета с графиком, чтобы изолировать его перерисовку от остального UI.
  2. Оптимизация CustomPainter: Реализовал умную логику в shouldRepaint, чтобы перерисовывать только при изменении ключевых данных (например, видимого диапазона), а не при каждом обновлении анимации контроллера.
    @override
    bool shouldRepaint(ChartPainter oldDelegate) {
      return oldDelegate.visibleRange != visibleRange ||
             oldDelegate.dataPoints != dataPoints;
    }
  3. Оптимизация данных для отрисовки: Вместо передачи всех точек, я стал вычислять и передавать в paint только те точки, которые попадают в видимую область, используя бинарный поиск по отсортированному массиву. Это резко сократило объем вычислений.
  4. Использование PictureRecorder для статичного фона: Элементы графика, которые не меняются (сетка, оси), я отрисовал один раз в Picture и затем просто кешировал его, перерисовывая только динамические данные (линию графика).

Вывод: Задача научила меня глубоко анализировать производительность через DevTools, понимать стоимость операций отрисовки и применять стратегии кеширования на разных уровнях — от данных до графических примитивов.