Программирование : Dart & Flutter по-русски
Dmitry Bannikov
На телефоне обработка сенсора самое слабое место
Dmitry Bannikov
Обычное касание обрабатывается 0.1 - 0.2 сек
Dmitry Bannikov
А тут скрол
Denis Vasilchenko
Это в дебаг режиме?
Dmitry Bannikov
Это на телефоне
Denis Vasilchenko
Ну на телефоне можно запустить в дебаг режиме, можно в релиз, можно в профайл
Dmitry Bannikov
На компьютере там другой телефон
Dmitry Bannikov
Без сенсора и без настоящих касаний
Denis Vasilchenko
По умолчанию запускается в дебаге, он не оптимизирован под анимации
Dmitry Bannikov
Такой еще нормальный
Dmitry Bannikov
А если к нему еще что нибудь добавить то какания станут заметно тупыми
kk boomer
Можно сделать виджет с клавиатурой и выдвигать так, хд. Шутка, вроде на эту тему тут уже говорили и вроде как анимировать выдвижение клавы нельзя
Michael Lazebny
ой как мило)
Michael Lazebny
В андроид студии progress bar
RgiN©
Ну типо да я тоже так думаю, мб просто в скафолде есть волшебный ключик который этим управляет
Michael Lazebny
только добавил туда Dash)
kk boomer
Нету, может есть либа с кастомными клавами, и то я сомневаюсь
Ivan
[
{
"type": "link",
"text": "https://t.me/rudart/421125"
},
" вроде вот оно"
]
RgiN©
Та ну это уже костыли как на меня) Если конечно нормально этим вопросом не заняться ??
kk boomer
Зато будет ахереная анимация, да и вообще сможешь управлять клавой как тебе хочется, хоть пусть радугой переливается
Batyrzhan uulu
Есть мыслм как реализовать?
Michael Lazebny
charts_flutter/syncfusion charts
Batyrzhan uulu
не могу понять как сделать по неделям и месяцам(
Batyrzhan uulu
ну что б еще с пон начиналось
Имя
[
{
"type": "link",
"text": "https://t.me/flutter_dev_v"
}
]
Имя
Всем привет! Подскажите стоит ли использовать бжкенд вукомерс для магазина?
Mansur Mansur
добрый вечер
Mansur Mansur
не могу избавиться от этой ошибки
Andrey Unger
расскоментируй вторую строку в Podfile
Dima Kotlyarov
Я тооолько только починил это
Dima Kotlyarov
М1 чип купил себе. Долго получался. Если не ушибаюсь проблему даёт гуглмапс
Dima Kotlyarov
М1 чип и проблема с Google mPs ?
Mansur Mansur
Да у меня доже м1
Dima Kotlyarov
Понятно.сейчас напишу
Dima Kotlyarov
первым делом - удали лок файл. 2 шаг открой терминал с помощью розетты(в апликейшене ищи его - уже можно по другому но я пока только так смог) дальше переходи в папку иос. пиши sudo gem install ffi
Dima Kotlyarov
дальше pod install
Dima Kotlyarov
flutter build ios
Dima Kotlyarov
Это не то . Он по дефолту сам сделает 10 версию. Скажи пожалуйста ты не помнишь к в иос эмуляторе поставить координаты где я нахожусь
Ivan
как тебе первое впечатление?
Dima Kotlyarov
Я лучшего не щупал
Dima Kotlyarov
Объективно дорого . Но билд в дебаге 23 секунды
Dima Kotlyarov
Моё время радуется. Эмулятор работает быстро , не тормозит. Не греется
Michael Lazebny
ты прошку взял?
Dima Kotlyarov
Да . Но разницы нет с аэиром
Dmitry
ребят, есть вот такой класс с дженериком не могу понять почему он его как dynamic считает причем в клиентском коде он правильно видит тип, т.е. дженерик работает как надо но ошибка валится не пойму почему
Mansur Mansur
Что то совсем не получается
Dima Kotlyarov
Хз , я тоже долготмучался . Много всего сдела , но получилось
Dmitry
[
"разобрался\nмало ли кому пригодится\nесли используете generic в stateful виджетах, то нужно вот так делать\n",
{
"type": "code",
"text": "class _MyWidgetState extends State> {"
},
""
]
Mansur Mansur
А это что за команда
Aleksey Kharitonov
[
"Попробуй это: ",
{
"type": "link",
"text": "https://pub.dev/packages/fl_chart"
},
"\n\nПо неделям и месяцам - просто логику опиши, типа “если значений хватает на неделю - покажи кнопку с неделями, если хватает на месяц - покажи ещё кнопку с месяцами», а дальше если месяц показываешь - считай неделями среднее арифметическое и показывай"
]
Aleksey Kharitonov
Это в Xcode задавать надо, там где-то есть симуляция: либо конкретные координаты, либо едешь на велике, либо на машине…
ilx13
[
"Доброго утро. \n",
{
"type": "pre",
"text": "FirebaseMessaging.onMessage.listen((RemoteMessage message) async {...}",
"language": ""
},
"\nвот так поймаю событие пуша для андроид. но это не срабатывает для ios.\nпуш приходит для ios, но не срабатывает мое событие.\nне знаете почему?"
]
Aleksey Kharitonov
[
"Привет!\nВ main.dart определи следующее:",
{
"type": "code",
"text": "\n\nFuture _firebaseMessagingBackgroundHandler(RemoteMessage message) async {\n // If you're going to use other Firebase services in the background, such as Firestore,\n // make sure you call `initializeApp` before using other Firebase services.\n await Firebase.initializeApp();\n\n print(\"Handling a background message: ${message.messageId}\");\n}\n\nvoid main() async {\n WidgetsFlutterBinding.ensureInitialized();\n\n await Firebase.initializeApp();\n FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);\n\n// other code\n}"
},
""
]
Aleksey Kharitonov
Либо настройки iOS проекта не сделал
ilx13
[
{
"type": "pre",
"text": "import UIKit\nimport Flutter\nimport Firebase\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n override func application(\n _ application: UIApplication,\n didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n ) -> Bool {\n if #available(iOS 10.0, *) {\n UNUserNotificationCenter.current().delegate = self\n let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]\n UNUserNotificationCenter.current().requestAuthorization(\n options: authOptions,\n completionHandler: {_, _ in })\n } else {\n let settings: UIUserNotificationSettings =\n UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)\n application.registerUserNotificationSettings(settings)\n }\n application.registerForRemoteNotifications()\n FirebaseApp.configure()\n GeneratedPluginRegistrant.register(with: self)\n return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n }\n}",
"language": ""
}
]
Aleksey Kharitonov
Это AppDelegate, а тебе нужно в настройках проекта включить background refresh (кажется) и remote messages
ilx13
ааа, эти две включил. мне пуши приходят
ilx13
не удается поймать событие.
ilx13
[
"например при получении пуша на андроиде у меня срабатывает:\n",
{
"type": "code",
"text": "FirebaseMessaging.onMessage.listen((RemoteMessage message) async {"
},
"тут делаю некоторые задачи",
{
"type": "code",
"text": "}"
},
"\nэтот же метод не работает на ios."
]
ilx13
пуш просто приходит.
Aleksey Kharitonov
У меня в виджете с сообщениями в initState следующее: FirebaseMessaging.onMessage.listen((RemoteMessage message) => showMessage(message: message)); FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) => showMessage(message: message));
Aleksey Kharitonov
[
"void showMessage({required RemoteMessage message}) {\n print('Got a message whilst in the foreground!');\n print('Message data: ${",
{
"type": "link",
"text": "message.data"
},
"}');\n\n if (message.notification != null) {\n print('Message also contained a notification: ${message.notification!.body}');\n showNewMessageAlert(context: context);\n }\n }"
]
ilx13
и это работает? на ios и на андроиде?
Aleksey Kharitonov
Работает
ilx13
хорошо спасибо. с этим позже разберусь. у вас приходит пуш если приложение запущено?
ilx13
мой приходит только когда закрыто или свернуто. мне нужно чтобы при включенным тоже пришел пуш
Aleksey Kharitonov
Как раз этот метод и выполняется при новом уведомлении если приложение запущено: showNewMessageAlert(context: context);
Aleksey Kharitonov
От сюда
Aleksey Kharitonov
[
"У меня вот какой: ",
{
"type": "code",
"text": "\n\n\nimport UIKit\nimport Flutter\nimport Firebase\nimport UserNotifications\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n\n override func application(\n _ application: UIApplication,\n didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n ) -> Bool {\n \n FirebaseApp.configure()\n \n if #available(iOS 10.0, *) {\n // For iOS 10 display notification (sent via APNS)\n UNUserNotificationCenter.current().delegate = self\n\n let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]\n UNUserNotificationCenter.current().requestAuthorization(\n options: authOptions,\n completionHandler: {_, _ in })\n } else {\n let settings: UIUserNotificationSettings =\n UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)\n application.registerUserNotificationSettings(settings)\n }\n\n application.registerForRemoteNotifications()\n\n GeneratedPluginRegistrant.register(with: self)\n return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n }\n}"
},
""
]
ilx13
хорошо. но тут не срабатывает слушатель вообще. хотя бы print('receive push'); не работает
ilx13
сейчас с вашим попробую
Aleksey Kharitonov
Может в main.dart не инициализировал?
ilx13
инициализирован. а то на андроид не пришел бы. так?
ilx13
[
{
"type": "pre",
"text": "WidgetsFlutterBinding.ensureInitialized();\n await Firebase.initializeApp();\n\n FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(\n alert: true,\n badge: true,\n sound: true,\n );",
"language": ""
}
]
Aleksey Kharitonov
Там с андроидом как то иначе работает, как будь то бы уже вшит частично. Но могу ошибаться
ilx13
с вашим кодом тоже. когда запущено не приходит. когда свернуто приходит.
Aleksey Kharitonov
[
"У меня не так. В виджете сообщений в initState:",
{
"type": "code",
"text": "\n\nFirebaseMessaging messaging = FirebaseMessaging.instance;\n\n @override\n void initState() {\n messaging\n .requestPermission(\n alert: true,\n announcement: false,\n badge: true,\n carPlay: false,\n criticalAlert: false,\n provisional: false,\n sound: true,\n )\n .then((settings) {\n print('User granted permission: ${settings.authorizationStatus}');\n\n if (settings.authorizationStatus == AuthorizationStatus.authorized) {\n print('User granted permission');\n } else if (settings.authorizationStatus == AuthorizationStatus.provisional) {\n print('User granted provisional permission');\n } else {\n print('User declined or has not accepted permission');\n }\n });\n\n// other code\n}"
},
""
]
Aleksey Kharitonov
[
"Почитай ещё раз тут: ",
{
"type": "link",
"text": "https://firebase.flutter.dev/docs/messaging/usage/"
},
"\n\nМожет что упустил"
]
Stepan Eticon
Кто нибудь сталкивался с подобной проблемой?
Stepan Eticon
Исправил, достаточно было перезагрузить студию 3 раза
Umid Aliyev
[
"Привет \n \n",
{
"type": "hashtag",
"text": "#вопрос"
},
" \nСначала данные из api были загружены для виджетов, потом юзер начал сколлить вниз а потом обратно вверх, когда он доходить до верха, данные из api еще раз загружаются, происходить rebuild \n \nКак можно использовать keepAlive в NestedScrollView . Пожалуйста подскажите"
]
Amirlan Aubakirov
Ребят всем привет как называется функция если потянуть вниз страницу она обновляется
Дмитрий Щербаков
Сделать кеш и не страдать ;)
I V ?-N
Выглядит как противоядие
/
всем привет. Есть htlm element с css свойством left: 2. Как увеличить его на единицу?
Валерий
вроде народ проснулся, попробую еще раз вопрос повторить) кто нибудь имел дело с анимацией при вставке и удалении элемента в грид вью, можете подсказать в каком направлении рыть?
I V ?-N
RefreshIndicator?
I V ?-N
По айди получаешь элемент, и меняешь css style
/
[
"Сразу говорю по башке не бейте первый день смотрю Dart. Сам питонист и там как то проще. Можно сделать типо el.style.left += 1 и все. А тут у меня целый велосипед вышел. Где я туплю? \n",
{
"type": "pre",
"text": "box.style.left = '0';\n for (var i = 1; i < 20; i++) {\n var left_prop = box.style.getPropertyValue('left');\n var left_count = int.parse(left_prop.substring(0, left_prop.length - 2));\n box.style.left = (left_count + 1).toString();\n }",
"language": ""
},
""
]
/
[
{
"type": "pre",
"text": "left_prop.substring(0, left_prop.length - 2)",
"language": ""
},
" так я убираю 'px' чтобы оставить число"
]
/
Проще как то можно все это сделать?
/
надо увеличивать на 1 в цикле
I V ?-N
Ты просто хочешь это оптимизировать?
/
просто неведомо много кода вышло чтобы просто свойство на 1 увеличить в цикле
/
ну если вариантов нет так и поступлю, просто я думал может я херню делаю
Amirlan Aubakirov
Наверн,спасибо)
I V ?-N
От части да)) Но для такой фигни - соответственно такой же подход)
Adel Gilyazeev
У виджета включаешь тикер... Запускаешь его при инициализации. Делаешь анимацию появления. Удаление элемента делаешь через него же... Запускаешь анимацию у этого виджета и по окончанию анимации удаляешь из общего списка данных
Adel Gilyazeev
Стейтфул виджет кароч
Валерий
Немного не то, нужно смещение элементов анимированное при вставке и удалении
Adel Gilyazeev
Поподробнее... Ты хочешь управлять анимацией элемента не самим элементом?
Adel Gilyazeev
У тебя элемент появляется, у него начинает работать анимация, можешь задать шоб его бокс увеличивался со временем до нормальных размеров... Там вроде есть виджет который задаёт анимацию изменения размеров...
Валерий
[
{
"type": "link",
"text": "https://github.com/flutter/flutter/issues/60738"
},
" хочу примерно это."
]
Валерий
Делегат сразу ведь задаёт при билде ширину в зависимости от количества элементов на оси
Валерий
Но мысль зародилась вроде какая то, спасибо, щас сяду пробовать
Влад
Есть готовое приложение на Котлине (запускается сервер и при запросе на него отображает уведомление) Как это готовое приложение правильно перенести во Флаттер? Через каналы само взаимодействие будет Если например таких приложений 2 и более на нативке, как их правильно интегрировать во Флаттер? Мб есть какие-то статьи ? (где большой проект, не один файлик .java, .kt)
Umid Aliyev
Спасибо хорошо
/
[
"Заглянул в стандартную либу, а там вот ",
{
"type": "pre",
"text": "@JSName('animate')\n Animation _animate(Object effect, [timing]) native;",
"language": ""
},
" что означает native?"
]
d
CustomScrollview + Slivers
Илья Высоцкий
Как добавить функционал к кнопке back в текстфилде?
Aleksandr
подскажите как при нажатии на пуш открыть приложение, пуши от onesignal
Michael Bazilique
автоматом
Michael Bazilique
а вот уже лендинг на страницу нужно парсить OSNotification
Artur
В пушах Firebase указывается уникальная строка, которая прописывается и в приложении. В OneSignal должно быть что то похожее
Илья Высоцкий
Нет, у меня ввод цифр, и мне надо при нажатии этой кнопки обработать действия
Максим Юдеев
Подскажте пожалуйста, у меня есть bloc который получает данные с api, как мне проверять на наличие нового в блоке?
Artur
BlocBuilder либо BlocListener
Michael Bazilique
в oneSignal ничего не надо для откр. апки....
Artur
А, там есть свойство keyboard Input Action или что то в этом роде
Максим Юдеев
если я в listener добавлю по типу state is LoadedState где у меня получаются данные, он будет обращаться постоянно к api?
Aleksandr
так вот не открывает
Artur
А само действие вешай на onSubmit
Michael Bazilique
кликаешь целиком на нотификацию или на кнопку?
Aleksandr
кнопку добавить?
Максим Юдеев
если я в listener добавлю по типу state is LoadedState где у меня получаются данные, он будет обращаться постоянно к api?
Michael Bazilique
глянь есть ли в конфиге сервиса await OneSignal.shared .setInFocusDisplayType(OSNotificationDisplayType.notification);
Artur
Нет, он будет ждать пока не не придёт новый state
Artur
[
{
"type": "link",
"text": "bloclibrary.dev"
}
]
Aleksandr
говорит нет такого метода
Michael Bazilique
какая версия oneSignal SDK
Aleksandr
setAppId только стоит
Michael Bazilique
[
{
"type": "pre",
"text": "OneSignal.shared.setLogLevel(OSLogLevel.verbose, OSLogLevel.none);\n\n await OneSignal.shared.init(_oneSignalKey, iOSSettings: {\n OSiOSSettings.autoPrompt: false,\n OSiOSSettings.inAppLaunchUrl: false\n });\n await OneSignal.shared\n .setInFocusDisplayType(OSNotificationDisplayType.notification);\n\n await OneSignal.shared.promptUserForPushNotificationPermission(fallbackToSettings: true);\n\n var playerId = await getPlayerId();",
"language": ""
}
]
Максим Юдеев
Вот у меня как раз проблема то что у меня BlocConsumer в котором BlocListener слушает ошибки и из этого state не выбирается, я не знаю как мне сделать так чтобы у меня проверялось на наличие response-а
Vyacheslav
[
"всем привет! Кто работал с GRPC плагином ",
{
"type": "link",
"text": "https://pub.dev/packages/grpc"
},
"\nОшибка такого плана: не отправляет запрос в версии андроид. При этом айос отрабатывает как надо\nНет никаких условий на платформу, просто обычный запрос."
]
Aleksandr
[
{
"type": "link",
"text": "https://documentation.onesignal.com/docs/flutter-sdk"
}
]
Aleksandr
и метода инит тоже нет
Aleksandr
другую поставить?
Michael Bazilique
а в pubspec.yaml какая версия?
Artur
Не совсем понял. Ты слушаешь изменения в Firestore в блоке?
Максим Юдеев
можно в личку написать?
Michael Bazilique
у меня onesignal_flutter: ^2.6.2
Aleksandr
да, они что то убрали часть методов
Michael Bazilique
попробуй так, может они под капотом поменяли шото
Michael Bazilique
с откр. апки
Michael Bazilique
ток не забудь flutter clean
Aleksandr
пишут над опользовать setNotificationOpenedHandler
Aleksandr
если прила закрыта
Aleksandr
setNotificationReceivedHandler если открыта
Aleksandr
а как вызвать открытие что то не пойму
Michael Bazilique
OneSignal.shared.setNotificationOpenedHandler( (OSNotificationOpenedResult result) async {}
Michael Bazilique
надо парсить result
Michael Bazilique
но прикол в том, шо саму апку откр. без хендла
Aleksandr
так не открывает же в этой версии))
Aleksandr
да, открывает если добавить метод
Aleksandr
setNotificationOpenedHandler
Григорий
Всем привет, кто знает что такое mini patcher для андроид и как от него защититься во флаттере, он вызывает функцию успешной оплаты в гугле, а деньги не списывает ?
Aleksey Kharitonov
Всем привет! Вопрос про bloc на кубитах: есть репозиторий в котором есть методы получения сообщений из базы, разные методы (наприме один дергает сообщения по id пользователя, другой по id дома). вопрос: надо ли создавать стейты и кубит для этого репозитория? я же могу просто обратиться к инстансу репозитория и вытащить метод. или надо к репозиторию только через кубит обращаться?
amanov
Ребята всем доброго дня Подскажите пожалуйста что мне использовать чтобы при нажатии на каждую кнопку информация отображалась внижу там где отмечено оранжевом, то есть не переходила на другую страницу а вызвала на тот же экран
Владислав
Не нужен отдельный кубит для репозитория, репо просто знает как получить данные а кубит не хочет этого знать потому просто его использует
Aleksey Kharitonov
[
"тебе надо создать виджет в котором будешь обновлять информацию которая будет в квадрате. например так:\n",
{
"type": "pre",
"text": "\nString text = '';\n\nEtevatedButton(child: ...button 1..., onPressed() => setState(() => text = 'new text 1');\nEtevatedButton(child: ...button 1..., onPressed() => setState(() => text = 'new text 2');\nEtevatedButton(child: ...button 1..., onPressed() => setState(() => text = 'new text 3');\nEtevatedButton(child: ...button 1..., onPressed() => setState(() => text = 'new text 4');\n\nContainer(child: Text(text));\n",
"language": ""
},
"\n\nпри нажатии на кнопку у тебя будет обновляться текст в контейнере"
]
Aleksey Kharitonov
спасибо
Aleksey Kharitonov
[
"то есть нет смысла делать так:\n```\nMessageCubit? _messageCubit;\n\n",
{
"type": "mention",
"text": "@override"
},
"\nvoid initState() {\n _messageCubit = ",
{
"type": "link",
"text": "context.read"
},
" ();\n super.initState();\n}\n\nList messagesForHouseList = await ",
{
"type": "bold",
"text": "_messageCubit."
},
"messagesRepository.messageListForHouse(houseId: houseId);\nList messagesForOwnerList = await ",
{
"type": "bold",
"text": "_messageCubit."
},
"messagesRepository.messageListForOwner(ownerId: owner.objectId!);\n\n```\n\n?"
]
Владислав
если MessageCubit нужен только как мост до репозитория - нет
SlavikG
какой формат даты использовать если мне нужно вывести "36 минут назад"
Aleksey Kharitonov
[
"удачи! но это не best practice юзать ",
{
"type": "code",
"text": "setState()"
},
", лучше используй архитектурные решения"
]
Aleksey Kharitonov
спасибо
Владислав
а разница у тебя в DateTime хранится?
Aleksey Kharitonov
final dateFormat = DateFormat('HH');
SlavikG
[
"разница я так полагаю ",
{
"type": "link",
"text": "datetime.now"
},
""
]
Kerim
[
"Рекомендую \"Дурак Онлайн\"\n",
{
"type": "link",
"text": "https://play.google.com/store/apps/details?id=com.rstgames.durak"
},
""
]
Kerim
Сколько по времени займет такая же игра
Alex Fokin
[
"кто нибудь работал с api spotify? Почему во время запроса GET ",
{
"type": "link",
"text": "https://accounts.spotify.com/authorize"
},
" приходит ошибка, что токен не предоставлен, хотя по факту в этом запросе он не нужен"
]
Michael K
свой вопрос стираю, простите, тупанул
Jeka
Всем привет, как вызвать стейт текущего блока из подписки на другой блок?
Владислав
[
{
"type": "link",
"text": "DateTime.now"
},
"().difference(date);\nвернет Duration у него есть .inMinutes - его форматировать"
]
Jeka
просто через кубиты вызываешь просто функцию, а через стейты я чет не могу понять как
BaLaBa Dmitriy
Привет всем подскажите как можно реализовать такое поведение У меня есть page 0, page 1, page 2 Захожу с page 0 -> page 2 Хочу pop с page 2->page 1->page 0 Page 0 это главный скрин Можно такое реализовать ?
Владислав
из того что я понял - никак)
Jeka
серьезно только через кубиты?
Владислав
смотря что ты хочешь, я не особо понял
|