Используя класс MediaQuery
:
MediaQueryData queryData;
queryData = MediaQuery.of(context);
MediaQuery : Устанавливает поддерево, в котором медиа-запросы разрешаются на данные.
MediaQueryData : информация о фрагменте мультимедиа (например, окне).
Чтобы получить Пиксельное соотношение устройств:
queryData.devicePixelRatio
Чтобы получить ширину и высоту экрана устройства:
queryData.size.width
queryData.size.height
Чтобы получить масштабный коэффициент текста:
queryData.textScaleFactor
Использование класса AspectRatio
:
Из документа:
Виджет, который пытается определить размер дочернего элемента. конкретное соотношение сторон.
Виджет сначала пробует наибольшую ширину, разрешенную ограничениями макета. Высота виджета определяется путем применения заданного соотношения сторон к ширине, выраженного как отношение ширины к высоте.
Например, соотношение сторон по ширине и высоте 16: 9 будет иметь значение 16,0 / 9,0. Если максимальная ширина бесконечна, начальная ширина определяется путем применения соотношения сторон к максимальной высоте.
Теперь рассмотрим второй пример, на этот раз с соотношением сторон 2,0 и ограничениями макета, для которых ширина должна быть от 0,0 до 100,0, а высота - от 0,0 до 100,0. Мы выберем ширину 100.0 (максимально допустимая) и высоту 50.0 (чтобы соответствовать соотношению сторон).
//example
new Center(
child: new AspectRatio(
aspectRatio: 100 / 100,
child: new Container(
decoration: new BoxDecoration(
shape: BoxShape.rectangle,
color: Colors.orange,
)
),
),
),
На самом деле существует техническая причина для этого. Если бы каждый метод типа shoelaceWithString:
был изменен только на withString:
, мы получили бы ужасающе огромное количество классов с одинаковыми именами методов и разными сигнатурами. Это играет злую шутку с проверкой статического типа компилятора и может привести к тому, что он будет выдавать всевозможные раздражающие и ненужные предупреждения.
Существует также аспект культуры Какао, в котором разработчикам нравится, чтобы их код самодокументировался. Это означает, что имена методов указывают как их аргументы, так и то, что они возвращают. Руководства Apple по кодированию на самом деле предупреждают о методах с расплывчатыми названиями, предлагая добавлять слова к имени, чтобы было понятно, что делает метод.
Я думаю, что это всего лишь часть общей философии «говорите именно то, что вы имеете в виду» многословной структуры какао. Несколько вариантов выбора:
[UIView setAnimationBeginsFromCurrentState]
[UITableView scrollToNearestSelectedRowAtScrollPosition]
[UIApplication didRegisterForRemoteNotificationsWithDeviceToken]
и т. Д.
ETA:
Чтобы ответить на вопросы конкретно о конструкторах, мне нравится то, как они сделаны, это то, что в x-коде легко определить, какие методы являются конструкторами. Типовые методы. Например, вы начинаете набирать:
[NSString string
И «intellisense» сокращает список методов до тех, которые начинаются со «string», которые, конечно же, являются методами конструктора (и все они также удобно сгруппированы вместе). То же самое применимо и к соглашению "init".
В конечном счете, я считаю, что философия Objective-C, воплощенная в фреймворках Cocoa (и фреймворках NextStep до него), заключается в том, что ясность и простота поддержки имеют приоритет над краткостью кода. Основным свидетельством этой философии является то, что селекторы Objective-C имеют именованные аргументы (например, - [NSObject performSelector: withObject:]
).
В случае фабричных методов, таких как + [NSString stringWithString:]
, вы должны помнить, что подклассы могут переопределять эти методы класса для возврата подклассов (например, кластеры классов, такие как NSNumber
).
Таким образом, вы можете получить вызов типа [MyPoorlyNamedSubclass stringWithString:]
, в этом случае - [MyPoorlyNamedSubclass withString: ]
не будет очевидно информативным относительно типа возвращаемого объекта (напомним, что многие фабричные методы возвращают тип id
). stringWithString:
, с другой стороны, дает понять, что метод вернет строку (или ее подкласс).
Они также используют это одно дополнительное слово, чтобы сказать, выпущен объект автоматически или нет. initWithFormat предназначен для неавтоматического выпуска, и когда его stringWithFormat автоматически выпускается ... Я думаю, они просто пошли этим способом сообщить читателю, какой тип управления памятью использует объект ...
Если вам это не нравится, почему бы не написать кучу операторов #define, которые вы включаете во все свои проекты?
Потому что это согласованно.
Существуют такие методы, как:
[NSDictionary dictionary]
[NSArray array]
Избавление от всего до с помощью
здесь явно не вариант. Сохранение этих, но сокращение других приведет к несогласованности в именовании удобных методов.
А удобные методы совместимы с init
и initWith…
методами.