Программирование : Dart & Flutter по-русски
Daniil Kolyasnikov
А в чем проблема каждый запуск грузить его с сервера ?
Alexandr Drobyshev
и откуда куда надо синхронизировать? и что если чел с двуз девайсов один? и тд
Vyacheslav
список контактов организации, лежит на сервере. Нужно показать в приложении, изменять нельзя.
Alexandr Drobyshev
возможно надо с прилы выгружать и с учетом удаленных записей) или две разные прилы между собой синхраниировать чрезе сервер и удаления тоже)
Alexandr Drobyshev
ну тогда вам ответили)
Vyacheslav
пока я только придумал каждый раз при старте пробегаться по списку с сервера и сравнивать с локальной копией в бд
Alexandr Drobyshev
я делал похожее но на сервер можно былос лать таймстамп)
Alexandr Drobyshev
так удаляйте с локлаьнйо бд
Vyacheslav
да, тоже пришел к тому, чтобы удалять таблицу и создавать заново каждый раз
Alexandr Drobyshev
я сделал так repo class { stream fetch { yield local.fetch(); final list = api.fetch(); local.deleteAll(); local.createAll(list); yield local.fetch(); } }
Alexandr Drobyshev
зачем удалять таблицу?
Alexandr Drobyshev
delete вроде рабтает
Daniil Kolyasnikov
1) Нужны дефолтные значения, которые прописаны в коде. 2) при запуске грузите и перезаписывайте в hive(sqlite), перезапись позволит не париться с перебором значения 3) при использовании просматривайте, есть ли кеш в базе данных, если нет, то берите константные значения
Vyacheslav
у меня sql и ее проще удалить и снова создать, чем сравнивать
Alexandr Drobyshev
зачем что то сравнивать?
Alexandr Drobyshev
delete from table; все
Vyacheslav
спасибо! не хватает опыта с базами данных, вот на простых кейсах туплю
Daniil Kolyasnikov
Если честно, тут нет необходимости в реляционной базе данных
Alexandr Drobyshev
[
"ток я еще добавил if (",
{
"type": "link",
"text": "localRowsfirst.id"
},
" != ",
{
"type": "link",
"text": "apiRows.first.id"
},
") только тогда новый yeild чтоб не прыгало если резко чел скролитьп осле старта стал)"
]
Vyacheslav
она уже есть для других целей, поэтому таблицей больше роли не играет
Alexandr Drobyshev
почему? дальеш пока прила работает удобна и сортирвока и филтры)
Harley
Ребят как можно сделать такой же задний фон?
Harley
Это типо кучу контейнеров или фото?
Станислав Серёгин
Всем привет). Такая проблемка: только на андроид симуляторе, только когда нажимаю на паузу. Подскажите чо можно сделать?
Daniil Kolyasnikov
[
{
"type": "link",
"text": "https://medium.com/fluttervn/how-to-make-blur-effect-in-flutter-using-backdropfilter-imagefilter-559ffd8ab73"
}
]
Alexandr Drobyshev
realtimePlaingInfos типа видимо не нулабле
Alexandr Drobyshev
а в нем все таки етсь нулл
Alexandr Drobyshev
а хотя там функция с либы видимо) значит нет)
Vyacheslav
сделай Stack, сверху этот фильтр а снизу картинку
Станислав Серёгин
Так в итоге что посоветуешь?
Alexandr Drobyshev
ну так что это за переменная? может ты сам писал функцию ту и там может быть нулл все же я ж не знаю что за плеер и что за инфос
Alexandr Drobyshev
audioPlayer - это что? либа с паба?
Станислав Серёгин
Asset_audio_player
Vyacheslav
в 145 строке замени пустой Column хотя бы на контейнер
Vyacheslav
остальное у тебя вроде как нормально
Alexandr Drobyshev
ну там не может быть переменная нулл в либе, проверку не null можно тут убрать
Alexandr Drobyshev
лучше cosnt SizedBox.shrink() вроде как в доке пишут
Vyacheslav
попробуй тогда подебажить, посмотри на какой строке выкидывает исключение
Alexandr Drobyshev
ну там ткм такой ошибки и не будет ошибка где тов другом месте
Alexandr Drobyshev
там вообще судя по всему if ( )
Alexandr Drobyshev
лишний и else
Alexandr Drobyshev
144-146 строки никогда не должны выполнится
Станислав Серёгин
Когда убираю, так же
Станислав Серёгин
Буду искать
Alexandr Drobyshev
так понятно что так же я ж написал что ошибка в другмо месте
Станислав Серёгин
[
{
"type": "code",
"text": "import 'package:assets_audio_player/assets_audio_player.dart';\nimport 'package:flutter/material.dart';\n\nclass RawaPage extends StatefulWidget {\n \n @override\n _RawaPageState createState() => _RawaPageState();\n}\n\nclass _RawaPageState extends State {\n final AssetsAudioPlayer audioPlayer = AssetsAudioPlayer();\n double screenHeight = 0;\n double screenWidth = 0;\n\n @override\n void initState() {\n super.initState();\n setupPlayer();\n }\n\n void setupPlayer() async {\n try {\n audioPlayer.onErrorDo = (error) {\n error.player.stop();\n };\n await audioPlayer.open(\n Audio.liveStream('http://air.radioday.fm/mp3',\n metas: Metas(\n title: 'title',\n album: 'album',\n artist: 'artist',\n image: MetasImage.network(\n 'https://i.pinimg.com/564x/e3/77/94/e377940a4c2417221d04c47e5a52d2d4.jpg'))),\n autoStart: false,\n showNotification: true,\n notificationSettings: NotificationSettings(\n nextEnabled: false, prevEnabled: false, stopEnabled: false),\n );\n } catch (t) {\n print(t);\n }\n }\n\n @override\n void dispose() {\n super.dispose();\n audioPlayer.dispose();\n }\n\n Widget audioImage(RealtimePlayingInfos realtimePlayingInfos) {\n return Container(\n height: screenHeight * 0.3,\n width: screenWidth * 0.5,\n child: ClipRRect(\n borderRadius: BorderRadius.circular(8),\n child: Image.network(\n realtimePlayingInfos.current!.audio.audio.metas.image!.path,\n fit: BoxFit.cover,\n ),\n ),\n );\n }\n\n Widget titleText(RealtimePlayingInfos realtimePlayingInfos) {\n return Text(\n realtimePlayingInfos.current!.audio.audio.metas.title.toString(),\n style: TextStyle(\n fontSize: 40,\n color: Colors."
},
{
"type": "italic",
"text": "white"
},
{
"type": "code",
"text": ",\n fontFamily: 'Comfortaa',\n ),\n );\n }\n\n Widget artistText(RealtimePlayingInfos realtimePlayingInfos) {\n return Text(\n realtimePlayingInfos.current!.audio.audio.metas.artist.toString(),\n style: TextStyle(\n fontSize: 13,\n color: Colors."
},
{
"type": "italic",
"text": "grey"
},
{
"type": "code",
"text": ",\n fontFamily: 'Comfortaa',\n ),\n );\n }\n\n Widget albumText(RealtimePlayingInfos realtimePlayingInfos) {\n return Text(\n realtimePlayingInfos.current!.audio.audio.metas.album.toString(),\n style: TextStyle(\n fontSize: 40,\n color: Color(0xfffc8403),\n fontFamily: 'Comfortaa',\n ),\n );\n }\n\n Widget playBar(RealtimePlayingInfos realtimePlayingInfos) {\n return Row(\n mainAxisAlignment: MainAxisAlignment.center,\n children: [\n PlayerBuilder.isPlaying(\n player: audioPlayer,\n builder: (context, isPlaying) {\n return FloatingActionButton(\n onPressed: () async {\n try {\n await audioPlayer.playOrPause();\n } catch (t) {\n print(t);\n }\n },\n child: isPlaying ? Icon(Icons."
},
{
"type": "italic",
"text": "pause"
},
{
"type": "code",
"text": ") : Icon(Icons."
},
{
"type": "italic",
"text": "play_arrow"
},
{
"type": "code",
"text": "),\n );\n },\n ),\n ],\n );\n }\n\n @override\n Widget build(BuildContext context) {\n screenWidth = MediaQuery."
},
{
"type": "italic",
"text": "of"
},
{
"type": "code",
"text": "(context).size.width;\n screenHeight = MediaQuery."
},
{
"type": "italic",
"text": "of"
},
{
"type": "code",
"text": "(context).size.height;\n return Scaffold(\n backgroundColor: Color(0xff16161e),\n body: audioPlayer.builderRealtimePlayingInfos(\n builder: (context, realtimePlayingInfos) {\n return Column(\n mainAxisAlignment: MainAxisAlignment.end,\n children: [\n albumText(realtimePlayingInfos),\n SizedBox(height: screenHeight * 0.05,),\n audioImage(realtimePlayingInfos),\n SizedBox(height: screenHeight * 0.05,),\n titleText(realtimePlayingInfos),\n SizedBox(height: screenHeight * 0.01,),\n artistText(realtimePlayingInfos),\n SizedBox(height: screenHeight * 0.05,),\n playBar(realtimePlayingInfos),\n SizedBox(height: screenHeight * 0.05,),\n ],"
}
]
Станислав Серёгин
[
{
"type": "code",
"text": ");\n }\n ),\n );\n }\n}"
}
]
Станислав Серёгин
может найдет кто-то косячек)))
Vyacheslav
сделай точку останова в билдере перед return и посмотри, что у тебя там
Vyacheslav
она может крашит не там совсем
Владимир Калашников
Всем привет. Я использую CarouselSlider в своем приложении. Проблема заключается в том, что я не знаю и не могу найти как установить margin между элементами во время скролла. Работает если я в каждый элемент поставлю margin, но у меня на всей странице стоит padding и с марджином в каждом элементе выглядит так, как-будто паддинг у элементов слайдера больше.
Яўген
Добрый день, кто юзал либу apphud, подскажите пожалуйста, не возвращается subscriptionPeriod time, в чем может быть причина?
Дмитрий Щербаков
там есть viewportfraction (сколько занимать от ширины экрана 1 - 100%)
Владимир Калашников
Мне нужно чтобы элемент слайдера был на всю ширину экрана, но при этом между элементами во время скролла было какое-то расстояние
Alexandr Drobyshev
ну судя по тексту ошибки можно предположить что даже в либе косяк
Alexandr Drobyshev
ка кбудто нулл попадает в переменную которая не нуллабле
Alexandr Drobyshev
но надо дебажить
Дмитрий Щербаков
1 - сколько занимает места от экрана, а 2 - твой виджет у которого можешь сделать и маржин и паддинг и все чо хочешь
El
Убери паддинг со всей страницы тогда
El
И добавь к виджетам, которым нужен отступ
Владимир Калашников
У меня и так на всех виджетах на странице стоит паддинг. Если я сделаю у каждого элемента марджин\паддинг, то потом придется каждому элементу отдельно ставить паддинг. Может есть решение получше, которое я ищу сейчас
Михаил Филиппов
Здравствуйте у меня интересный вопрос У меня есть элемент, который при определенных условиях я хочу обесцвечивать (внутри есть картинка), могу ли я как-то это сделать для всего child. Типа только черно-белый цвет
Дмитрий Щербаков
сделать виджет с паддингом в него запихать остальные без . например контейнер в него все остальное в column
Яўген
Можно ли в проекте сделать nullsafety отдельный файл?
Harley
Ребят как снизу убрать страницы7\
Harley
PaginatedDataTable
Harley
нужный тип я не нашел
Дмитрий Щербаков
[
"ColorFiltered(\n colorFilter: ColorFilter.mode(\n ",
{
"type": "link",
"text": "Colors.black"
},
",\n BlendMode.saturation,\n ),\n child: child,\n)"
]
Виктор
[
"Спасибо за совет. Я завернул, а оно теперь ругается на infinite width ?? Вообще у меня есть ощущение, что я неправильно построил дерево. Мне нужна сетка одинаковых по размеру элементов, которые будут анимированно опускаться вниз при удалении элементов под ними. Поэтому я организовал колонки, а в них - ",
{
"type": "code",
"text": "SlideTransition"
},
", внутри которых уже вешаю обработчик на тап по находящейся внутри иконке. Только мне самой иконки мало, я хочу для обработки тапа еще пространство вокруг нее использовать, для этого добавил ",
{
"type": "code",
"text": "Box"
},
"-ы. И дальше стал экспериментировать в попытке сделать так, чтобы это все заработало. Но, видимо, ошибка у меня в самой концепции размещения виджетов. Где я ошибся в их размещении?"
]
Radomir Epur
language version override?
Sergey Belan
Правильно ли я понимаю, что dispose эквивалент размонтирования в реакте? И если да, то в чем разница между dispose и deactivate?
vasilich
Кажется деактивэйт помечает как деактивированный но может быть переиспользован папизже А диспроуз это кирдык с концами.
vasilich
Но слушке послушайте подкаст или посмотрите видос на ютубе по это теме
vasilich
Я так, смутно помню.
Alexandr Drobyshev
То есть можно оставить часть файлов. Без нулл сафети?
Alexandr Drobyshev
Я месяц назад спрашивал чтот ни кто не ответил) пришлось две либы переписать
Michael Lazebny
Вроде можно, либы которые не нулл сафети запустятся без sound null safety, а остальные с sound
Michael Lazebny
я чёт делал, но уже забыл
Mitai
С телефона такие простыни листать просто сказка
Alexandr Drobyshev
Да я переписал уже все равно... Просто тогда не нашёл ответа)
Radomir Epur
[
"Методы audioImage, titleText и т. д. лучше делать виджетами. В том числе отпадет необходимость в костыле инициализации screenHeight и screenWidth, потому что в отдельном виджете будет context, и вместо \n",
{
"type": "code",
"text": "height: screenHeight * 0.3,\n"
},
"ты сделаешь \n",
{
"type": "code",
"text": "height: MediaQuery.of(context).size.heigth * 0.3,"
},
""
]
Валерий
.yaml очень требователен к пробелам, в 48 строке невооруженным взглядом их видно лишних
PTLam
[
"ребята, кто работал с ",
{
"type": "bold",
"text": "PageStorageBucket"
},
" подскажите плиз как получать значения по ключу в PageStorageBucker? Пробовал разные способы, не хочет вытягивать("
]
Radomir Epur
assets должен быть на одном уровне(то же самое к-во пробелов), что и uses-material-design
Aleksey Kharitonov
Всем привет! Посоветуйте пожалуйста: Вот есть кнопка Login. При ее нажатии через setState меняем переменную isLoading и вместо текста внутри кнопки появляется CircularProgressIndicator. Вопрос: при использовании Bloc, мне нужно для для кнопки отдельный кубит делать со стейтами, или как сделать? Спасибо!
владислав С
BlocNameIsLoading
владислав С
Проверяй тип стейта и показывай прогресбар
Aleksey Kharitonov
Через context? Или как проверить?
владислав С
Он автоматически выполняет ребилд при изменении стейта
владислав С
Если через контекст получать - не будет реактивности
Aleksey Kharitonov
Спасибо! Попробую
владислав С
Посмотри сорцы flutter bloc, там расписано все
Aleksey Kharitonov
Спасибо
Дмитрий Щербаков
Чот туплю.. у неразрывного пробела норм что ширина 1/2 от обычного? как управлять его "шириной", а то приходится костылить "\u202f\u202f" вот такие штуки ??
Дмитрий Щербаков
или я не тот код юзаю
Denis Vasilchenko
Подскажите пожалуйста, куда копать Хочу сделать SliverPersistentHeader, в котором меняется контент в зависимости от высоты слайвера, тут все понятно Но как мне сделать так, чтобы мой скролл не мог остановиться на промежуточном состоянии? Т.е. если я отпускаю скролл, чтобы хедер становился либо максимального размера, либо минимального
Radomir Epur
посмотри в сторону snapConfiguration
Denis Vasilchenko
Спасибо, выглядит интересно) Пойду разбираться
Said-Amalkhon
как мне узнать позицию элемента, что бы он не был pinned после того как скролится другой элемент
Said-Amalkhon
то есть, что бы так не накапливались а был закреплен только последний
Andreu
всем добрый, подскажите пожалуйста как в документации ссылаться на класс, который находится в другом файле? UPD. Нашел, нужно лишь импортнуть руками файл
Sergey Hottabych
Как человеку объяснить, что он неправильно делает? Я пытаюсь объяснить, что билд — чистая функция, и из нее нельзя дергать никаких getSettings(). Его позиция — "данные в Бд могли поменяться, поэтому пусть каждый ребилд будет чтение"
Evgenii Elchev
1) билд не чистая функция 2) поясни что концепция флаттера такова, что билд должен вызываться когда изменились данные, а билд должен проверять что они изменились
Michael Lazebny
можно показать что там пишется при наведении
Evgenii Elchev
вообще, в этом кейсе, что вызовет билд?
Sergey Hottabych
Вызовет загрузку модели из Хайва
Evgenii Elchev
не, я не это спросил
Evgenii Elchev
build в результате чего будет вызван?
Bjorn
Как отцентровать текст Статистика с icon Button info?
Bjorn
Пробовал отцентровать с Row, mainAxis center, но текст стоит не прямо в центре
oramcheg
подскажите пожалуйста, как я могу блокировать (запрет на переключение/нажатие) переключатели/кнопки после нажатия ( на время, 30 сек ), картинка для примера переключателей, так же есть обычные кнопки которые нужно будет блочить
Sergey Hottabych
Это просто экран (в initState — это я перенес)
oramcheg
переключил - ушел запрос на сервер, прошло 30 секунд - можно ее уже отключить ( снова 30 сек ждешь ), потом можно снова включить
Evgenii Elchev
хм, то есть у вас build никак, с вашей стороны не перформится? поясню, вы ни setState не вызываете, ни подписываетесь на инхерит, блок или еще какую любо фигню?
Evgenii Elchev
типо просто статичный?
oramcheg
по такому принципу, примерно. это управление всякими охранными датчиками
Evgenii Elchev
не проще блокировать на время пока запрос не вернется?
Evgenii Elchev
но вообще можно и таймер запустить
Evgenii Elchev
кликнул, запустил таймер, поменял соятоние, таймер отработал, снова поменял состояние
oramcheg
вот удобнее будет таймер, я думаю. так попросту попросил заказчик)
oramcheg
как вариант, в принципе
Sergey Hottabych
[
"Получается так.\nОн был Stateless, это я переделал в Stateful, чтобы в initState запихнуть ",
{
"type": "link",
"text": "context.read"
},
"."
]
Evgenii Elchev
тебе какой вариант? простой, правильный или что то по середине? простой, бахнуть слева текста невидимый блок, такого же размера что и иконка, правиьный использовать custommultichildlayout, по середине я не знаю что монжо посоветовать)
Sergey Hottabych
[
"Так как ",
{
"type": "link",
"text": "context.read"
},
" в build() кидает ошибку"
]
Evgenii Elchev
Тогда, покажи доку от виджета своему другу, где написано, что вызовы билд метода нужно минимизировать, например сделав виджет const, тогда у него build вообще вызывать больше не будет, а значит и данные не подтянутся. А если нужно обновлять данные если настройки поменялись. А скорее всего нужно, ибо нафига показывать не актуальные данные, то нужно подписаться на изменение этих данных. Не знаю как у вас это сделано, выбирай любой из вариантов обновления стейта, можно даже на бокс хайва подписаться, он умеет уведомлять если данные изменились
Дмитрий Щербаков
сделать стрим из бд ;)
Evgenii Elchev
заказчик не программист, откуда ему знать как правильно блокировать
Eugene Alitz
Ещё можно setState с пустышкой вызывать, чтобы вызвать rebuild
Andrei R
Подскажите пожалуйста, как сделать так, что бы chip виджеты были в ряд, но если не хватает места, то переносились на следующую строку, как на скриншоте. Что-то не соображу.
Sergey Hottabych
А почему не чистая? Чистая функция = без сайд эффектов. build() все что делает — отрисовывает дерево виджетов. Он не должен еще и неявно какие-то данные загружать из БД.
oramcheg
а в чем проблема? IconButton занимает много места ?
Evgenii Elchev
потому что чистая фиункция это функция которая используется только свои аргументы, а билд метод вполне легально может обращаться к свойствам своего виджета или стейта. это не чистая функция
Sergey Hottabych
А, ну в этом плане окей.
Bjorn
выглядит не очень когда текст не по середине
oramcheg
ну это я понял) ты понял почему он не встает ровно посередине ? тот же IconButton берет себе много места в дефолтном состоянии, независимо от iconSize
oramcheg
по дефолту у него радиус нажатия(и занятое пространство) - 30 пикселей, как я понял
oramcheg
попробуй в iconButton прописать constrains: BoxConstrains(), а потом уж в середину двинуть
oramcheg
может быть в этом проблема
Eugene Alitz
Народ, привет. Вопрос по стримам и кубиту: Есть вот такая ситуация: Я обращаюсь к кубиту, чтобы он послал запрос и вернул мне ответ. И только после есго ответа я могу двигаться дальше. Как видно на картинке я это решил через StreamSubscription. Вопрос в том, есть ли более красивый способ?
Michael K
добрый день! подскажите плиз как работать с refresh token. много источников используют dio package. есть чтото еще?
Mykola Shevchenko
Можно было бы через whereType фильтровать нужное состояние, а не через мейби вен в лисен
.Pasha Kruzenshtern
.что угодно можешь использовать, тебе же просто стрингу в запрос надо вставлять и все
Eugene Alitz
Я пытался, и через .firstWhen и через .lastWhen. Почему то не работает, причем в консоли я вижу что кубит емиттит нужный стейт. Может кто сталкивался?
Eugene Alitz
в данном примере, я вначале подписываюсь , а потом вызываю метод кубита, а в случае с .firstWhere мне вначале нужно вызвать метод , а потом уже await на рез-т
Aleksandr
запускаем React внутри WebView и выстраиваем с ним взаимодействие.
Aleksandr
наркоманы какие то
Дмитрий Щербаков
ага тож офигел
Дмитрий Щербаков
зато в команде с аналитиком ??
Aleksandr
как они вообще это себе представляют
Дмитрий Щербаков
Нижний вариант)
Michael Lazebny
это очень интересно и амбициозно
Bjorn
поставил constrains на max size 22, перед текстом добавил sizedBox на width: 22, стоит ровно по середине)
oramcheg
получилось, получается?
Denis Nadey
возможно настало время глупых вопросов / и так вопрос что означает нижнее подчеркивание ( это из примера по блоку)
Royal Cat
Это имя конструктора, так делают чтобы его нельзя было вызвать из вне, типо безымянный приватный конструктор
Royal Cat
А нет, в вашем примере это функция, такого я ниразу не видел
Denis Nadey
Блок , документация с примером по блок репозиторию
d
как вы поняли что это функция? приватный конструктор можно вызвать через this._()
Royal Cat
я тоже так думал
Andrey
[
"Подскажите, с Navigator 2.0 мы просто вручную прописываем стэк для ",
{
"type": "code",
"text": "navigator.pages"
},
"? Или есть вариант использовать как раньше ",
{
"type": "code",
"text": "toNamed"
},
"?"
]
Royal Cat
тут вобше что то странное
d
неужели void main() { final a = A.fromNothing(); } class A { A._(); A.fromNothing() : this._(); }
Michael Lazebny
это просто именованный конструктор, не?
d
вы используете this в теле конструктора когда this еще нет
d
но использовать так вполне можно
d
в теле конструктора можно так A.withBody() { final privateA = A._(); // do some stuff }
Имя
Всем привет! Ищу хорошего flutter разработчика хорошего уровня который будет поддерживать и дорабатывать магазин (flux store + woocommerce)
Michael Lazebny
это вам в dart jobs лучше
Michael Lazebny
в описании канала есть
d
ничего тут странного нет )
Michael Lazebny
ну да, this то к конструктору Test относится_))
Royal Cat
[
"а теперь угадай что вызовится тут ",
{
"type": "pre",
"text": "class Test {\n Test() : this._();\n\n \n Test._() {\n print(\"test\");\n }\n \n void _() {\n print(\"test2\");\n }\n}\n\nvoid main() {\n final test = Test();\n}",
"language": ""
},
""
]
d
нереалистичный сценарий
Royal Cat
this который в имеет разные области видимости в разных контекстах, вот что странно
d
по идее test это называется redirecting constructors
d
[
{
"type": "link",
"text": "https://dart.dev/guides/language/language-tour#constructors"
}
]
d
при этом приватный конструктор в каком-нибудь методе вызвать не получится то есть void _ из метода спокойно вызывается без коллизий все норм )
.Pasha Kruzenshtern
.чисто логически, когда вы пишете this, вы обращаетесь к экземпляру класса в котором пишете код, а к какому классу вы обращаетесь вызывая конструктор?)
Alexandr Drobyshev
кто нит в самсунге выводил симво ??
Alexandr Drobyshev
уже два рифта попробвоал в которых он етсь и на нуавее все супер, на самсунге квадратик
d
почитайте что такое redirecting constructors и там абсолютно все расписано
d
все еще надо отвечать на этот вопрос?
|