{"id":300702,"date":"2020-03-25T09:00:29","date_gmt":"2020-03-25T09:00:29","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=300702"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=300702","title":{"rendered":"[\u041f\u043e \u0434\u043e\u043a\u0430\u043c] Flutter. \u0427\u0430\u0441\u0442\u044c 5. \u0414\u043b\u044f Xamarin.Forms-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/funcorp\/blog\/493518\/\">\u042d\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 <a href=\"https:\/\/flutter.dev\/docs\/get-started\/flutter-for\/xamarin-forms-devs\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e Flutter<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 Xamarin.Forms-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435! \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0443\u044e, \u0447\u0442\u043e\u0431\u044b \u043e\u0446\u0435\u043d\u0438\u0442\u044c, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0440\u043e\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u044d\u0442\u043e \u0437\u0430\u0439\u043c\u0451\u0442. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/iq\/7i\/wj\/iq7iwjn9pzsul5zvm2fmgayzjme.jpeg\"><br \/>  <a name=\"habracut\"><\/a><br \/>  \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u043f\u044b\u0442 \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<p>  <a href=\"https:\/\/habr.com\/ru\/company\/funcorp\/blog\/442432\/\">Flutter. \u0427\u0430\u0441\u0442\u044c 1. \u0414\u043b\u044f Android-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/a><br \/>  <a href=\"https:\/\/habr.com\/ru\/company\/funcorp\/blog\/477182\/\">Flutter. \u0427\u0430\u0441\u0442\u044c 2. \u0414\u043b\u044f iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/a><br \/>  <a href=\"https:\/\/habr.com\/ru\/company\/funcorp\/blog\/484284\/\">Flutter. \u0427\u0430\u0441\u0442\u044c 3. \u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 React Native<\/a><br \/>  <a href=\"https:\/\/habr.com\/ru\/company\/funcorp\/blog\/486822\/\">Flutter. \u0427\u0430\u0441\u0442\u044c 4. \u0414\u043b\u044f \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/a><br \/>  <b>Flutter. \u0427\u0430\u0441\u0442\u044c 5. \u0414\u043b\u044f Xamarin.Forms-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/b><\/p>\n<h2>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435:<\/h2>\n<p>  <\/p>\n<ol>\n<li><a href=\"#project\">\u041f\u0440\u043e\u0435\u043a\u0442<\/a><br \/> \n<ul>\n<li><a href=\"#entry_point\">\u0413\u0434\u0435 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430?<\/a><\/li>\n<li><a href=\"#element\">\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c Page \u0438\u043b\u0438 Element?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#views\">Views<\/a><br \/> \n<ul>\n<li><a href=\"#layout\">\u041a\u0430\u043a \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c \u0432\u0438\u0434\u0436\u0435\u0442\u044b? \u041a\u0430\u043a\u043e\u0439 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 \u0443 XAML-\u0444\u0430\u0439\u043b\u0430?<\/a><\/li>\n<li><a href=\"#add_remove\">\u041a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0438\u0434\u0436\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0434?<\/a><\/li>\n<li><a href=\"#animation\">\u041a\u0430\u043a \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0438\u0434\u0436\u0435\u0442?<\/a><\/li>\n<li><a href=\"#canvas\">\u041a\u0430\u043a \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435?<\/a><\/li>\n<li><a href=\"#opacity\">\u041a\u0430\u043a \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c?<\/a><\/li>\n<li><a href=\"#custom_widget\">\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#navigation\">\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f<\/a><br \/> \n<ul>\n<li><a href=\"#route\">\u041a\u0430\u043a \u043d\u0430\u0432\u0438\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u044d\u043a\u0440\u0430\u043d\u0430\u043c\u0438?<\/a><\/li>\n<li><a href=\"#outside\">\u041a\u0430\u043a \u043d\u0430\u0432\u0438\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#async\">Async UI<\/a><br \/> \n<ul>\n<li><a href=\"#main_thread\">\u041a\u0430\u043a\u043e\u0439 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 Device.BeginInvokeOnMainThread()? \u041a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u0434 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e?<\/a><\/li>\n<li><a href=\"#network\">\u041a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0441\u0435\u0442\u0438?<\/a><\/li>\n<li><a href=\"#progress\">\u041a\u0430\u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0434\u043e\u043b\u0433\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#structure\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b<\/a><br \/> \n<ul>\n<li><a href=\"#resources\">\u0413\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f?<\/a><\/li>\n<li><a href=\"#strings\">\u0413\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438? \u041a\u0430\u043a \u0438\u0445 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c?<\/a><\/li>\n<li><a href=\"#project_file\">\u0413\u0434\u0435 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u0430?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#lifecycle\">\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/a><br \/> \n<ul>\n<li><a href=\"#lifecycle_events\">\u041a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#layouts\">Layouts<\/a><br \/> \n<ul>\n<li><a href=\"#stack_layout\">\u041a\u0430\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 StackLayout?<\/a><\/li>\n<li><a href=\"#grid\">\u041a\u0430\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 Grid?<\/a><\/li>\n<li><a href=\"#scrollview\">\u041a\u0430\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 ScrollView?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#gestures\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0436\u0435\u0441\u0442\u043e\u0432<\/a><br \/> \n<ul>\n<li><a href=\"#clicks\">\u041a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043b\u0438\u043a\u0438?<\/a><\/li>\n<li><a href=\"#gestures_handling\">\u041a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0436\u0435\u0441\u0442\u044b?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#listview\">ListView \u0438 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u044b<\/a><br \/> \n<ul>\n<li><a href=\"#listview_analog\">\u041a\u0430\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u0443 ListView?<\/a><\/li>\n<li><a href=\"#click_element\">\u041a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u0431\u044b\u043b \u043a\u043b\u0438\u043a?<\/a><\/li>\n<li><a href=\"#listview_update\">\u041a\u0430\u043a \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c ListView?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#text\">\u0422\u0435\u043a\u0441\u0442<\/a><br \/> \n<ul>\n<li><a href=\"#fonts\">\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u044b?<\/a><\/li>\n<li><a href=\"#text_style\">\u041a\u0430\u043a \u0441\u0442\u0438\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b?<\/a><\/li>\n<li><a href=\"#placeholder\">\u041a\u0430\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u0443 Placeholder?<\/a><\/li>\n<li><a href=\"#validation_error\">\u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#plugins\">\u041f\u043b\u0430\u0433\u0438\u043d\u044b Flutter<\/a><br \/> \n<ul>\n<li><a href=\"#gps\">\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a GPS?<\/a><\/li>\n<li><a href=\"#camera\">\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u0430\u043c\u0435\u0440\u0435?<\/a><\/li>\n<li><a href=\"#facebook\">\u041a\u0430\u043a \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Facebook?<\/a><\/li>\n<li><a href=\"#firebase\">\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Firebase?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#platform\">Platform-specific code<\/a><br \/> \n<ul>\n<li><a href=\"#platform_detection\">\u041a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0434?<\/a><\/li>\n<li><a href=\"#native\">\u041a\u0430\u043a \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#debug\">\u041e\u0442\u043b\u0430\u0434\u043a\u0430<\/a><br \/> \n<ul>\n<li><a href=\"#instruments\">\u041a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f?<\/a><\/li>\n<li><a href=\"#hot_reload\">\u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c hot reload?<\/a><\/li>\n<li><a href=\"#developer_menu\">\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0435\u043d\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#storage\">\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/a><br \/> \n<ul>\n<li><a href=\"#key_value\">\u041a\u0430\u043a \u0445\u0440\u0430\u043d\u0438\u0442\u044c key-value-\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438?<\/a><\/li>\n<li><a href=\"#db\">\u041a\u0430\u043a \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<\/ol>\n<p>  <a name=\"project\"><\/a><\/p>\n<h2><b>\u041f\u0440\u043e\u0435\u043a\u0442<\/b><\/h2>\n<p>  <a name=\"entry_point\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u0413\u0434\u0435 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>main()<\/code>.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u044d\u0442\u043e <code>LoadApplication(new App());<\/code>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">void main() {   runApp(new MyApp()); }<\/code><\/pre>\n<p>  <a name=\"element\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.page?view=xamarin-forms\">Page<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.element?view=xamarin-forms\">Element<\/a>?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0412\u043e Flutter \u043d\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u0438\u044f <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.page?view=xamarin-forms\">Page<\/a> \u0438 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.element?view=xamarin-forms\">Element<\/a> \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u044b\u0445. \u0412\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u2014 \u044d\u0442\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u044b. \u0412\u043e Flutter \u0435\u0441\u0442\u044c 2 \u0432\u0438\u0434\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432: <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/StatelessWidget-class.html\">StatelessWidget<\/a> \u0438 <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/StatefulWidget-class.html\">StatefulWidget<\/a>. \u041e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e, \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043f\u0440\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/StatelessWidget-class.html\">StatelessWidget<\/a> \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430, \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u0430 \u0438 \u0442.\u0434. \u0422.\u0435. \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0437\u0430 \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0437\u043d\u0430\u0447\u0438\u0442, \u043e\u043d \u0432\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0441 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c.<\/p>\n<p>  <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/StatefulWidget-class.html\">StatefulWidget<\/a> \u0438\u043c\u0435\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/State-class.html\">State<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (\u043f\u0440\u0438\u0448\u0451\u043b \u043e\u0442\u0432\u0435\u0442 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0436\u0430\u043b \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u0442.\u0434.) \u2014 \u044d\u0442\u043e \u0432\u0430\u0448 \u0432\u0430\u0440\u0438\u0430\u043d\u0442. <\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  StatelessWidget:  <\/p>\n<pre><code class=\"kotlin\">class MyApp extends StatelessWidget {   \/\/ This widget is the root of your application.   @override   Widget build(BuildContext context) {     return new MaterialApp(       title: 'Flutter Demo',       theme: new ThemeData(         primarySwatch: Colors.blue,       ),       home: new MyHomePage(title: 'Flutter Demo Home Page'),     );   } }<\/code><\/pre>\n<p>  StatefulWidget:  <\/p>\n<pre><code class=\"kotlin\">class MyHomePage extends StatefulWidget {   MyHomePage({Key key, this.title}) : super(key: key);    final String title;    @override   _MyHomePageState createState() =&gt; new _MyHomePageState(); }  class _MyHomePageState extends State&lt;MyHomePage&gt; {   int _counter = 0;    void _incrementCounter() {     setState(() {       _counter++;     });   }    @override   Widget build(BuildContext context) {     return new Scaffold(       appBar: new AppBar(         \/\/ Take the value from the MyHomePage object that was created by         \/\/ the App.build method, and use it to set the appbar title.         title: new Text(widget.title),       ),       body: new Center(         \/\/ Center is a layout widget. It takes a single child and positions it         \/\/ in the middle of the parent.         child: new Column(           mainAxisAlignment: MainAxisAlignment.center,           children: &lt;Widget&gt;[             new Text(               'You have pushed the button this many times:',             ),             new Text(               '$_counter',               style: Theme.of(context).textTheme.display1,             ),           ],         ),       ),       floatingActionButton: new FloatingActionButton(         onPressed: _incrementCounter,         tooltip: 'Increment',         child: new Icon(Icons.add),       ),     );   } }<\/code><\/pre>\n<p>  <a name=\"views\"><\/a><\/p>\n<h2><b>Views<\/b><\/h2>\n<p>  <a name=\"layout\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c \u0432\u0438\u0434\u0436\u0435\u0442\u044b? \u041a\u0430\u043a\u043e\u0439 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 \u0443 <code>XAML<\/code>-\u0444\u0430\u0439\u043b\u0430?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0412\u043e Flutter \u0432\u0451\u0440\u0441\u0442\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u0435:<\/h4>\n<p>  \u0412 Xamarin.Forms \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0451\u0440\u0441\u0442\u043a\u0430 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 <code>XAML<\/code>-\u0444\u0430\u0439\u043b\u0435. \u0412\u043e Flutter \u043d\u0435\u0442 \u0435\u0433\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0430.<\/p>\n<h4>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:<\/h4>\n<p>  \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/flutter.dev\/docs\/development\/ui\/widgets\/layout\">\u0442\u0443\u0442<\/a>. <\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">@override Widget build(BuildContext context) {   return new Scaffold(     appBar: new AppBar(       title: new Text(&quot;Sample App&quot;),     ),     body: new Center(       child: new MaterialButton(         onPressed: () {},         child: new Text('Hello'),         padding: new EdgeInsets.only(left: 10.0, right: 10.0),       ),     ),   ); }<\/code><\/pre>\n<p>  <a name=\"add_remove\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0438\u0434\u0436\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0434?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code><a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.contentview.content?view=xamarin-forms#Xamarin_Forms_ContentView_Content\">Content<\/a><\/code> \u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>Add()<\/code> \u0438 <code>Remove()<\/code>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">class SampleApp extends StatelessWidget {   \/\/ This widget is the root of your application.   @override   Widget build(BuildContext context) {     return new MaterialApp(       title: 'Sample App',       theme: new ThemeData(         primarySwatch: Colors.blue,       ),       home: new SampleAppPage(),     );   } }  class SampleAppPage extends StatefulWidget {   SampleAppPage({Key key}) : super(key: key);    @override   _SampleAppPageState createState() =&gt; new _SampleAppPageState(); }  class _SampleAppPageState extends State&lt;SampleAppPage&gt; {   \/\/ Default value for toggle   bool toggle = true;   void _toggle() {     setState(() {       toggle = !toggle;     });   }    _getToggleChild() {     if (toggle) {       return new Text('Toggle One');     } else {       return new CupertinoButton(         onPressed: () {},         child: new Text('Toggle Two'),       );     }   }    @override   Widget build(BuildContext context) {     return new Scaffold(       appBar: new AppBar(         title: new Text(&quot;Sample App&quot;),       ),       body: new Center(         child: _getToggleChild(),       ),       floatingActionButton: new FloatingActionButton(         onPressed: _toggle,         tooltip: 'Update Text',         child: new Icon(Icons.update),       ),     );   } }<\/code><\/pre>\n<p>  <a name=\"animation\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0438\u0434\u0436\u0435\u0442?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <a href=\"https:\/\/api.flutter.dev\/flutter\/animation\/Animation-class.html\">Animation<\/a> \u0438 <a href=\"https:\/\/api.flutter.dev\/flutter\/animation\/AnimationController-class.html\">AnimationController<\/a>.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.viewextensions?view=xamarin-forms\">ViewExtensions<\/a> \u0438 \u043c\u0435\u0442\u043e\u0434\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code><a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.viewextensions.fadeto?view=xamarin-forms\">FadeTo<\/a><\/code> \u0438\u043b\u0438 <code><a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.viewextensions.translateto?view=xamarin-forms\">TranslateTo<\/a><\/code>.<\/p>\n<h4>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:<\/h4>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/flutter.dev\/docs\/development\/ui\/widgets\/animation\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">import 'package:flutter\/material.dart';  void main() {   runApp(new FadeAppTest()); }  class FadeAppTest extends StatelessWidget {   \/\/ This widget is the root of your application.   @override   Widget build(BuildContext context) {     return new MaterialApp(       title: 'Fade Demo',       theme: new ThemeData(         primarySwatch: Colors.blue,       ),       home: new MyFadeTest(title: 'Fade Demo'),     );   } }  class MyFadeTest extends StatefulWidget {   MyFadeTest({Key key, this.title}) : super(key: key);   final String title;   @override   _MyFadeTest createState() =&gt; new _MyFadeTest(); }  class _MyFadeTest extends State&lt;MyFadeTest&gt; with TickerProviderStateMixin {   AnimationController controller;   CurvedAnimation curve;    @override   void initState() {     controller = new AnimationController(duration: const Duration(milliseconds: 2000), vsync: this);     curve = new CurvedAnimation(parent: controller, curve: Curves.easeIn);   }    @override   Widget build(BuildContext context) {     return new Scaffold(       appBar: new AppBar(         title: new Text(widget.title),       ),       body: new Center(           child: new Container(               child: new FadeTransition(                   opacity: curve,                   child: new FlutterLogo(                     size: 100.0,                   )))),       floatingActionButton: new FloatingActionButton(         tooltip: 'Fade',         child: new Icon(Icons.brush),         onPressed: () {           controller.forward();         },       ),     );   } }<\/code><\/pre>\n<p>  <a name=\"canvas\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/CustomPaint-class.html\">CustomPaint<\/a> \u0438 <a href=\"https:\/\/api.flutter.dev\/flutter\/rendering\/CustomPainter-class.html\">CustomPainter<\/a>.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 <a href=\"https:\/\/github.com\/mono\/SkiaSharp\">SkiaSharp<\/a>. \u0412\u043e Flutter <a href=\"https:\/\/skia.org\/dev\/flutter\">Skia Canvas<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">import 'package:flutter\/material.dart';  void main() =&gt; runApp(new MaterialApp(home: new DemoApp()));  class DemoApp extends StatelessWidget {   Widget build(BuildContext context) =&gt; new Scaffold(body: new Signature()); }  class Signature extends StatefulWidget {   SignatureState createState() =&gt; new SignatureState(); }  class SignatureState extends State&lt;Signature&gt; {   List&lt;Offset&gt; _points = &lt;Offset&gt;[];   Widget build(BuildContext context) {     return new GestureDetector(       onPanUpdate: (DragUpdateDetails details) {         setState(() {           RenderBox referenceBox = context.findRenderObject();           Offset localPosition =           referenceBox.globalToLocal(details.globalPosition);           _points = new List.from(_points)..add(localPosition);         });       },       onPanEnd: (DragEndDetails details) =&gt; _points.add(null),       child: new CustomPaint(painter: new SignaturePainter(_points), size: Size.infinite),     );   } }  class SignaturePainter extends CustomPainter {   SignaturePainter(this.points);   final List&lt;Offset&gt; points;   void paint(Canvas canvas, Size size) {     var paint = new Paint()       ..color = Colors.black       ..strokeCap = StrokeCap.round       ..strokeWidth = 5.0;     for (int i = 0; i &lt; points.length - 1; i++) {       if (points[i] != null &amp;&amp; points[i + 1] != null)         canvas.drawLine(points[i], points[i + 1], paint);     }   }   bool shouldRepaint(SignaturePainter other) =&gt; other.points != points; }<\/code><\/pre>\n<p>  <a name=\"opacity\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0438\u0434\u0436\u0435\u0442\u0430 <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/Opacity-class.html\">Opacity<\/a>.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.visualelement.opacity?view=xamarin-forms\">Opacity<\/a> \u0443 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.visualelement?view=xamarin-forms\">VisualElement<\/a>. \u0412\u043e Flutter \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u0432 <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/Opacity-class.html\">Opacity<\/a>.<\/p>\n<p>  <a name=\"custom_widget\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e (\u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f).<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0430\u0441 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.visualelement?view=xamarin-forms\">VisualElement<\/a> \u0438 \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043b\u043e\u0433\u0438\u043a\u0443. \u0412\u043e Flutter \u0432\u0438\u0434\u0436\u0435\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/StatelessWidget-class.html\">StatelessWidget<\/a> \u0438 <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/StatefulWidget-class.html\">StatefulWidget<\/a>. \u0422.\u0435. \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0451\u043c \u043d\u0430\u0431\u043e\u0440 \u043d\u0443\u0436\u043d\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u043b\u0438 \u043f\u043e\u043b\u0435\u0439.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">class CustomButton extends StatelessWidget {   final String label;    CustomButton(this.label);    @override   Widget build(BuildContext context) {     return new RaisedButton(onPressed: () {}, child: new Text(label));   } }<\/code><\/pre>\n<p>  <a name=\"navigation\"><\/a><\/p>\n<h2><b>\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f<\/b><\/h2>\n<p>  <a name=\"route\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u043d\u0430\u0432\u0438\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u044d\u043a\u0440\u0430\u043d\u0430\u043c\u0438?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u044d\u043a\u0440\u0430\u043d\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u044b <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/Navigator-class.html\">Navigator<\/a> \u0438 <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/Route-class.html\">Route<\/a>.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.navigationpage?view=xamarin-forms\">NavigationPage<\/a>.<\/p>\n<p>  \u0412\u043e Flutter \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0445\u043e\u0436\u0438 \u0441 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.navigationpage?view=xamarin-forms\">NavigationPage<\/a>:<\/p>\n<ol>\n<li>\u043e\u043f\u0438\u0441\u0430\u0442\u044c Map \u0441 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/Route-class.html\">Route<\/a>;<\/li>\n<li>\u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0430\u0432\u0438\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/Route-class.html\">Route<\/a>.<\/li>\n<\/ol>\n<p>  <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/Navigator-class.html\">Navigator<\/a> \u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/Navigator\/push.html\">push()<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/Navigator\/pop.html\">pop()<\/a> \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0432\u0430\u043c\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0443.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">void main() {   runApp(CupertinoApp(     home: MyAppHome(), \/\/ becomes the route named '\/'     routes: &lt;String, WidgetBuilder&gt; {       '\/a': (BuildContext context) =&gt; MyPage(title: 'page A'),       '\/b': (BuildContext context) =&gt; MyPage(title: 'page B'),       '\/c': (BuildContext context) =&gt; MyPage(title: 'page C'),     },   )); }  Navigator.of(context).pushNamed('\/b');<\/code><\/pre>\n<p>  <a name=\"outside\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u043d\u0430\u0432\u0438\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/flutter.dev\/docs\/development\/platform-integration\/platform-channels?tab=android-channel-kotlin-tab\">MethodChannel<\/a> \u043b\u0438\u0431\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <a href=\"https:\/\/pub.dev\/packages\/url_launcher\">url_launcher<\/a>.<\/p>\n<p>  <a name=\"async\"><\/a><\/p>\n<h2><b>Async UI<\/b><\/h2>\n<p>  <a name=\"main_thread\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a\u043e\u0439 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.device.begininvokeonmainthread?view=xamarin-forms\">Device.BeginInvokeOnMainThread()<\/a>? \u041a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u0434 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0412 Dart \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044f\u0445 (<a href=\"https:\/\/api.dart.dev\/stable\/2.7.1\/dart-isolate\/Isolate-class.html\">Isolates<\/a>). \u0414\u043b\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f async\/await, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u044b \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0438\u0437 C#.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f UI:  <\/p>\n<pre><code class=\"kotlin\">loadData() async {   String dataURL = &quot;https:\/\/jsonplaceholder.typicode.com\/posts&quot;;   http.Response response = await http.get(dataURL);   setState(() {     widgets = json.decode(response.body);   }); }<\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/State\/setState.html\">setState()<\/a> \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/ListView-class.html\">ListView<\/a>:  <\/p>\n<pre><code class=\"kotlin\">import 'dart:convert';  import 'package:flutter\/material.dart'; import 'package:http\/http.dart' as http;  void main() {   runApp(SampleApp()); }  class SampleApp extends StatelessWidget {   @override   Widget build(BuildContext context) {     return MaterialApp(       title: 'Sample App',       theme: ThemeData(         primarySwatch: Colors.blue,       ),       home: SampleAppPage(),     );   } }  class SampleAppPage extends StatefulWidget {   SampleAppPage({Key key}) : super(key: key);    @override   _SampleAppPageState createState() =&gt; _SampleAppPageState(); }  class _SampleAppPageState extends State&lt;SampleAppPage&gt; {   List widgets = [];    @override   void initState() {     super.initState();      loadData();   }    @override   Widget build(BuildContext context) {     return Scaffold(       appBar: AppBar(         title: Text(&quot;Sample App&quot;),       ),       body: ListView.builder(           itemCount: widgets.length,           itemBuilder: (BuildContext context, int position) {             return getRow(position);           }));   }    Widget getRow(int i) {     return Padding(       padding: EdgeInsets.all(10.0),       child: Text(&quot;Row ${widgets[i][&quot;title&quot;]}&quot;)     );   }    loadData() async {     String dataURL = &quot;https:\/\/jsonplaceholder.typicode.com\/posts&quot;;     http.Response response = await http.get(dataURL);     setState(() {       widgets = json.decode(response.body);     });   } }<\/code><\/pre>\n<p>  <a name=\"network\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0441\u0435\u0442\u0438?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <a href=\"https:\/\/pub.dev\/packages\/http\">http<\/a>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 <code>pubspec.yaml<\/code>:  <\/p>\n<pre><code class=\"xml\">dependencies:   ...   http: ^0.11.3+16<\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0440\u043e\u0441:  <\/p>\n<pre><code class=\"kotlin\">import 'dart:convert';  import 'package:flutter\/material.dart'; import 'package:http\/http.dart' as http; [...]   loadData() async {     String dataURL = &quot;https:\/\/jsonplaceholder.typicode.com\/posts&quot;;     http.Response response = await http.get(dataURL);     setState(() {       widgets = json.decode(response.body);     });   } }<\/code><\/pre>\n<p>  <a name=\"progress\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0434\u043e\u043b\u0433\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/api.flutter.dev\/flutter\/material\/ProgressIndicator-class.html\">ProgressIndicator<\/a>. <\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0432 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u0432 <code>XAML<\/code>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">import 'dart:convert';  import 'package:flutter\/material.dart'; import 'package:http\/http.dart' as http;  void main() {   runApp(new SampleApp()); }  class SampleApp extends StatelessWidget {   @override   Widget build(BuildContext context) {     return new MaterialApp(       title: 'Sample App',       theme: new ThemeData(         primarySwatch: Colors.blue,       ),       home: new SampleAppPage(),     );   } }  class SampleAppPage extends StatefulWidget {   SampleAppPage({Key key}) : super(key: key);    @override   _SampleAppPageState createState() =&gt; new _SampleAppPageState(); }  class _SampleAppPageState extends State&lt;SampleAppPage&gt; {   List widgets = [];    @override   void initState() {     super.initState();     loadData();   }    showLoadingDialog() {     return widgets.length == 0;   }    getBody() {     if (showLoadingDialog()) {       return getProgressDialog();     } else {       return getListView();     }   }    getProgressDialog() {     return new Center(child: new CircularProgressIndicator());   }    @override   Widget build(BuildContext context) {     return new Scaffold(         appBar: new AppBar(           title: new Text(&quot;Sample App&quot;),         ),         body: getBody());   }    ListView getListView() =&gt; new ListView.builder(       itemCount: widgets.length,       itemBuilder: (BuildContext context, int position) {         return getRow(position);       });    Widget getRow(int i) {     return new Padding(padding: new EdgeInsets.all(10.0), child: new Text(&quot;Row ${widgets[i][&quot;title&quot;]}&quot;));   }    loadData() async {     String dataURL = &quot;https:\/\/jsonplaceholder.typicode.com\/posts&quot;;     http.Response response = await http.get(dataURL);     setState(() {       widgets = json.decode(response.body);     });   } }<\/code><\/pre>\n<p>  <a name=\"structure\"><\/a><\/p>\n<h2><b>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b<\/b><\/h2>\n<p>  <a name=\"resources\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u0413\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0412 <code>assets<\/code>.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u043d\u0435\u0442 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0445 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043f\u043a\u0430\u0445 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0412\u043e Flutter \u0435\u0441\u0442\u044c <code>assets<\/code>. \u041f\u0430\u043f\u043a\u0430 <code>assets<\/code> \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u043d\u0435\u0439 \u0432 \u0444\u0430\u0439\u043b\u0435 <code>pubspec.yaml<\/code>.<\/p>\n<h4>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:<\/h4>\n<p>  \u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 Android \u0438 Flutter.  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<tr>\n<td>Android density qualifier<\/td>\n<td>Flutter pixel ratio<\/td>\n<\/tr>\n<tr>\n<td>ldpi<\/td>\n<td>0.75x<\/td>\n<\/tr>\n<tr>\n<td>mdpi<\/td>\n<td>1.0x<\/td>\n<\/tr>\n<tr>\n<td>hdpi<\/td>\n<td>1.5x<\/td>\n<\/tr>\n<tr>\n<td>xhdpi<\/td>\n<td>2.0x<\/td>\n<\/tr>\n<tr>\n<td>xxhdpi<\/td>\n<td>3.0x<\/td>\n<\/tr>\n<tr>\n<td>xxxhdpi<\/td>\n<td>4.0x<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432:  <\/p>\n<pre><code class=\"xml\">images\/my_icon.png       \/\/ Base: 1.0x image images\/2.0x\/my_icon.png  \/\/ 2.0x image images\/3.0x\/my_icon.png  \/\/ 3.0x image<\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0443\u0442\u0438 \u0432 <code>pubspec.yaml<\/code> \u0444\u0430\u0439\u043b\u0435:  <\/p>\n<pre><code class=\"xml\">assets:  - images\/my_icon.jpeg <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"https:\/\/api.flutter.dev\/flutter\/painting\/AssetImage-class.html\">AssetImage<\/a>:  <\/p>\n<pre><code class=\"kotlin\">return AssetImage(&quot;images\/a_dot_burr.jpeg&quot;);<\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>asset<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e:  <\/p>\n<pre><code class=\"kotlin\">@override Widget build(BuildContext context) {   return Image.asset(&quot;images\/my_image.png&quot;); }<\/code><\/pre>\n<p>  <a name=\"strings\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u0413\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438? \u041a\u0430\u043a \u0438\u0445 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0412\u043e Flutter \u043d\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u0418\u0445 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435. \u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/api.flutter.dev\/flutter\/flutter_localizations\/flutter_localizations-library.html\">flutter_localizations<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/pub.dev\/packages\/l10n\">l10n<\/a>.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b <code>resx<\/code>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435:  <\/p>\n<pre><code class=\"kotlin\">class Strings {   static String welcomeMessage = &quot;Welcome To Flutter&quot;; }<\/code><\/pre>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435:  <\/p>\n<pre><code class=\"kotlin\">new Text(Strings.welcomeMessage)<\/code><\/pre>\n<p>  \u041b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f:  <\/p>\n<pre><code class=\"xml\">dependencies:   # ...   flutter_localizations:     sdk: flutter   intl: &quot;^0.15.6&quot;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"kotlin\">import 'package:flutter_localizations\/flutter_localizations.dart';  new MaterialApp(  localizationsDelegates: [    \/\/ Add app-specific localization delegate[s] here.    GlobalMaterialLocalizations.delegate,    GlobalWidgetsLocalizations.delegate,  ],  supportedLocales: [     const Locale('en', 'US'), \/\/ English     const Locale('he', 'IL'), \/\/ Hebrew     \/\/ ... other locales the app supports   ],   \/\/ ... )<\/code><\/pre>\n<p>  <a name=\"project_file\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u0413\u0434\u0435 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u0430?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0412\u043e Flutter \u043d\u0435\u0442 \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0441\u0440\u0435\u0434\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0411\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u0444\u0430\u0439\u043b \u2014 <code>pubspec.yaml<\/code> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438 \u0434\u0435\u0442\u0430\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>  <a name=\"lifecycle\"><\/a><\/p>\n<h2><b>\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/b><\/h2>\n<p>  <a name=\"lifecycle_events\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/WidgetsBinding-mixin.html\">WidgetsBinding<\/a> \u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/WidgetsBindingObserver\/didChangeAppLifecycleState.html\">didChangeAppLifecycleState()<\/a>.<\/p>\n<h4>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:<\/h4>\n<p>  \u0412\u043e Flutter \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/api.flutter.dev\/javadoc\/io\/flutter\/embedding\/android\/FlutterActivity.html\">FlutterActivity<\/a> \u0432 Android-\u043a\u043e\u0434\u0435 \u0438 <a href=\"https:\/\/api.flutter.dev\/objcdoc\/Classes\/FlutterAppDelegate.html\">FlutterAppDelegate<\/a> \u0432 iOS, \u0437\u0430 \u0441\u0447\u0451\u0442 \u044d\u0442\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043e\u043a Flutter \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0439. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0432\u0441\u0451 \u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0442\u043e \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f:  <\/p>\n<ul>\n<li>inactive \u2014 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 iOS, \u0432 Android \u043d\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0430;<\/li>\n<li>paused \u2014 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d onPause() \u0432 Android;<\/li>\n<li>resumed \u2014 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d onPostResume() \u0432 Android;<\/li>\n<li>suspending \u2014 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d onStop \u0432 Android, \u0432 iOS \u043d\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0430.<\/li>\n<\/ul>\n<p>  \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0432 <a href=\"https:\/\/api.flutter.dev\/flutter\/dart-ui\/AppLifecycleState-class.html\">AppLifecycleStatus documentation<\/a>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">import 'package:flutter\/widgets.dart';  class LifecycleWatcher extends StatefulWidget {   @override   _LifecycleWatcherState createState() =&gt; _LifecycleWatcherState(); }  class _LifecycleWatcherState extends State&lt;LifecycleWatcher&gt; with WidgetsBindingObserver {   AppLifecycleState _lastLifecycleState;    @override   void initState() {     super.initState();     WidgetsBinding.instance.addObserver(this);   }    @override   void dispose() {     WidgetsBinding.instance.removeObserver(this);     super.dispose();   }    @override   void didChangeAppLifecycleState(AppLifecycleState state) {     setState(() {       _lastLifecycleState = state;     });   }    @override   Widget build(BuildContext context) {     if (_lastLifecycleState == null)       return Text('This widget has not observed any lifecycle changes.', textDirection: TextDirection.ltr);      return Text('The most recent lifecycle state this widget observed was: $_lastLifecycleState.',         textDirection: TextDirection.ltr);   } }  void main() {   runApp(Center(child: LifecycleWatcher())); }<\/code><\/pre>\n<p>  <a name=\"layouts\"><\/a><\/p>\n<h2><b>Layouts<\/b><\/h2>\n<p>  <a name=\"stack_layout\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.stacklayout?view=xamarin-forms\">StackLayout<\/a>?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u043e\u043c <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.stacklayout?view=xamarin-forms\">StackLayout<\/a> \u0441 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/Column-class.html\">Column<\/a>, \u0430 \u0441 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u2014 <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/Row-class.html\">Row<\/a>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  Column:  <\/p>\n<pre><code class=\"kotlin\">@override Widget build(BuildContext context) {   return new Column(     mainAxisAlignment: MainAxisAlignment.center,     children: &lt;Widget&gt;[       new Text('Column One'),       new Text('Column Two'),       new Text('Column Three'),       new Text('Column Four'),     ],   ); }<\/code><\/pre>\n<p>  Row:  <\/p>\n<pre><code class=\"kotlin\">@override Widget build(BuildContext context) {   return new Row(     mainAxisAlignment: MainAxisAlignment.center,     children: &lt;Widget&gt;[       new Text('Row One'),       new Text('Row Two'),       new Text('Row Three'),       new Text('Row Four'),     ],   ); }<\/code><\/pre>\n<p>  <a name=\"grid\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u0443 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.grid?view=xamarin-forms\">Grid<\/a>?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/GridView-class.html\">GridView<\/a>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">GridView.count(   \/\/ Create a grid with 2 columns. If you change the scrollDirection to   \/\/ horizontal, this would produce 2 rows.   crossAxisCount: 2,   \/\/ Generate 100 widgets that display their index in the List   children: List.generate(100, (index) {     return Center(       child: Text(         'Item $index',         style: Theme.of(context).textTheme.headline,       ),     );   }), );<\/code><\/pre>\n<p>  <a name=\"scrollview\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u0443 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/xamarin\/xamarin-forms\/user-interface\/layouts\/scroll-view\">ScrollView<\/a>?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0411\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u2014 <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/SingleChildScrollView-class.html\">SingleChildScrollView<\/a>. \u041d\u043e \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u043e\u043b\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0432\u043e Flutter \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/ListView-class.html\">ListView<\/a>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  SingleChildScrollView:  <\/p>\n<pre><code class=\"kotlin\">@override Widget build(BuildContext context) {   return new SingleChildScrollView(     child: new Text('Long Content'),   ); }<\/code><\/pre>\n<p>  ListView:  <\/p>\n<pre><code class=\"kotlin\">@override Widget build(BuildContext context) {   return new ListView(     children: &lt;Widget&gt;[       new Text('Row One'),       new Text('Row Two'),       new Text('Row Three'),       new Text('Row Four'),     ],   ); }<\/code><\/pre>\n<p>  <a name=\"gestures\"><\/a><\/p>\n<h2><b>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0436\u0435\u0441\u0442\u043e\u0432<\/b><\/h2>\n<p>  <a name=\"clicks\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043b\u0438\u043a\u0438?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0438\u0434\u0436\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>onPressed<\/code>, \u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043b\u0438\u043a \u043c\u043e\u0436\u043d\u043e \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/GestureDetector-class.html\">GestureDetector<\/a>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  onPressed:  <\/p>\n<pre><code class=\"kotlin\">@override Widget build(BuildContext context) {   return new RaisedButton(       onPressed: () {         print(&quot;click&quot;);       },       child: new Text(&quot;Button&quot;)); }<\/code><\/pre>\n<p>  GestureDetector:  <\/p>\n<pre><code class=\"kotlin\">class SampleApp extends StatelessWidget {   @override   Widget build(BuildContext context) {     return new Scaffold(         body: new Center(       child: new GestureDetector(         child: new FlutterLogo(           size: 200.0,         ),         onTap: () {           print(&quot;tap&quot;);         },       ),     ));   } }<\/code><\/pre>\n<p>  <a name=\"gestures_handling\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0436\u0435\u0441\u0442\u044b?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/GestureDetector-class.html\">GestureDetector<\/a>. \u0418\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:<\/p>\n<h4>Tap<\/h4>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/GestureDetector\/onTapDown.html\">onTapDown<\/a><\/li>\n<li><a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/GestureDetector\/onTapUp.html\">onTapUp<\/a><\/li>\n<li><a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/GestureDetector\/onTap.html\">onTap<\/a><\/li>\n<li><a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/GestureDetector\/onTapCancel.html\">onTapCancel<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h4>Double tap<\/h4>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/GestureDetector\/onDoubleTap.html\">onDoubleTap<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h4>Long press<\/h4>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/GestureDetector\/onLongPress.html\">onLongPress<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h4>Vertical drag<\/h4>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/GestureDetector\/onVerticalDragStart.html\">onVerticalDragStart<\/a><\/li>\n<li><a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/GestureDetector\/onVerticalDragUpdate.html\">onVerticalDragUpdate<\/a><\/li>\n<li><a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/GestureDetector\/onVerticalDragEnd.html\">onVerticalDragEnd<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h4>Horizontal drag<\/h4>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/GestureDetector\/onHorizontalDragStart.html\">onHorizontalDragStart<\/a><\/li>\n<li><a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/GestureDetector\/onHorizontalDragUpdate.html\">onHorizontalDragUpdate<\/a><\/li>\n<li><a href=\"https:\/\/docs.flutter.io\/flutter\/widgets\/GestureDetector\/onHorizontalDragEnd.html\">onHorizontalDragEnd<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">AnimationController controller; CurvedAnimation curve;  @override void initState() {   controller = new AnimationController(duration: const Duration(milliseconds: 2000), vsync: this);   curve = new CurvedAnimation(parent: controller, curve: Curves.easeIn); }  class SampleApp extends StatelessWidget {   @override   Widget build(BuildContext context) {     return new Scaffold(         body: new Center(           child: new GestureDetector(             child: new RotationTransition(                 turns: curve,                 child: new FlutterLogo(                   size: 200.0,                 )),             onDoubleTap: () {               if (controller.isCompleted) {                 controller.reverse();               } else {                 controller.forward();               }             },         ),     ));   } }<\/code><\/pre>\n<p>  <a name=\"listview\"><\/a><\/p>\n<h2><b>ListView \u0438 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u044b<\/b><\/h2>\n<p>  <a name=\"listview_analog\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u0443 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/xamarin\/xamarin-forms\/user-interface\/listview\/\">ListView<\/a>?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/ListView-class.html\">ListView<\/a>.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/xamarin\/xamarin-forms\/app-fundamentals\/custom-renderer\/viewcell\">ViewCell<\/a> \u0438 (\u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e) <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/xamarin\/xamarin-forms\/app-fundamentals\/templates\/data-templates\/selector\">DataTemplateSelector<\/a> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0438\u0445 \u0432 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/xamarin\/xamarin-forms\/user-interface\/listview\/\">ListView<\/a>. \u0412\u043e Flutter \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">import 'package:flutter\/material.dart';  void main() {   runApp(new SampleApp()); }  class SampleApp extends StatelessWidget {   \/\/ This widget is the root of your application.   @override   Widget build(BuildContext context) {     return new MaterialApp(       title: 'Sample App',       theme: new ThemeData(         primarySwatch: Colors.blue,       ),       home: new SampleAppPage(),     );   } }  class SampleAppPage extends StatefulWidget {   SampleAppPage({Key key}) : super(key: key);    @override   _SampleAppPageState createState() =&gt; new _SampleAppPageState(); }  class _SampleAppPageState extends State&lt;SampleAppPage&gt; {   @override   Widget build(BuildContext context) {     return new Scaffold(       appBar: new AppBar(         title: new Text(&quot;Sample App&quot;),       ),       body: new ListView(children: _getListData()),     );   }    _getListData() {     List&lt;Widget&gt; widgets = [];     for (int i = 0; i &lt; 100; i++) {       widgets.add(new Padding(padding: new EdgeInsets.all(10.0), child: new Text(&quot;Row $i&quot;)));     }     return widgets;   } }<\/code><\/pre>\n<p>  <a name=\"click_element\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u0431\u044b\u043b \u043a\u043b\u0438\u043a?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0412\u043e Flutter \u0432\u0438\u0434\u0436\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043b\u0438\u043a \u0441\u0430\u043c.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.listview.itemtapped?view=xamarin-forms\">ItemTapped<\/a>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">import 'package:flutter\/material.dart';  void main() {   runApp(new SampleApp()); }  class SampleApp extends StatelessWidget {   \/\/ This widget is the root of your application.   @override   Widget build(BuildContext context) {     return new MaterialApp(       title: 'Sample App',       theme: new ThemeData(         primarySwatch: Colors.blue,       ),       home: new SampleAppPage(),     );   } }  class SampleAppPage extends StatefulWidget {   SampleAppPage({Key key}) : super(key: key);    @override   _SampleAppPageState createState() =&gt; new _SampleAppPageState(); }  class _SampleAppPageState extends State&lt;SampleAppPage&gt; {   @override   Widget build(BuildContext context) {     return new Scaffold(       appBar: new AppBar(         title: new Text(&quot;Sample App&quot;),       ),       body: new ListView(children: _getListData()),     );   }    _getListData() {     List&lt;Widget&gt; widgets = [];     for (int i = 0; i &lt; 100; i++) {       widgets.add(new GestureDetector(         child: new Padding(             padding: new EdgeInsets.all(10.0),             child: new Text(&quot;Row $i&quot;)),         onTap: () {           print('row tapped');         },       ));     }     return widgets;   } }<\/code><\/pre>\n<p>  <a name=\"listview_update\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/ListView-class.html\">ListView<\/a>?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code><a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/State\/setState.html\">setState()<\/a><\/code>.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.itemsview-1.itemssource?view=xamarin-forms\">ItemsSource<\/a>. \u0412\u043e Flutter \u043f\u043e\u0441\u043b\u0435 <code><a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/State\/setState.html\">setState()<\/a><\/code> \u0432\u0438\u0434\u0436\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u0430\u043d \u0437\u0430\u043d\u043e\u0432\u043e.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">import 'package:flutter\/material.dart';  void main() {   runApp(SampleApp()); }  class SampleApp extends StatelessWidget {   \/\/ This widget is the root of your application.   @override   Widget build(BuildContext context) {     return MaterialApp(       title: 'Sample App',       theme: ThemeData(         primarySwatch: Colors.blue,       ),       home: SampleAppPage(),     );   } }  class SampleAppPage extends StatefulWidget {   SampleAppPage({Key key}) : super(key: key);    @override   _SampleAppPageState createState() =&gt; _SampleAppPageState(); }  class _SampleAppPageState extends State&lt;SampleAppPage&gt; {   List widgets = [];    @override   void initState() {     super.initState();     for (int i = 0; i &lt; 100; i++) {       widgets.add(getRow(i));     }   }    @override   Widget build(BuildContext context) {     return Scaffold(       appBar: AppBar(         title: Text(&quot;Sample App&quot;),       ),       body: ListView(children: widgets),     );   }    Widget getRow(int i) {     return GestureDetector(       child: Padding(         padding: EdgeInsets.all(10.0),         child: Text(&quot;Row $i&quot;),       ),       onTap: () {         setState(() {           widgets = List.from(widgets);           widgets.add(getRow(widgets.length + 1));           print('row $i');         });       },     );   } } <\/code><\/pre>\n<p>  <\/p>\n<h4>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:<\/h4>\n<p>  \u0414\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/api.flutter.dev\/flutter\/widgets\/ListView\/ListView.builder.html\">ListView.Builder<\/a>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">import 'package:flutter\/material.dart';  void main() {   runApp(SampleApp()); }  class SampleApp extends StatelessWidget {   \/\/ This widget is the root of your application.   @override   Widget build(BuildContext context) {     return MaterialApp(       title: 'Sample App',       theme: ThemeData(         primarySwatch: Colors.blue,       ),       home: SampleAppPage(),     );   } }  class SampleAppPage extends StatefulWidget {   SampleAppPage({Key key}) : super(key: key);    @override   _SampleAppPageState createState() =&gt; _SampleAppPageState(); }  class _SampleAppPageState extends State&lt;SampleAppPage&gt; {   List widgets = [];    @override   void initState() {     super.initState();     for (int i = 0; i &lt; 100; i++) {       widgets.add(getRow(i));     }   }    @override   Widget build(BuildContext context) {     return Scaffold(       appBar: AppBar(         title: Text(&quot;Sample App&quot;),       ),       body: ListView.builder(         itemCount: widgets.length,         itemBuilder: (BuildContext context, int position) {           return getRow(position);         },       ),     );   }    Widget getRow(int i) {     return GestureDetector(       child: Padding(         padding: EdgeInsets.all(10.0),         child: Text(&quot;Row $i&quot;),       ),       onTap: () {         setState(() {           widgets.add(getRow(widgets.length + 1));           print('row $i');         });       },     );   } } <\/code><\/pre>\n<p>  <a name=\"text\"><\/a><\/p>\n<h2><b>\u0422\u0435\u043a\u0441\u0442<\/b><\/h2>\n<p>  <a name=\"fonts\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u044b?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0424\u0430\u0439\u043b \u0448\u0440\u0438\u0444\u0442\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0443 (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u0441\u0430\u043c\u0438) \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a \u043d\u0435\u0439 \u043f\u0443\u0442\u044c \u0432 <code>pubspec.yaml<\/code>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"xml\">fonts:    - family: MyCustomFont      fonts:        - asset: fonts\/MyCustomFont.ttf        - style: italic <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"kotlin\">@override Widget build(BuildContext context) {   return Scaffold(     appBar: AppBar(       title: Text(&quot;Sample App&quot;),     ),     body: Center(       child: Text(         'This is a custom font text',         style: TextStyle(fontFamily: 'MyCustomFont'),       ),     ),   ); } <\/code><\/pre>\n<p>  <a name=\"text_style\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0441\u0442\u0438\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:<\/p>\n<ul>\n<li>color;<\/li>\n<li>decoration;<\/li>\n<li>decorationColor;<\/li>\n<li>decorationStyle;<\/li>\n<li>fontFamily;<\/li>\n<li>fontSize;<\/li>\n<li>fontStyle;<\/li>\n<li>fontWeight;<\/li>\n<li>hashCode;<\/li>\n<li>height;<\/li>\n<li>inherit;<\/li>\n<li>letterSpacing;<\/li>\n<li>textBaseline;<\/li>\n<li>wordSpacing.<\/li>\n<\/ul>\n<p>  <a name=\"placeholder\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u0443 <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/dotnet\/api\/xamarin.forms.inputview.placeholder?view=xamarin-forms\">Placeholder<\/a>?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e <a href=\"https:\/\/api.flutter.dev\/flutter\/material\/InputDecoration\/hintText.html\">hintText<\/a> \u0443 <a href=\"https:\/\/api.flutter.dev\/flutter\/material\/InputDecoration-class.html\">InputDecoration<\/a>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">body: new Center(   child: new TextField(     decoration: new InputDecoration(hintText: &quot;This is a hint&quot;),   ) )<\/code><\/pre>\n<p>  <a name=\"validation_error\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0412\u0441\u0451 \u0442\u0430\u043a \u0436\u0435 \u2014 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.flutter.io\/flutter\/material\/InputDecoration-class.html\">InputDecoration<\/a> \u0438 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  <\/p>\n<pre><code class=\"kotlin\">class SampleApp extends StatelessWidget {   \/\/ This widget is the root of your application.   @override   Widget build(BuildContext context) {     return MaterialApp(       title: 'Sample App',       theme: ThemeData(         primarySwatch: Colors.blue,       ),       home: SampleAppPage(),     );   } }  class SampleAppPage extends StatefulWidget {   SampleAppPage({Key key}) : super(key: key);    @override   _SampleAppPageState createState() =&gt; _SampleAppPageState(); }  class _SampleAppPageState extends State&lt;SampleAppPage&gt; {   String _errorText;    @override   Widget build(BuildContext context) {     return Scaffold(       appBar: AppBar(         title: Text(&quot;Sample App&quot;),       ),       body: Center(         child: TextField(           onSubmitted: (String text) {             setState(() {               if (!isEmail(text)) {                 _errorText = 'Error: This is not an email';               } else {                 _errorText = null;               }             });           },           decoration: InputDecoration(hintText: &quot;This is a hint&quot;, errorText: _getErrorText()),         ),       ),     );   }    _getErrorText() {     return _errorText;   }    bool isEmail(String emailString) {     String emailRegexp =         r'^(([^&lt;&gt;()[\\]\\\\.,;:\\s@\\&quot;]+(\\.[^&lt;&gt;()[\\]\\\\.,;:\\s@\\&quot;]+)*)|(\\&quot;.+\\&quot;))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$';      RegExp regExp = RegExp(emailRegexp);      return regExp.hasMatch(emailString);   } }<\/code><\/pre>\n<p>  <a name=\"plugins\"><\/a><\/p>\n<h2><b>\u041f\u043b\u0430\u0433\u0438\u043d\u044b Flutter<\/b><\/h2>\n<p>  <a name=\"gps\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a GPS?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <a href=\"https:\/\/pub.dartlang.org\/packages\/geolocator\">geolocator<\/a>.<\/p>\n<p>  <a name=\"camera\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u0430\u043c\u0435\u0440\u0435?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <a href=\"https:\/\/pub.dartlang.org\/packages\/image_picker\">image_picker<\/a>.<\/p>\n<p>  <a name=\"facebook\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Facebook?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <a href=\"https:\/\/pub.dartlang.org\/packages\/flutter_facebook_login\">flutter_facebook_login<\/a>.<\/p>\n<p>  <a name=\"firebase\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Firebase?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  Firebase \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <a href=\"https:\/\/pub.dartlang.org\/flutter\/packages?q=firebase\">Flutter first party plugins<\/a>:  <\/p>\n<ul>\n<li><a href=\"https:\/\/pub.dartlang.org\/packages\/firebase_admob\">firebase_admob<\/a> \u0434\u043b\u044f Firebase AdMob;<\/li>\n<li><a href=\"https:\/\/pub.dartlang.org\/packages\/firebase_analytics\">firebase_analytics<\/a> \u0434\u043b\u044f Firebase Analytics;<\/li>\n<li><a href=\"https:\/\/pub.dartlang.org\/packages\/firebase_auth\">firebase_auth<\/a> \u0434\u043b\u044f Firebase Auth;<\/li>\n<li><a href=\"https:\/\/pub.dartlang.org\/packages\/firebase_database\">firebase_database<\/a> \u0434\u043b\u044f Firebase RTDB;<\/li>\n<li><a href=\"https:\/\/pub.dartlang.org\/packages\/firebase_storage\">firebase_storage<\/a> \u0434\u043b\u044f Firebase Cloud Storage;<\/li>\n<li><a href=\"https:\/\/pub.dartlang.org\/packages\/firebase_messaging\">firebase_messaging<\/a> \u0434\u043b\u044f Firebase Messaging (FCM);<\/li>\n<li><a href=\"https:\/\/pub.dartlang.org\/packages\/flutter_firebase_ui\">flutter_firebase_ui<\/a> \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 Firebase Auth (Facebook, Google, Twitter and e-mail);<\/li>\n<li><a href=\"https:\/\/pub.dartlang.org\/packages\/cloud_firestore\">cloud_firestore<\/a> \u0434\u043b\u044f Firebase Cloud Firestore.<\/li>\n<\/ul>\n<p>  <a name=\"platform\"><\/a><\/p>\n<h2><b>Platform-specific code<\/b><\/h2>\n<p>  <a name=\"platform_detection\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0434?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u043b\u044f <code>platform<\/code> \u0432 <a href=\"https:\/\/api.flutter.dev\/flutter\/material\/Theme-class.html\">Theme<\/a> \u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"https:\/\/api.flutter.dev\/flutter\/package-platform_platform\/Platform-class.html\">Platform<\/a>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  \u041f\u043e\u043b\u0435 <code>platform:<\/code>  <\/p>\n<pre><code class=\"kotlin\">if (Theme.of(context).platform == TargetPlatform.iOS) {   return 'iOS'; } else if (Theme.of(context).platform == TargetPlatform.android) {   return 'android'; } else if (Theme.of(context).platform == TargetPlatform.fuchsia) {   return 'fuchsia'; } else {   return 'not recognised '; }<\/code><\/pre>\n<p>  \u041a\u043b\u0430\u0441\u0441 Platform:  <\/p>\n<pre><code class=\"kotlin\">if (Platform.isIOS) {   return 'iOS'; } else if (Platform.isAndroid) {   return 'android'; } else if (Platform.isFuchsia) {   return 'fuchsia'; } else {   return 'not recognised '; }<\/code><\/pre>\n<p>  <a name=\"native\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0427\u0435\u0440\u0435\u0437 <a href=\"https:\/\/api.flutter.dev\/flutter\/services\/MethodChannel-class.html\">MethodChannel<\/a>. <\/p>\n<h4>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:<\/h4>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 <a href=\"https:\/\/flutter.dev\/docs\/development\/platform-integration\/platform-channels\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>  <a name=\"debug\"><\/a><\/p>\n<h2><b>\u041e\u0442\u043b\u0430\u0434\u043a\u0430<\/b><\/h2>\n<p>  <a name=\"instruments\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  <a href=\"https:\/\/flutter.dev\/docs\/development\/tools\/devtools\">DevTools<\/a>.<\/p>\n<p>  <a name=\"hot_reload\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>hot reload<\/code>?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u043e\u0441\u044c \u0438\u0437 IntelliJ IDE, Android Studio \u0438\u043b\u0438 VSCode, \u0442\u043e \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435\u043c <code>\u2318s\/ctrl-s<\/code> \u0438\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0435\u043c \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 <code>hot reload<\/code>. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u043e\u0441\u044c \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0442\u043e \u0432\u0432\u043e\u0434\u043e\u043c \u0431\u0443\u043a\u0432\u044b <code>r<\/code>.<\/p>\n<p>  <a name=\"developer_menu\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0435\u043d\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0431\u044b\u043b \u0438\u0437 IDE, \u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 IDE. \u0415\u0441\u043b\u0438 \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0432\u043e\u0434\u0430 h.<\/p>\n<h4>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:<\/h4>\n<p>  \u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u0430\u043d\u0434:<\/p>\n<div class=\"scrollable-table\">\n<table>\n<tr>\n<td><b>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/b><\/td>\n<td><b>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435<\/b><\/td>\n<td><b>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u043e\u043b\u044f<\/b><\/td>\n<\/tr>\n<tr>\n<td>\u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432<\/td>\n<td>w<\/td>\n<td>debugDumpApp()<\/td>\n<\/tr>\n<tr>\n<td>\u0414\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430<\/td>\n<td>t<\/td>\n<td>debugDumpRenderTree()<\/td>\n<\/tr>\n<tr>\n<td>\u0421\u043b\u043e\u0438<\/td>\n<td>L<\/td>\n<td>debugDumpLayerTree()<\/td>\n<\/tr>\n<tr>\n<td>Accessibility<\/td>\n<td>S (traversal order) or U (inverse hit test order)<\/td>\n<td>debugDumpSemantics()<\/td>\n<\/tr>\n<tr>\n<td>\u0418\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432<\/td>\n<td>i<\/td>\n<td>WidgetsApp.showWidgetInspectorOverride<\/td>\n<\/tr>\n<tr>\n<td>\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f<\/td>\n<td>p<\/td>\n<td>debugPaintSizeEnabled<\/td>\n<\/tr>\n<tr>\n<td>\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u041e\u0421<\/td>\n<td>o<\/td>\n<td>defaultTargetPlatform<\/td>\n<\/tr>\n<tr>\n<td>\u041f\u0435\u0440\u0444\u043e\u043c\u0430\u043d\u0441<\/td>\n<td>P<\/td>\n<td>WidgetsApp. showPerformanceOverlay<\/td>\n<\/tr>\n<tr>\n<td>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 flutter.png<\/td>\n<td>s<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>\u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/td>\n<td>q<\/td>\n<td><\/td>\n<\/tr>\n<\/table>\n<\/div>\n<p>  <a name=\"storage\"><\/a><\/p>\n<h2><b>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/b><\/h2>\n<p>  <a name=\"key_value\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0445\u0440\u0430\u043d\u0438\u0442\u044c <code>key-value<\/code>-\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <a href=\"https:\/\/pub.dev\/packages\/shared_preferences\">shared_preferences<\/a>.<\/p>\n<h4>\u041e\u0442\u043b\u0438\u0447\u0438\u044f:<\/h4>\n<p>  \u0412 Xamarin.Forms \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>Xam.Plugins.Settings<\/code>.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440:<\/h4>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:  <\/p>\n<pre><code class=\"xml\">dependencies:   flutter:     sdk: flutter   shared_preferences: ^0.4.3<\/code><\/pre>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435:  <\/p>\n<pre><code class=\"kotlin\">SharedPreferences prefs = await SharedPreferences.getInstance(); _counter = prefs.getInt('counter'); prefs.setInt('counter', ++_counter); setState(() {   _counter = _counter; });<\/code><\/pre>\n<p>  <a name=\"db\"><\/a><\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441:<\/h4>\n<p>  \u041a\u0430\u043a \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435?<\/p>\n<h4>\u041e\u0442\u0432\u0435\u0442:<\/h4>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0411\u0414, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/pub.dev\/packages\/sqflite\">sqflite<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/pub.dev\/packages\/hive\">hive<\/a>.<\/p>\n<p>  \u0412\u043e\u0442, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u041d\u0430 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0439 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0432\u0441\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u043c\u0441\u044f \u044d\u0442\u0438\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u0430\u0436\u0435 \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Flutter \u0438 \u0437\u0430\u0432\u0435\u0440\u0431\u043e\u0432\u0430\u043b\u043c \u0432\u0430\u0441 \u0432 \u0434\u0440\u0443\u0436\u043d\u043e\u0435 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438 Flutter-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0410 \u044f \u043f\u043e\u0439\u0434\u0443 \u0434\u0443\u043c\u0430\u0442\u044c \u043d\u0430\u0434 \u043d\u043e\u0432\u044b\u043c\u0438 \u0441\u0442\u0430\u0442\u044c\u044f\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0438\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043b\u0443\u0447\u0448\u0435. \u0414\u0430 \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u0435\u0442 Xamarin \u0432\u0430\u0448 Forms!<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/funcorp\/blog\/493518\/\"> https:\/\/habr.com\/ru\/company\/funcorp\/blog\/493518\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/funcorp\/blog\/493518\/\">\u042d\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 <a href=\"https:\/\/flutter.dev\/docs\/get-started\/flutter-for\/xamarin-forms-devs\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e Flutter<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 Xamarin.Forms-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435! \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0443\u044e, \u0447\u0442\u043e\u0431\u044b \u043e\u0446\u0435\u043d\u0438\u0442\u044c, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0440\u043e\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u044d\u0442\u043e \u0437\u0430\u0439\u043c\u0451\u0442. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/iq\/7i\/wj\/iq7iwjn9pzsul5zvm2fmgayzjme.jpeg\">  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-300702","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/300702","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=300702"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/300702\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=300702"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=300702"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=300702"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}