Xamarin: кроссплатформенные грабли
Моисеев Дмитрий
twitter.com/Newbilius
2
Кроссплатфор-
менный код (70%)
iOS (17%)
Android (13%)
3
Xamarin (Mono)
API iOS/Android/…
4
Mono
ART/Dalvik
5
Лечим утечки памяти
page.Content = null;
testButton1.TouchUpInsid -= click;
...
6
7
8
9
Java
Xamarin
void setText (CharSequence text)
CharSequence getText ()
public String Text { get; set; }
10
Java
Xamarin
public class View {
public static final int VISIBLE = 0x00000000;
public static final int INVISIBLE = 0x00000004;
public static final int GONE = 0x00000008;
}
public enum ViewStates
{
Visible = 0,
Invisible = 4,
Gone = 8
}
11
Objective-C
Xamarin
UITableViewDataSource
UITableViewDelegate
UITableViewSource
+
12
Java
Xamarin
button.setOnClickListener(
new View.OnClickListener() {
public void onClick(View v) { }
});
button.OnClick += delegate {};
13
[Activity(
Theme = "@style/Theme.Splash",
MainLauncher = true,
Label = "Контур.Эльба",
Icon = "@drawable/icon")]
public class StartActivity:
FormsAppCompatActivity
14
Binding Library
Jar/Jad/Object-C...
Xamarin 15
namespace MGSwipeTableCellNamespace {
// @public interface MGSwipeButton : UIButton
[BaseType (typeof (UIButton))]
public interface MGSwipeButton {
// @property (nonatomic, strong) MGSwipeButtonCallback callback;
[Export ("callback", ArgumentSemantic.Retain)]
Func<MGSwipeTableCell, sbyte> Callback { get; set; }
// @property (assign, nonatomic) CGFloat buttonWidth;
[Export ("buttonWidth", ArgumentSemantic.UnsafeUnretained)]
nfloat ButtonWidth { get; set; }
16
17
Общий код
Portable
Class
Library
Shared
Project
18
19
Кроссплат-
форменный
код (50%)
Кроссплатфор-
менный UI (20%)
iOS (17%)
Android (13%)
20
XAMARIN.FORMS
Entry
EntryRenderer
(iOS)
EntryRenderer
(Android)
UITextField EditText
21
Content = new StackLayout
{
Children =
{
new Entry
{
Placeholder = "Эл. почта",
Keyboard = Keyboard.Email,
},
new Button
{
Text = "Войти"
},
new ActivityIndicator
{
IsRunning = true
}
}
}; 22
Постоянная нехватка

Компонентов

Свойств у компонентов

Стабильности
23
new ContentView
{
Padding = new Thickness
{
Top = 8,
Left = 20,
Right = 10,
Bottom = 8
},
Content = new XLabel
{
Text="New text"
}
} 24
public class XEditorRenderer: EditorRenderer
{
protected override void OnElementPropertyChanged(
object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
var xEditor = Element as XEditor;
if (xEditor == null)
return;
if (e.PropertyName == xEditor.PlaceholderProperty)
Control.Hint = xEditor.Placeholder;
if (e.PropertyName == xEditor.PlaceholderColorProperty)
Control.SetHintTextColor(xEditor.PlaceholderColor);
}
}
[assembly: ExportRenderer(typeof (XEditor),
typeof (XEditorRenderer))]
25
26
Control.BatchBegin();
//[...меняем свойства…]
Control.BatchCommit();
27
new MenuItem()
{
//работает везде
Text="Отправить",
//только в Android
Icon="menuicon_send"
}
28
1 2 3
1 3
29
Page
Android
View
iOS
ScreenController
30
31
Видимая строка
Видимая строка
Видимая строка
Видимая строка
Уже не видимая
строка
Ещё не видимая
строка
Строки для
переиспользования
var view = cell as INativeElementView;
if (view == null)
throw new InvalidOperationException
("Implement IBoxedCell
on cell renderer");
32
33
Xamarin
Плюсы
- общий код для нескольких платформ
- отсутствие ограничений по использованию
нативных API
- простое портирование .NET библиотек
Минусы
- проблемы с инструментарием
- потенциальные проблемы с нативными
библиотеками
34
Xamarin.Forms
Плюсы
- единая вёрстка для всех платформ
- скорость разработки простых интерфейсов
Минусы
- частые баги
- проблемы с производительностью
- не полная кроссплатформенность
- необходимость дописывать UI-компоненты
35
Вопросы?
Моисеев Дмитрий
https://twitter.com/Newbilius
https://github.com/Newbilius
newbilius@gmail.com

More Related Content

PDF
Aggregation vs Inheritance
PDF
Droidcon Moscow 2015. Взаимодействие между потоками в Android. Максим Ефимов ...
PDF
QA Fest 2019. Андрей Солнцев. Selenide для профи
PPT
Подробная презентация JavaScript 6 в 1
PDF
"Favicon на стероидах" Александр Амосов (Avito)
PDF
Favicon на стероидах
PPTX
Интерфейсы
PDF
DevConf. Дмитрий Сошников - ECMAScript 6
Aggregation vs Inheritance
Droidcon Moscow 2015. Взаимодействие между потоками в Android. Максим Ефимов ...
QA Fest 2019. Андрей Солнцев. Selenide для профи
Подробная презентация JavaScript 6 в 1
"Favicon на стероидах" Александр Амосов (Avito)
Favicon на стероидах
Интерфейсы
DevConf. Дмитрий Сошников - ECMAScript 6

Similar to Xamarin: кроссплатформенные грабли, Дмитрий Моисеев, СКБ Контур (20)

PPTX
Паттерны проектирования
PPTX
MVP, Moxy. Как правильно пользоваться
PPTX
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
PDF
"Погружение в Robolectric" Дмитрий Костырев (Avito)
PDF
ReactiveUI: Rx + MVVM
PPTX
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
PPTX
iOS and Android Mobile Test Automation
PDF
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
PDF
Toolbar (Lecture 16 – toolbar)
PDF
RxJava+RxAndroid (Lecture 20 – rx java)
PDF
Mobile automation uamobile
PDF
Автоматизация UI тестирования под Windows и Windows Phone
PDF
PVS-Studio в 2021 - Примеры ошибок
PDF
C# Desktop. Занятие 11.
PDF
Tricky Java Generics
PPTX
Статический и динамический полиморфизм в C++, Дмитрий Леванов
PPTX
SECON'2016. Иовлев Роман, JDI is UI Automation Future
PDF
MVVM в WinForms – DevExpress Way (теория и практика)
PPTX
Java осень 2012 лекция 8
PDF
Максим Хромцов "Yandex MapKit для Android OS в примерах"
Паттерны проектирования
MVP, Moxy. Как правильно пользоваться
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
ReactiveUI: Rx + MVVM
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
iOS and Android Mobile Test Automation
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
Toolbar (Lecture 16 – toolbar)
RxJava+RxAndroid (Lecture 20 – rx java)
Mobile automation uamobile
Автоматизация UI тестирования под Windows и Windows Phone
PVS-Studio в 2021 - Примеры ошибок
C# Desktop. Занятие 11.
Tricky Java Generics
Статический и динамический полиморфизм в C++, Дмитрий Леванов
SECON'2016. Иовлев Роман, JDI is UI Automation Future
MVVM в WinForms – DevExpress Way (теория и практика)
Java осень 2012 лекция 8
Максим Хромцов "Yandex MapKit для Android OS в примерах"
Ad

More from it-people (20)

PDF
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
PDF
«Scrapy internals» Александр Сибиряков, Scrapinghub
PDF
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
PDF
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
PDF
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
PDF
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
PDF
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
PDF
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
PDF
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
PDF
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
PDF
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
PDF
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
PDF
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
PDF
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
PDF
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
PDF
«(Без)опасный Python», Иван Цыганов, Positive Technologies
PDF
«Python of Things», Кирилл Борисов, Яндекс
PDF
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
PDF
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
PDF
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«Python of Things», Кирилл Борисов, Яндекс
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
Ad

Xamarin: кроссплатформенные грабли, Дмитрий Моисеев, СКБ Контур