Программирование : Dart & Flutter по-русски
Dart & Flutter по-русски
Программирование : Dart & Flutter по-русски
Tim
Ребят, привет! Снова с вопросом: приходилось делать Hero на более чем 2 страницы?
Vyacheslav
как такой стакан нарисовать подскажите?
Vyacheslav
программно, через CustomPainter
Max
С помощью path, что конкретно вам подсказать?
Vyacheslav
не могу подобрать методы path
Vyacheslav
[
{
"type": "pre",
"text": " path.addRRect(\n RRect.fromLTRBR(size.width*0.2, size.height/3, size.width*0.9, size.height*0.9, Radius.circular(12.0)));\n",
"language": ""
},
" прямоугольник получается"
]
Vyacheslav
вот трапецию никак
Max
Нарисуй сначала без скруглений
Vyacheslav
если правильно понимаю, в таком случае сначала рисую линиями трапецию, потом уже как-то закруглить
Дмитро
Здравствуйте, подскажите пожалуйста, нужно заблорить фотки на фоне, а текст сделать четким наложенным, но почему-то текст тоже смазанный
Max
Можно скрин того что получается? У вас так и задумано чтобы left и right зависели от size.width?
Vyacheslav
да, я его буду выводить в масштабируемом контейнере
Dmitro Cossack
На мой дилетантский взгляд, надо все рисовать сплайном. Линия с бизье. Мне кажется это будет лучший подход. Еще может быть очень сложные вкторные формы рисовать в редакторах векторных и класть как фон ч-з SVG плагин, а сверху рисовать всякую анимированную красоту. Но это чисто теоретически. Сам не пробовал пока еще.
Tim
Попробуйте в качестве child для блюра положить Container(color: Colors.transparent), а сам текст просто ниже по стеку
Max
У тебя backdropfilter должен быть поверх фотки, а cliprrect поверх фильтра
Vyacheslav
я только третий день пробую рисовать))
Vyacheslav
пробую повторить дизайн с дриббла, с анимациями, для тренировки
Дмитро
Самое интересное, что из всего листа на последней фотке все получается: она -размыта, текст - нет
Дмитро
Только на последней
Tim
Аа, тогда прислушайтесь к совету Макса)
Tim
Вам нужно ваш фильтр завернуть в ClipRRect
Tim
А не картинку позади него
Tim
Я не заметил, что это всё в листе
Дмитро
Так интересно, почему именно на последней все получается?
Tim
Потому что у вас блюр выходит за свои границы без ClipRRect
Tim
Ну когда то я действительно ломал голову, не понимая что происходит )
Tim
Так никто не делал Hero на все страницы? У меня кейс, где нужно таскать кастомный аппбар по всем страницам без анимаций перехода
Max
Это странно, по логике это именно четырехугольник, а не прямоугольник
Tim
На двух - работает ок, дальше - фреймворк не понимает что от него хотят)
Иван Бросалин
День не может обновиться
Иван Бросалин
Я даже xcode удалил и теперь без него остался. Даже заново поставится не может. Хорошо что мне ios сейчас не нужен...
northelks
уже давно взял в привычку применять обновления через пару дней после уведомлений
northelks
как для айфона так и для мака
Иван Бросалин
Я не говорю про то что у меня usb модем Yota не работает на маке ещё. Что там может сломаться, я хз.
Иван Бросалин
Форум apple подтвердил мою проблему и тех поддержка Yota. Даже на другой машине тестить не пришлось...
Иван Бросалин
Всё что угодно, у меня юсб кабели портятся - через год использования можно только заряжать или даже и это вырубается
Andrew Belousoff
на 3 машинах обновился норм, единственная проблема вылезла при заливке что у одного приложения было два ключа (обычный и для xcode11 и старше) и пришлось на тот что для 11 иксода в провижине менять
Alex
Привет, заметил, что после переименования *.dart файлов проект не компилируется. Создаю новый проект - и перекидываю туда .dart файлы со старого проекта (с измененными именами) - все работает. Как с этим бороться? Кэш чистить пробовал.
Max
Ладно, мы немного лоханулись, все-таки Rect это прямоугольник
Valentyn Stepanov
flutter clean
Dmitro Cossack
[
"Гляньте тут немного описание клиппинга ",
{
"type": "link",
"text": "https://medium.com/flutter-community/clipping-in-flutter-e9eaa6b1721a"
},
"\nRRect - прямоугольник со скругленными краями. Вам в сторону ClipPath"
]
Dmytro Bondarchuk
Привет) Кто VS Code использует? Не могу посатвить BreakPoint. Вечно она такая... Кто-то сталкивался? есть решения?
Dmitro Cossack
[
"На мой взгляд зацикленную анимацию сложного объекта (выходящего за рамки примитивов - круг, прямоугольник, многоугольник) лучше делать ч-з специальные тулзы типа Flare ",
{
"type": "link",
"text": "https://www.2dimensions.com/about-flare"
},
"\nи вставлять их с помощью ",
{
"type": "link",
"text": "https://pub.dev/packages/flare_flutter"
},
"\nЭто тогда, когда скажем анимация зациклена или сложная анимация (бежит собчака, например) с одни заходом. И в этой анимации не надо воздействовать пользователем. \nХотя у Flare есть опорные точки анимации, к которым можно коннектить реакцию своего приложения. \nНо это все для меня тоже пока теория. Из описания и деомроликов. Все никак не доберусь до практики."
]
Stas
[
{
"type": "code",
"text": "А где в дарте объекты?\nЯ хочу в класс передать объект:\nfinal MyClass test = MyClass({\n 'one': () => 'test',\n 'two': 228,\n и т.д.\n})\n"
},
"Есть тип Object но я ничего про него не найду, любая инфа про объекты это классы, а объект это экземпляр класса"
]
(;?_?) Ivan Zhuravlev ???>?
то что ты показываешь это Map
(;?_?) Ivan Zhuravlev ???>?
оно же жсон
Stas
блин, понял. До map, set не успел дочитать
(;?_?) Ivan Zhuravlev ???>?
[
"ну и чтоб передать наверное надо как-то объявить типа\n",
{
"type": "pre",
"text": "class MyClass {\n final Map data;\n MyClass(this.data);\n}",
"language": ""
},
""
]
Max
Открой панель дебага и там внизу параметры
Max
[
"Спасибо, но это для ",
{
"type": "mention",
"text": "@CoMatu"
},
"\nИ лучше не ClipPath, а просто Path. В общем такую фигуру вручную делать, линию туда, потом Безье, потом снова линию и т.д."
]
Dmitro Cossack
Я имел ввиду клипить уже сами волны в стакане. А рисовать, да. Лучше Безье. Вверху есть прикрепленный митап. Один из докладов почти воспроизводит, то, что нужно
Max
Такую анимацию лучше через flare
Dmytro Bondarchuk
И что тут?)
Vyacheslav
я смотрел доклад, про анимацию волн понял. Стакан уже так и решил, рисовать линиями, не так сложно. Хотя немного удивлен, что нет стандартной фигуры трапеции
Dmitro Cossack
Ну я думаю в стандартных примитивах очень редко встречается - трапеция. Обычно - Круг, Овал, Прямоугольник, Многоугольник, Линия, Кривая Безье. Остальное - производные от этого набора. Хотя еще на вскидку, трапецию можно получить путем трансформации. Но это уже перебор, как на мой взгляд.
Max
Трапеция нестандартная фигура)
Max
Так забей, а как ты ставишь точку?
Dmitro Cossack
Я могу ошибаться, но мне кажется на картинке брейкпоинт стоит на поустой строчке. Как отладчику останавливаться? Я обычно ставлю или на принтах в билде и смотрю что туда попадает, или на местах получения состояния или значения. Но это мой взгляд, может я совсем не о том.
Anton ?? ? ??
он остановится на ближайшей строчке кода
Яўген
Добрый день. Есть такой код. Вроде как, если не выбрал ни одно изображение и возвращаешься должен срабатывать catcherror - но он почему-то не срабатывает. Вместо этого срабатывает then и в file возвращает null... Что не так?
Dmitro Cossack
Да. Точно.
admin
Кто нибудь использовал in-app purchase? При использовании не получаю продукты из маркета
admin
Ключи все установлены
admin
Висит на загрузке продуктов
admin
И попытке подключения
northelks
ошибки есть какие?
admin
Код ошибок не выдаёт, буд-то не подключен к аккаунту
northelks
странно что висит, так или иначе код ошибки или что-то возвращает
Stas Buldakov
Ребят, как правильно копировать массивы? Чтобы при удалении элемента из одного массива, не удалялось из исходного массива ничего
Fearless Cry
var copy = [].addAll(list) как вариант
Fearless Cry
var copy = [...list] можно так ещё
Fearless Cry
но при изменение самого объекта в листе он везде поменяется, естественно
Fearless Cry
однако удаление/добавление будет аффектить только один из листов (что понятно)
Yurii
[
{
"type": "link",
"text": "https://stackoverflow.com/questions/50460367/how-to-copy-listt-in-dart-without-old-reference"
}
]
Fearless Cry
Это копия и листа и всех объектов, да
Rinat Kurmashev
как в DropdownButton открывать меню всегда только от первого элемента?
Dmitry Bubnenkov
Я правильно понимаю, что где только можно нужно использовать StreamBuilder ?
Rinat Kurmashev
если я открываю меню с выбранным вторым и т.д. элементом оно перекрывает appbar
Fearless Cry
Если есть поток "состояний"
Stas
Подскажите, как сделать роуты если я не использую Material App. По сути я делаю stateful компонент где определяю какой виджет рендерить и меняю их через setState?
Dmitry Bubnenkov
А вот тот же ValueListenableBuilder когда годится?
bellski
[
"Народ кто нибудь пользовалася ",
{
"type": "link",
"text": "https://pub.dev/packages/sliding_up_panel"
},
" ?"
]
Александр Васильев
подскажите это можно снести?
Александр Васильев
много проектов и много файликов.. таких
Олжас Сулеймен
Navigator, в нем определяете onGenrateRoute
Dmitro Cossack
Я рад, что повеселил вас. У каждого свои подходы. Если подскажете, как проще смотреть РАЗНУЮ информацию, которая заходит в виджет, с удовольствием послушаю и буду этим пользоваться. Согласитесь, у каждого разные опыт. Но такие комментарии, как у вас, не несут главного, - полезной нагрузки. Вы считаете это смешным, - верю. Но считаю, что улыбнувшись неплохо-бы предложить несмешное решение этого момента. Согласны? Буду действительно благодарен за дельные советы, за которыми мы сюда и заходим.
???????
[
"Я еще когда только вкатывался в it перенял привычку устанавливать брейкпоинт на ",
{
"type": "code",
"text": "int a=0;"
},
""
]
???????
Такая вот незамысловатая конструкция у меня отложилась в мозгу как синоним брейкпоинта
???????
Бонусом теперь всегда могу увидеть в коде такие места и искать их через глобальный поиск)
northelks
ну а шо, чем плох метод то?))
???????
Ничем) Просто делюсь своим опытом)
???????
Отладку принтами лучше, кста, апгрейдить до логирования
northelks
да все методы хороши, если помогают
???????
[
"чтоб вместо ",
{
"type": "code",
"text": "print(\"Ну и гавно\")"
},
" было что то вроде ",
{
"type": "code",
"text": "log.v(\"Ну и гавно\")"
},
""
]
Daniil Kolyasnikov
Sentry тогда уж
northelks
а ещё можно самому вообще код не писать, а заказывать на фрилансе))
northelks
или ещё писать мы можем со всеми правилами и точками да запятыми
???????
Ну так тебе же проще и лучше будет)
???????
Если следовать этим нехитрым рекомендациям)
northelks
мне проще и лучше просто лепить принты где мне они удобны
???????
темпаче в print столькоже буков, сколько и в log.v
???????
Но не проще всю эту ебанину разгребать потом
northelks
и ставить брейкпоинты там и где они тоже удобны и не париться)
???????
О себе любимом надо думать)
northelks
поиск по коду "print("
???????
Ушел на ассессмент, удачи мне и моей зп
Олжас Сулеймен
[
{
"type": "pre",
"text": "assert(() {\n print(...);\n return true;\n}())",
"language": ""
}
]
Pavel Pimenov
[
"если выше ещё не отвечали,\n1) синхронизируется только то, на что юзер подписан (например, через addValueEventListener)\n2) чтобы обезопасить данные от того, что кто-то руками подключится к бд и получит доступ к чужим данным, есть ",
{
"type": "link",
"text": "https://firebase.google.com/docs/database/security"
},
"\n3) по firebase есть отдельный чат ",
{
"type": "mention",
"text": "@firebase_ru"
},
""
]
Evgeny Cherkasov
Есть ли во Flutter что нибудь типа виджета заглушки, но чтобы он не рендерился? Вообще задача такая: есть Row, который надо заполнять динамически виджетами - каждый по своему условию. И некоторые виджеты не должны показываться при некотором условии. Как это лучше сделать?
Dmitro Cossack
Ну вот видите, это ваш способ. Я вообще очень редко ставлю брейкпоинты для отладки. В основном всякие консольные выводы того, что хочется отловить.. "Знаю Билли, это плохо"... Плохая практика. Ну вот так складывалось до сих пор. И вполне себя оправдывала :( А по поводу почему я написал точку на принты. Ну тут опять возможно по отсутствия опыта. В Виджете сложно за что-то зацепиться, что-бы посмотреть что там внутрь него заходит. Для простой отладки мне хватало, принта перед return. Для более глубокой оценки я ставил брейк именно на этот принт и смотрел уже стуктуру окружения данных входящих в Виджет. И это касалось только этого места. В остальных местах, понятное дело я смотрю в нужных точках исполнения логики. Как-то так. Я не пытаюсь оправдать свой способ, просто для меня это было привычнее. Но я в любом случае смотрю и слушаю разные практики, тестирую их для себя и оставляю ту которая будет удобнее для меня. Чо-то много написал. Извините.
northelks
можно добавить if, там где в Row список виджетов скармливаете
Pavel Pimenov
[
{
"type": "pre",
"text": "Row(\n children: items\n .where((item) => shouldShow(item))\n .map((item) => MyWidget(item))\n .toList(),\n)",
"language": ""
},
"\nили\n",
{
"type": "pre",
"text": "Row(\n children: [\n for (final item in items)\n if (shouldShow(item))\n MyWidget(item),\n ],\n)",
"language": ""
},
""
]
Юджин Баладжахе
Перепроверил все, взял чистый пример с сайта, все равно падает. Либо пакет location кривой, а скорее сам флаттер. Замахнулись на большое, но ненадежны все эти плагины и мосты, на соплях в продакшн не войдешь.
Evgeny Cherkasov
Дело в том, что нет готового списка, который можно было бы скормить. Вернее у меня было так сделано, и это работало. Но хочется более оптимально. Чтобы каждый виджет независимо добавлялся.
Pavel Pimenov
В логе ошибка ListTile. Сомневаюсь, что проблема из-за location
Evgeny Cherkasov
У меня было примерно так, но хочется чтобы каждый виджет независимо добавлялся.
Юджин Баладжахе
да я сам не поверил, убираю зависимость - все работает :)
Pavel Pimenov
[
"так можно несколько if:\n",
{
"type": "pre",
"text": "Row(\n children: [\n if (shouldShowWidget1)\n Widget1(),\n if (shouldShowWidget2)\n Widget3(),\n if (shouldShowAList) ...[\n ListItem('a'),\n ListItem('b'),\n ListItem('c'),\n ],\n if (shouldShowWidget3)\n Widget3(),\n ],\n)",
"language": ""
},
""
]
Evgeny Cherkasov
shouldShowWidget у меня определяется подпиской на провайдер, не понимаю пока как это можно вставить в такую конструкцию
Pavel Pimenov
по идее, если Row обёрнут в Consumer, то в if можно использовать данные из провайдера, и всё само обновится
Evgeny Cherkasov
Так тоже у меня было ) Но в этом случае я должен подписаться на всю модель, а каждый виджет зависит только от одного своего условия. И я хочу оптимизировать как то. Чтобы не перерисовывались все виджеты при изменении одного из условий
Evgeny Cherkasov
Но похоже не получится так сделать...
Pavel Pimenov
[
"1) если я не ошибаюсь, то можно сделать, например, конструктор ",
{
"type": "code",
"text": "Widget1()"
},
" const, тогда он не будет ребилдится, если не изменились параметры"
]
Evgeny Cherkasov
Вернее получается, но криво. Я могу сделать подписки для каждого виджета. Но в случае если конкретный виджет не надо показывать, приходится возвращать Container(). И список кривой получается, хотя контейнер и пустой
Pavel Pimenov
можно проверить, добавив в Widget1@build какой-нибудь print
northelks
а у вас app store connect загружается? (в браузере)
Pavel Pimenov
[
"а вообще, чтобы ребилдить поддерево только при изменении какого-то конкретного поля в модели, в ",
{
"type": "link",
"text": "https://pub.dev/packages/flutter_bloc"
},
", например, есть condition\n",
{
"type": "pre",
"text": "BlocBuilder (\n condition: (previousState, currentState) {\n // return true/false to determine whether or not\n // to rebuild the widget with currentState\n return previousState.importantField != currentState.importantField;\n },\n builder: (context, state) {\n // return widget here based on BlocA's state\n }\n)",
"language": ""
},
"\n(Но в случае с Row это не поможет, потому что при изменении количества children нужно ребилдить весь Row. Хотя, мне кажется, дети при этом вполне могут и не ребилдиться)"
]
Evgeny Cherkasov
Я пользуюсь ChildNotifierProvider и Selector. Это тоже самое. Но проблема в том что в любом случае нужно вернуть какой то виджет.
northelks
ну я и так поверил)
Eugene
[
"Всем привет, только сейчас заметил\nЕсли в ",
{
"type": "code",
"text": "TextField"
},
" выделять текст, то появляется меню, мол COPY, PASTE\nКак его перевести на русский?\nИ ещё, это меню можно вызвать, только если текст выделить, в пустом поле его никак не получается вызвать"
]
Stas
[
"Делаю так:\n",
{
"type": "code",
"text": "Navigator(\n onGenerateRoute: (RouteSettings settings) {\n // swicth route late\n return TestScreen();\n },\n)"
},
"\nПишет что ",
{
"type": "code",
"text": "TestScreen"
},
" это не ",
{
"type": "code",
"text": "Route"
},
" и требует какой-то ",
{
"type": "code",
"text": "MaterialPageRoute"
},
", который опять же находится в ",
{
"type": "code",
"text": "flutter/material.dart"
},
""
]
Олжас Сулеймен
вот мой самый минимальный шаблон
Stas
[
"Оо, ",
{
"type": "code",
"text": "PageRouteBuilder"
},
", то что нужно. Спасибо"
]
Viktor K
Посмотрел митап Андрей Смирнов, Wrike – Работа с графикой во Flutter. Очень круто, Андрею огромное спасибо, на следующий нужно обязательно ехать.
Plomipu Dmitri
[
"Привет народ. Коротко говоря имею следующую ошибку в скаффолде и я судя по тексту ошибки вообще не понимаю, в каком месте в коде кусочек кода крякнулся: ",
{
"type": "link",
"text": "https://pastebin.com/H4VeaWMt"
},
""
]
Fearless Cry
У List попробуйте сделать shrinkWrap: true
???????
вместо принта лучше использовать специальный класс для логирования. А также для отладки очень полезны assert и throw
Plomipu Dmitri
неа. Не работает
Plomipu Dmitri
Забыл сказать, что моя задача: создать чтото вроде макета, в котором будет контейнер, а в нём будет row из двух горизонтально стоящих контейнеров( колонок ): в первой будет контейнер равный высоте двух маленьких контейнеров во второй колонке.
Ruslan Kryzhanovskyi
Всем привет, кто то может подсказать есть ли плагин позволяющий вешать что то типа листенера на состояние приложения? Вроде: приложение открыто, свернуто, открылось со свернутого состояния и так далее
Karen
[
{
"type": "link",
"text": "https://api.flutter.dev/flutter/widgets/WidgetsBindingObserver-class.html"
}
]
Roman Peshkov
[
{
"type": "link",
"text": "https://medium.com/@marcoleong.developer/lifecycle-in-flutter-widgetsbindingobserver-2eb782236f8b"
}
]
Ruslan Kryzhanovskyi
спасибо)
Ruslan Kryzhanovskyi
[
{
"type": "code",
"text": "WidgetsBindingObserver"
},
" то что надо)"
]
Evgeny Cherkasov
Спасибо, попробовал, но тоже не подходит. Вот так получается:
Evgeny Cherkasov
[
"Может конечно в самом ",
{
"type": "code",
"text": "Row"
},
" какие то настройки не те. У меня так сейчас:"
]
Max
Ну Visibility не ваш вариант? Вам нужно именно чтобы не рендерился и занимал место или вообще чтобы его не было?
Evgeny Cherkasov
[
"Если я правильно понял, то он в случае невидимости все равно выводит что то типа ",
{
"type": "code",
"text": "SizedBox.shrinked"
},
". Но это тоже не работает. См выше скриншот - Row все равно неправильно отображается, выравнивает видимые виджеты не по центру, как будто там еще есть какой то"
]
Evgeny Cherkasov
Может это конечно баг в Row. По идее он наверное должен понимать что если у какого то виджета ширина 0 то не надо для него отступы добавлять
Evgeny Cherkasov
почему же? )
Fearless Cry
А ты и форы теперь можно в массиве прям херачить?
Stas
Как можно сделать виджет который будет намного больше чем экран (типа бесконечный влево вправо вверх и вниз) и контент в нем можно зумить перемешаться по этой области и т.д.. Как-то так. Подскажите пожалуйста есть готовое решение для такого
Stas
Отрисовывать на канвасе не вариант, я считаю
???????
А так - отлавливай жесты и рисуй что надо
Stas
Любые другие виджеты, блоки какие-то
Stas
Типа как-то по координатам их надо отображать. И еще чтобы зумит можно было
???????
Ну так смотри на реализацию листвью
???????
Или на реализацию table
???????
А караваны грабить не надо тебе?) Ты там карты изобретаешь чтоли?)
Pavel Pimenov
ага, удобно, когда есть группы элементов разного типа
Eugene
Есть какой-то простой способ получить версию билда внутри приложения, ну чтобы потом пользователю сказать, чтоб обновился Есть package_info, но там баг с ios, да и вообще, мне кажется это перебор
Eugene
Можно вручную дублировать версию билда, но рано или поздно забудешь это сделать
northelks
stack + positioned с отрицательными значениями
northelks
либо stack + container + list и тп
Stas
Это как position: absolute и left top right bottom в css?
Rodion Mostovoy
Всем привет! Круто, что в нашей стране есть такое активное лобби Flutter-разработчиков. Ребята-создатели чата молодцы! У кого есть опыт релиза флаттер приложения для айос, подскажите нам дуракам, как долго в среднем занимает процесс проверки, к каким проблемам нужно быть готовым и что нужно сделать, чтобы их избежать?
Yerassyl Maikhanov
основная проблема мак ос и плата Ааплам за тестирование
Yerassyl Maikhanov
пуш уведомления покупать дорого
Yerassyl Maikhanov
кто с картами работал?
Rodion Mostovoy
Для пушей мы используем бесплатный OneSignal - он не прокатит?
Yerassyl Maikhanov
показывать уведомление на айфоне
Daniil Kolyasnikov
Fire base лучше
Yerassyl Maikhanov
я имел в виду что для показа пуш уведомлений он использует эпловскую прослойку
Yerassyl Maikhanov
за которую надо платить
Yerassyl Maikhanov
какой плагин для карт позволяет просматривать офлайн
Yerassyl Maikhanov
человек скачал кусочек карты и просматривает
Rodion Mostovoy
Конкретно по флаттеру не скажу, но osm позволяет загружать произвольные участки карты и работать с ними оффлайн, соответственно.
Roman Diachenko
В целом по ios все печально. Большинство плагинов если и работает то с багами. А некоторые вообще не работают. О 60 фпс -это сказка. Процесс сборки - что-то ужасное, дартрвская вм отваливается когда захочет. Я как андроид девелопер могу твердо сказать -для прода рано ещё юзать флатер
Daniil Kolyasnikov
А какие плагины отваливаются?
Daniil Kolyasnikov
Что не так бывает с Дартвм?
Roman Diachenko
Попробуй показывать видео с ютуба))
Daniil Kolyasnikov
Я показываю streaming видео с сервера
Gevork Arzumanyan
ребята нужна помощь вопрос конечно детский, но я что то застрял { "score" -> "5" "questions" -> "[1, 2]" "answers" -> "{1: [1, 2, 3, 4, 5], 2: [1, 2, 3, 4, 5]}" нужно положить вот такой вот json в body использую http для rest как только не делал получаю ошибку что нужна только Map
Daniil Kolyasnikov
Что вы используете для этого ?
Roman Diachenko
Много перепробовал. Проблему свою я то решил - но это не стоит того
Roman Diachenko
А процесс дебагигна просто шик(нет)
DVS (Read The F.ng Manual) Studio (NoHello)
А можно чуть более конкретике факты? Юзлес кейсы.. а то сейчас это похоже на попытку начала холивара, ибо у многих здесь уже аппки в маркетах и все прекрасно работает
|