Программирование : Dart & Flutter по-русски
Gleb
Мне нужно подключить уже готовую, скомпиленную либу. Как я понял это можно сделать через плагин
Олжас Сулеймен
[
{
"type": "link",
"text": "https://flutter.dev/docs/development/platform-integration/c-interop"
}
]
Gleb
да, я про это как раз. может быть у кого-то есть примеры таких плагинов?
Gena E
[
{
"type": "link",
"text": "https://github.com/dart-lang/samples/tree/master/ffi"
}
]
Gena E
я по ним делал свой ffi плагин
Javokhir
Hi, is there english flutter community ?
Алексей Анисов
модель in-app purchases так не работает. можно оформить это типо как магазин и проводить это как обычные покупки в инете, если проканает конечно
Алексей Анисов
либо делать подписку на все сразу
Игорь Корнелли
в России тоже stripe какой-нибудь используется?
Алексей Анисов
можно ввести внутр. валюту и за нее продавать, тогда сервер нужен
northelks
да, либо через сonsumable
Алексей Анисов
можешь тогда просто несколько tier цен создать и за них продавать лекцию\курс на бекенде
Алексей Анисов
и бекендом рули какой из имеющихся tier надо для каждой лекции
Алексей Анисов
самый ближайший по цене выбираешь просто
Алексей Анисов
ну это если эпл, на андроиде вроде можно прописать любой ценник
northelks
[
"там у них есть что-то вроде вот этого ",
{
"type": "link",
"text": "https://help.apple.com/app-store-connect/#/dev1f52cd4dd"
},
""
]
northelks
насколько это подходит для "хранения покупок" и какие данные они хранят, а какие нет - тут нужно смотреть
northelks
но мне что-то подсказывает, что лучше всё хранить у себя на бэке
northelks
с non-renewing они точно не сохраняют у себя прошёл ли срок подписки или нет.. и это нужно проверять у себя на бэке
Serge Shkurko
Кто-нибудь посоветует хорошую библиотеку с introduction (onboarding) виджетами по примеру той что на скриншоте?
Алексей Анисов
Создай несколько покупок типо PriceLow, PriceMedium, PriceHigh, и в зависимости от цены на лекцию выдавай ид продукта который нужно купить, потом на беке отмечай что купили лекцию, а продукт консьюмишь чтобы юзер потом смог еще раз купить
Gorohov Valeriy
Валюта покупаемая через встроенные покупки, типа игровой валюты, а контент покупается за эту валюты.
Алексей Анисов
цен можешь создать хоть 10 штук
Gorohov Valeriy
Это дает простор для различных акций, когда можно будет дарить валюту за активные действия.
Gorohov Valeriy
"Приведи друга и получи 10% от суммы его первой покупки"
Gorohov Valeriy
А зачем невидимо?
les forest
Добавь свою либу в иос часть проекта флаттера и обращайся к ней через platform channel в appController
Gorohov Valeriy
Такое через внутренние покупки не прокатит.
les forest
Мне проще было самому сделать на pageView
Serge Shkurko
а оверлей виджеты
les forest
Не совсем понял. Можно пример попо дробнее)))
Serge Shkurko
[
{
"type": "link",
"text": "https://pub.dev/packages/flutter_introduction_tooltip"
}
]
Serge Shkurko
[
"нашел вариант по лучше \nмэйби кому пригодится ",
{
"type": "link",
"text": "https://pub.dev/packages/showcaseview"
},
""
]
Gorohov Valeriy
У любой внутренней покупки должна быть указанная стоимость, на лету ее менять не выйдет, создавать +100500 покупок удовольствия мало, группировать товары по ценам как предложил Алексей выход, но каждая новая группа будет требовать новую версию приложения в app store
admin
То что нужно, спасибо??
Gleb
я верно понимаю, что нативный код не важно в каком виде он лежит придется дорабатывать, чтобы он умел общаться через platform channel?
Алексей Анисов
если поменять цену у уже существующей покупки то без релиза можно, если добавляешь новую то надо релизить
Алексей Анисов
опять же про андроид не уверен
Алексей Анисов
может там без релиза получится
CrazyAlarmClock
[
"всем привет, кто знает как починить?) ",
{
"type": "pre",
"text": "FileSystemException: FileSystemException: writeFrom failed, path = '' (OS Error: Broken pipe, errno = 32)",
"language": ""
},
""
]
Maxim Terehov
Привет всем!!!
Maxim Terehov
Можете подсказать начинающему: Использую FutureBuilder, при ините то что передаю во future: не получает данные, и вылетает ошибка method on null, Через несколько секунд ошибка пропадает и данные отображаются
Maxim Terehov
Могу показать фрагмент кода
les forest
Дорабатывать ничего не нужно. Просто импортируешь в ios/Android проект и обращаешься к нужным классам
Урусай
[
"У меня тут проблемка странная. \nСтрою ListViewы. \nЗахотел я, что бы в нём разделители были не только между элементами списка, а ещё и снизу и сверху. Захотено - сделано! Всё работает. \nЗахотел я сделать переключение этих самых ListViewов между собой. Захотено - сделано! Всё работает. \nА потом мне захотелось финтиплюшек, и я добавил в это переключение Slide анимацию. Захотено - сделано! \n\nИ вот тут я столкнулся со странной ошибкой. \nЕсли происходит переключение на экран, где элементов в ListView не достаточно что бы покрыть весь экран в высоту, вываливается ошибка \"'package:flutter/src/rendering/sliver_multi_box_adaptor.dart': Failed assertion: line 663 pos 16: 'indexOf(child) == index': is not true.\"\nПричём если убрать последний Divider, то проблем нет. Плюс ко всему, список то переключается, то есть как бы если не смотреть в логи то проблем нет\nГлянет может кто нибудь 100 строчек кода?\n\n",
{
"type": "link",
"text": "https://gist.github.com/urusai88/448bb4144c57dd52dce145e96d0141bb"
},
""
]
Gleb
Вот не могу сообразить, как это сделать :( нет примера?
les forest
Гугли flutter platform channels
les forest
Там пример более чем подробный
Наиль Гилазиев
[
"Кто встраивал flutter в существующее приложение, подскажите и подкиньте идею: Не могу сообразить как из flutter закрыть FlutterActivity(получается себя же). \nHost приложение по кнопке запускает FlutterActivity. \nрегистрируем GeneratedPluginRegistrant - channel между flutter и хостом налажен: хост и flutter могу вызывать код друг друга без проблем. \nхост запускает FlutterActivity так\n",
{
"type": "pre",
"text": "startActivity(FlutterActivity.withCachedEngine(\"my_engine_id\").build(this)",
"language": ""
},
"\nВ окне флаттера есть традиционно для Android в AppBar кнопка *Back*\nЕсли нажимаю на системную кнопку Back окно FlutterActivity закрывается и мы возвращаемся в Activity хоста. Как сделать такое же поведение по нажатию на кнопку Back в AppBar'е flutter?"
]
Maxim Terehov
ссылки нельзя на pastebin?
Roman Verhoturov
Всем привет! У кого-нибудь был опыт с созданием карт зданий в flutter? Или можете что-нибудь посоветовать почитать ?
Alexander Vinogradov
A value of type 'Type' can't be assigned to a variable of type 'NativeType'. Try changing the type of the variable, or casting the right-hand type to 'NativeType'.
Alexander Vinogradov
что с этим делать?
Alexander Vinogradov
ахах да
Денис
Народ подскажите можно ли поставить breakpoint на изменения переменной внутри класса? перерыл весь код нигде не обнуляю переменную а она в итоге null
Денис
я хочу найти что ее обнуляет
Денис
assert у меня и жалуется что она null я не могу поймать момент когда она становится null
Alexander Vinogradov
The operator '<' isn't defined for the class 'Type'. Try defining the operator '<'.
Alexander Vinogradov
а тут как в NativeType?
Денис
я уже обернул в setter и дебажу через него, поймаю какая дрянь его меняет и верну назад)
Alexander Vinogradov
[
{
"type": "code",
"text": "Pointer .fromAddress(0)"
},
" кастыляется"
]
A1ex Petrov (К)
Мужики: не в курсе от чего такая ошибка? " [VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: NoSuchMethodError: The method 'findAncestorStateOfType' was called on null." Выкидывает при переходе на новый экран.
Денис
Мистика какая-то) Внутри Bloc хранится объект класса Order у которого есть Map products. c помощью SetProductsEvent я передаю products в order. во время всех ивентов в дебаге products : Map(1 items) как только приходит event SendOrder - products в ордер резко становится Map(0 items);
tdesc
храните внутри блока обсервабл и сливайте все в стримы. избавитесь от геммороя
???????
Новый rx ушел от понятия Observable)
???????
Теперь это ванильный Stream расширенный через method extensions)
Денис
[
"поскажите при\n ",
{
"type": "pre",
"text": "Map a = { \"key\":1};\nMap b = a;",
"language": ""
},
" \nесли я изменю a я же не изменю b?"
]
???????
Дартпад для чего?)
Денис
та я подумал о нем когда уже написал
tdesc
мне и на старом норм )
Денис
вот где собака зарыта
???????
Давай) А то вы зачастую вопрос пишите дольше, чем написали бы в дартпаде)
???????
А вот так её отрыть
Денис
конечно жесть как нелогично все это)
???????
Более чем логично
???????
Просто вам надо понимать, где вы передаете значение, а где ссылку
???????
Яб не отказался, еслиб такие вещи можно былоб указывать явно в дарте (заодно мог бы ругаться и тыкать не только в типизацию).
???????
Кстати, бонусом hint, вы можете создать свой класс расширив BaseMap и сделать значения иммутабельными если они таковыми и должны являться.
Денис
типо Map* ? мне просто это напомнило студентческие попытки в c++
???????
Да, сложные классы тут передаются всюду по ссылке
???????
По значению передаются примитивы типа num и String
Денис
6 месяцев на дарте и тут всплывает такой факт) ни разу не встречался с такими проблемами)
???????
Ну ты в функции точно также передаешь вещи
???????
Изменишь в функции сложный объект, он изменится и выше по стеку
Денис
это понятно я просто считал что A = B это A = new B (примерно)
Денис
буду теперь осторожнее с тем что и куда передаю) Спасибо за помощь
???????
Ну да, тебе для этого надо копировать значения
???????
Почти у всего, есть фабрика .from() или .copyFrom()
Денис
кстати есть ли быстрый способ сделать фабрику copyFrom для класса? а не писать простыню с назначением каждого параметра? у Map понятно forEach а вот для классов?
???????
Хз, мб кодогенерация какая есть.
???????
[
{
"type": "pre",
"text": "import 'dart:collection' show MapBase;\n\nclass A extends MapBase {\n final Map _map = {}; \n Iterable get keys => this._map.keys;\n void clear() => this._map.clear();\n int remove(Object key) => key is String ? this._map.remove(key) : null;\n int operator [](Object key) => key is String ? this._map[key] : null;\n void operator []=(String key, int value) =>\n (this._map.containsKey(key) \n ? UnsupportedError('Ohuel?') \n : this._map[key] = value);\n @override\n String toString() => this._map.toString();\n}\n\nvoid main() {\n A a = A();\n a['key'] = 1;\n a['key'] = 2;\n print(a); // {key: 1}\n}",
"language": ""
}
]
???????
Просто как пища для размышлений)
petyappetrov
ребят а как оттипографить текст в Text? То есть я хочу чтобы между некоторыми словами не было разрыва никогда. Текст: "Об этом 24 января сообщили в пресс-службе Департамента транспорта и развития дорожно-транспортной инфраструктуры города" Так я делал в вебе: "Об этом 24 января сообщили в пресс-службе Департамента транспорта и развития дорожно-транспортной инфраструктуры города"
???????
Ну так неразрывный пробел и попробуй)
???????
А вообще RichText мб поможет с тонкой кастомизацией
???????
Их там штук 6 неразрывных пробелов
petyappetrov
а как оно выглядит в дарте?
???????
Это юникодовский символ
petyappetrov
ок пошел копать спс
???????
[
{
"type": "link",
"text": "https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%80%D0%B0%D0%B7%D1%80%D1%8B%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB"
}
]
???????
Ну или RichText мучай (хотя в твоем случае это выглядит как оверкил)
petyappetrov
спасибо! ох уж эта мобильная разработка, все по другому
???????
Неразрывные пробелы шо там шо там, прост ты по неизвестной науке причине, чото его HTML мнемонику решил засунуть, а не его самого)
???????
[
{
"type": "pre",
"text": "void main() {\n final String nbsp = String.fromCharCode(0160);\n String result = 'Мама мыла раму. '\n .replaceAll(' ', nbsp);\n print(result);\n}",
"language": ""
},
""
]
Yerassyl
ребят если во время загрузки данных из сервера произошёл таймаут (я поставил 10 сек), что потом советуете сделать? и что можно показать юзеру
???????
ну таймаут отлавливается чере try catch, а еще лучше через then()
???????
Там есть обработка исключений
Roman Cinis
В Варшаве закончились птички. Наших было много, успели ухватить?
???????
А что делать - уже твоя смекалочка должна сработать. Зачастую можно слать еще запрос, можно вывести снизу уведомление
???????
А, ну и у таймаута есть параметр с обработкой исключения, чего это я)
Yerassyl
[
"вот код ? \nможешь оценить =) \n BaseOptions options = BaseOptions(\n baseUrl: 'url', //base server url\n connectTimeout: 10000, // 10 sec.\n receiveTimeout: 10000,\n method: method,\n headers: {'Authorization': 'Bearer ' + accessToken},\n contentType: 'application/json',\n );\n\n Dio dio = Dio(options);\n Response response;\n try {\n response =\n await dio.request(path, queryParameters: requestParams, data: body);\n print('==== $path nc-drm ++++++ $response');\n\n return ",
{
"type": "link",
"text": "response.data"
},
";\n } on DioError catch (error) {\n print(' --- req main errors +++++++++ $error');\n return error;\n }"
]
???????
У dio наверняка есть родной обработчик таймаутов
???????
И мидлварь у него 100% есть.
???????
[
"Ну и даже если не найдешь, то всегда можешь както так:\n",
{
"type": "pre",
"text": " return dio.request.catchError((Object error) {\n // Обработчик ошибок\n });",
"language": ""
},
""
]
???????
Тобишь тебе не надо делать свою функцию async и пользовать await
???????
А сразу возвращать будущее и обрабатывать ошибки (но повторюсь, у dio наверняка есть родной обработчик ошибок)
Yerassyl
да, ясен?? а вот как ты показываешь ошибку в UI ?
???????
[
"А вот такие вещи\n",
{
"type": "code",
"text": "print('==== $path nc-drm ++++++ $response');"
},
"\nуже лучше выносить в мидлварь, советую разобраться с ним.\nПо сути это то из за чего dio и стоит брать, ультимативная вещь"
]
???????
Ну я флатер давным давно не открывал. Но делай как и остальные - выводи всплывающее сообщение об ошибке (например в snackbar'е)
???????
Или какойнить виджет, что соединение потеряно и реконнект через N секунд (так телега делает, например)
???????
И за перехватом ошибок http запросов - тебе снова в мидлварь dio)
???????
[
"Гугли ",
{
"type": "code",
"text": "Dio Interceptors"
},
""
]
???????
Это избавляет от кучи проблем, лишних проверок и прочего бойлерплейта после каждого запроса
???????
Ну и бонусом, вместе с dio просто офигительно заходит пакет retrofit
Yerassyl
вот у меня есть future метод, где вытаскиваю лист и ее передаю в futurebuilder. Вот хотел в futurebuilder поймать и показать ошибку, получая snapshot.hasError. Если так сделаю насколько это нормально?
???????
Яб вообще не пользовался бы FutureBuilder'ами. Для всего этого больше подходят StreamBuilder'ы
???????
Ну и естественным образом вытекающие из этого всякие стейтменеджеры
???????
Но с FutureBuilder тоже проканает, если прям совсем начинающий и стримы тебе еще пока не дались)
Yerassyl
ну пока между ними вижу тока 1 разницу, стримбиулдер слушает 1 раз и биулдит виджеты, а вот фучебиулдер делает это каждый раз. и можно просто изменить в коде stream: getList().asStream() и все, как думаешь?
???????
StreamBuilder делает это постоянно
???????
Ну или я неправильно понял
Yerassyl
StreamBuilder( stream: responseServiceDetail.asStream(), builder: (BuildContext context, AsyncSnapshot snapshot) { вот если так заменю с futureBuilderом, таже эффект
???????
Ну в общем Stream это смесь Future c Inerrable
???????
Ну тут уже больше вопрос архитектуры
???????
А не responseServiceDetail.asStream()
IB Akhrorov
Добрый вечер , есть ли здесь крутые флаттеристы? Бага не могу исправить (
Вадим
[
{
"type": "link",
"text": "https://nometa.xyz/"
}
]
IB Akhrorov
[
{
"type": "link",
"text": "https://github.com/flutter/flutter/issues/49225"
}
]
IB Akhrorov
[
"Вот ",
{
"type": "link",
"text": "https://t.me/rudart/143797"
},
""
]
IB Akhrorov
Сможете помочь?
IB Akhrorov
[
{
"type": "mention",
"text": "@PlugFox"
},
" Добрый вечер, как вы? Можете помочь?"
]
???????
Добрый, не, я не хочу заморачиваться с флатером, вникать и разбираться с картами. Там точно не на 5 минут)
???????
На такие вопросы, где нужно вникать в суть проблемы, сложно помощь найти)
IB Akhrorov
Там я четко описал проблему) Плз хелп , уже 9 день не могу убить бага
IB Akhrorov
Говорят лисы добрые
???????
Безбожно врут) Там вникать надо, а флатер я уже полгода не открывал и пока не собираюсь)
???????
По дарту и общим практикам - помогу, а так, не)
IB Akhrorov
Но все равно спасибо
Урусай
Ребят зацените константу kIsWeb
Hellomik
кто знает в чем ошибка ? он запускается но показывает ошибку
Семён undefined
в retrofit можно также хейдеры оформить?
Семён undefined
присунуть туда значения, как в url через Path
Evgenii Egorov
enum это не класс,на него нельзя экстенш написать
Hellomik
Ох как жы ты ошибаешся
Hellomik
я поменял на 2.6.0
Hellomik
это типа новые фичи, иди поучи ), я тож прифигел что так можно
Hellomik
[
"а знаешь что озночает ",
{
"type": "code",
"text": "[..., \"A\"]"
},
" ?"
]
Hellomik
крч мораль такого сам не путай extension and extends
Hellomik
и иди учи абстракции(поправьте меня)
Maxim Terehov
спасибо, нашел)
Наиль Гилазиев
[
"По этой теме оформил вопрос на stackoverflow. \nОпытные может подкинут какие-нибудь идеи.\n",
{
"type": "link",
"text": "https://stackoverflow.com/questions/59898726/finish-flutteractivity-from-flutter-when-integrating-flutter-to-native-host-app"
},
""
]
Денис
А навигатор сам его не закроет? если сделать Navigator.of(context).pop()?
Денис
или SystemChannels.platform.invokeMethod('SystemNavigator.pop');
Наиль Гилазиев
нет - черный экран) он выгрузит просто текущий роут. но activity в которой запущен flutter не закрывается
Наиль Гилазиев
сейчас посмотрю что это и попробую - не встречал раньше
Денис
exit(0) штука опасная грохает DartVM намертво и не ждет ассинхронных методов
Денис
For iOS SystemNavigator.pop(): Does NOT WORK exit(0): Works but Apple may SUSPEND YOUR APP because it's against Apple Human Interface guidelines to exit the app programmatically. For Android SystemNavigator.pop(): Works and is the RECOMMENDED way of exiting the app. exit(0): Also works but it's NOT RECOMMENDED as it terminates the Dart VM process immediately and user may think that the app just got crashed.
Денис
но вообще мне кажется надо писать плагин нативный тебе
Денис
чтобы она закрывал активити через methodChannel
Наиль Гилазиев
[
"channel до хоста сделан. Как только закрыть activity, которая запушена так: \n",
{
"type": "pre",
"text": "//java\nhostActivity.startActivity( FlutterActivity.withCachedEngine(\"my_engine_id\").build(context)\n);",
"language": ""
},
""
]
Денис
так тебе из флаттера же закрыть?
Денис
SystemNavigator.pop() попробуй
Наиль Гилазиев
я через methodChannel вызову Java код без проблем
Наиль Гилазиев
SystemChannels.platform.invokeMethod('SystemNavigator.pop'); работает. Спасибо, я что-то запамятовал, о существовании этого метода.
Наиль Гилазиев
Опиши решение, я сделаю Accept. Или сам опишу, если лень
Даниил Грущак
Кто какие инструменты использует в разработке? Что скажете на счет mobx для state management ?
Max
Для больших проектов выглядит интереснее, чем redux
Serge Shkurko
на фронтенде использовал, удобно на флаттером только с блоком работал, когда начал проект flutter mobx только зарождался
|