Flutter Pulse
515 subscribers
329 photos
716 links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
6 способов копирования списков и карт в Dart

Привет, разработчики Flutter! 👋

В Dart существует несколько способов копирования списков и карт. Давайте рассмотрим шесть наиболее популярных методов:

1. Использование json decode/encode - клонирование без сохранения ссылки

   List newList = json.decode(json.encode(oldList));
Map newMap = json.decode(json.encode(oldMap));


2. Использование оператора spread - клонирование без сохранения ссылки

   List newList = [...oldList];
Map newMap = {...oldMap};
HashMap newMap = HashMap.from({...oldMap});


3. Использование фабрики from - копирование ссылки на значение

   List newList = List.from(oldList);
Map newMap = Map.from(oldMap);


4. Использование метода addAll - копирование ссылки на значение

   List newList = []..addAll(oldList);


5. Использование пакета built_collection - не создает копию, а возвращает обертку с возможностью записи при изменении

   var builtList = [1, 2, 3].build();
builtList = builtList.rebuild((b) => b..addAll([7, 6, 5]));


6. Использование пакета fast_immutable_collections

   final IList<String> oldList;
var newList = IList.orNull(oldList);


Эти методы помогут вам эффективно работать со списками и картами в Dart. 👍

Оцените нашу новую рубрику и напишите в комментариях, что хотите видеть в следующих постах! 💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #codingtips #mobiledevelopment #programming #FlutterTips #DartLang
Flutter советы - Как обрезать изображение

Привет, разработчики! 👋 Сегодня мы рассмотрим простой, но полезный совет по Flutter - обрезку изображений! 📸✂️

Вы когда-нибудь сталкивались с необходимостью обрезать изображение в вашем приложении Flutter? 🤔 Это может быть полезно для создания миниатюр, улучшения композиции или просто для придания приложению более аккуратного вида. 💁‍♀️

Решение: Используйте виджет ClipRect! 🎉



Container(
alignment: Alignment.topCenter,
child: ClipRect(
child: Image.asset(
'assets/04.jpg', // Путь к изображению
width: 400, // Ширина изображения
height: 400, // Высота изображения
fit: BoxFit.none, // Не масштабировать изображение
alignment: Alignment.topCenter, // Выравнивание по верхнему центру
),
),
)



В этом примере мы используем виджет Container с выравниванием по верхнему центру. Внутри контейнера мы размещаем виджет ClipRect, который обрезает изображение до указанного размера. Изображение загружается из assets с помощью виджета Image.asset. Мы устанавливаем ширину и высоту изображения в 400 пикселей и отключаем масштабирование с помощью BoxFit.none. Выравнивание изображения также установлено по верхнему центру.

Результат: Изображение будет обрезано до указанного размера, создавая аккуратный и чистый вид в вашем приложении. 🌟

Оцените нашу новую рубрику и оставьте свои комментарии! 💬 Понравился ли вам этот совет?👍

Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #AppDevelopment #UIUX #CodingTips #ImageCropping #FlutterTips
Ускорьте свой код Flutter с помощью инлайн-компиляции

Привет, разработчики Flutter! 👋 Сегодня мы поделимся с вами полезным советом, который поможет вам оптимизировать производительность вашего приложения. 📈

Что такое инлайн-компиляция? 🤔
Инлайн-компиляция - это техника, позволяющая компилятору Dart встраивать функции непосредственно в место их вызова, исключая накладные расходы на вызов функции. 🔄

Пример использования 💻
Рассмотрим пример кода, где мы определяем класс MyDataClass с методом forEach, помеченным аннотацией @pragma('vm:prefer-inline'):

typedef ForEachIterator = void Function(int x, int y);

class MyDataClass {
final int height;
final int width;
final List<List<double>> _data;

MyDataClass(this.width, this.height, this._data);

@pragma('vm:prefer-inline')
void forEach(ForEachIterator it) {
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
it(x, y);
}
}
}
}



В функции main мы создаем экземпляр MyDataClass и вызываем метод forEach:

void main() {
// ... инициализация данных как вам нужно
var myDataClass = MyDataClass(30, 50, data);
myDataClass.forEach((x, y) {
print("$x,$y");
});
}



Результат 🔍
После компиляции код будет преобразован в:

void main() {
// ... инициализация данных как вам нужно
var myDataClass = MyDataClass(30, 50, data);
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
print("$x,$y");
}
}
}



Вывод 💡
Использование аннотации @pragma('vm:prefer-inline') позволяет компилятору встроить метод forEach непосредственно в место его вызова, что может значительно повысить производительность вашего приложения. 🚀

Оцените нашу новую рубрику и поделитесь своими мыслями! 💬
Все подобные новости вы можете найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #PerformanceOptimization #CodingTips
Сравнение объектов Dart
Понимание equals и hashcode 🤔

Зачем это нужно? 🤔
Хэш-код - это целое число, связанное с каждым объектом.
Он облегчает хэширование для структур данных, таких как HashMap 🗺️

Чтобы сравнить два экземпляра класса Person, нам нужно переопределить == и hashcode 🔄

Как сгенерировать? 🛠️
- package equatable 📦
- IntelliJ или Android Studio - опция генерации 💻
- package freezed ❄️


class Person {
const Person(this.name);

final String name;

@override
bool operator ==(Object other) =>
identical(this, other) ||
other is Person &&
runtimeType == other.runtimeType &&
name == other.name;

@override
int get hashCode => name.hashCode;
}


Оцените новую рубрику FlutterPulseTips! 👍👎
Все подобные новости можно найти по хэштегу #FlutterPulseTips 🔍
#flutter #dart #flutterpulse #FlutterPulseTips #DartTips #MobileDevelopment #CodingTips
1
Зачем использовать ключ виджета?

Ключи виджетов в Flutter: когда и почему они нужны? 🤔

В большинстве случаев вам не нужно использовать ключи... но есть ситуации, когда они крайне полезны! 😎

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

Ключи необходимы для:
- клонирования состояния виджета между несколькими страницами/вкладками 📑
- изменения порядка виджетов внутри списка 🔄
- сохранения позиции прокрутки 🕳️
- идентификации виджетов и их состояния 🔍
- идентификации для тестирования 🧪

Ключ позволяет Flutter связать элемент из elementTree с виджетом 🔗



class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
@override
Widget build(BuildContext context) {
// Используем ключ для сохранения состояния
return KeyedSubtree(
key: ObjectKey('my_unique_key'), // Уникальный ключ
child: MyStatefulChild(),
);
}
}



Если вы поменяете местами два виджета с ключами в дереве виджетов, Flutter также поменяет их местами в дереве элементов 🔄

Оцените нашу новую рубрику и напишите ваше мнение в комментариях! 💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #WidgetKeys #FlutterTips #AppDevelopment #UIUX #CodingTips
Извлечение границ из изображения
Привет, Flutter-разработчики! 👋 Сегодня мы поделимся с вами интересным способом обработки изображений с использованием пакета Image в Dart. 📸

Используем пакет Image для извлечения границ
Пакет Image в Dart предоставляет мощные инструменты для обработки изображений. Одним из интересных применений этого пакета является извлечение границ из изображений. 🔍

Как это работает?
1. Применяем ядро Лапласа ко всем пикселям изображения с помощью функции свёртки (convolution function).
2. Ядро Лапласа помогает выделить границы на изображении, применяя определённую матрицу фильтра к каждому пикселю.

Пример кода:

import 'package:image/image.dart' as img;

// Декодируем изображение из данных
var photo = img.decodeImage(data.buffer.asUint8List());

// Определяем фильтр (ядро Лапласа)
var filter = [
0, -1, 0,
-1, 4, -1,
0, -1, 0,
];

// Применяем свёртку к изображению с использованием фильтра
photo = img.convolution(photo, filter, div: div, offset: offset);


Этот код демонстрирует, как можно использовать функцию convolution из пакета Image для применения ядра Лапласа и выделения границ на изображении. 🔮

Оцените новую рубрику и напишите в комментариях, насколько она вам полезна! 💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #ImageProcessing #CodingTips
Определение платформы, на которой запущено приложение

Flutter потрясающий... работает на Android, iOS, Web, Windows, Linux, macOS.

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

Пример кода:



import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

class PlatformUtils {
static bool get isDesktop => defaultTargetPlatform == TargetPlatform.windows ||
defaultTargetPlatform == TargetPlatform.linux ||
defaultTargetPlatform == TargetPlatform.macOS;

static bool get isMobile => defaultTargetPlatform == TargetPlatform.android ||
defaultTargetPlatform == TargetPlatform.iOS;

static bool get isWeb => kIsWeb;
}




Важно: Не импортируйте dart:io, если планируете использовать приложение на web, так как dart:io недоступен на web. Вместо этого используйте flutter/foundation.

Оцените новую рубрику по Flutter советам 🤔💡! Ваши отзывы помогут нам сделать контент еще лучше 👍. Все подобные новости можно найти по хэштегу #FlutterPulseTips.

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #CrossPlatform #CodingTips #DevTips
👍2👌1