{"id":1084,"date":"2019-04-20T20:05:23","date_gmt":"2019-04-20T19:05:23","guid":{"rendered":"http:\/\/duskosavic.com\/blog\/?p=1084"},"modified":"2021-03-02T08:35:28","modified_gmt":"2021-03-02T07:35:28","slug":"how-to-rewrite-buzztouch-apps-in-flutter","status":"publish","type":"post","link":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/","title":{"rendered":"How To Rewrite Buzztouch Apps in Flutter"},"content":{"rendered":"<p>This article is about rewriting Buzztouch apps using Flutter as the framework of choice. It will be highly technical in content, so if you only want an old app rewritten, without actually knowing how it is done, <a href=\"https:\/\/duskosavic.com\/blog\/contact-dusko-savic\/\">let me know here<\/a>.<\/p>\n<h2>The Internal Structure of Buzztouch Apps<\/h2>\n<p>You define a Buzztouch app &#8220;in the cloud&#8221;, defining screens on special buzztouch server, then downloading the entire app to the desktop computer. The download consists of source code in Java for Android and Objective C for iOS. For 99% of the users, that source code is black box that is fed into Android Studio in case of developing for Android platform, or into Xcode for iOS. There usually are some warnings and errors and the majority of problems that the user would have in the development of an app is located there.<\/p>\n<div id=\"attachment_1093\" style=\"width: 612px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_from_buzztouch_cloud.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1093\" class=\" wp-image-1093\" src=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_from_buzztouch_cloud-300x204.png\" alt=\"json_in_the_buzztouch_cloud.png\" width=\"602\" height=\"409\" srcset=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_from_buzztouch_cloud-300x204.png 300w, https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_from_buzztouch_cloud-768x521.png 768w, https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_from_buzztouch_cloud-1024x695.png 1024w, https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_from_buzztouch_cloud.png 1146w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><\/a><p id=\"caption-attachment-1093\" class=\"wp-caption-text\">JSON based definition of Buzztouch apps in the cloud<\/p><\/div>\n<p>The source code of the app then reads the description of the screens you previously defined on the server and that &#8220;description&#8221; actually is in JSON. The Buzztouch server lets you copy all the JSON for the app at once through an option called JSON Data or Config Data, depending on the version you were using. Using JSON to get data from the server is nothing new and most apps will use JSON as well. What is unique about Buzztouch is that the entire app is defined through that JSON file so if we want to rewrite it in Flutter, JSON file is the starting point.<\/p>\n<h2>Structure of Buzztouch JSON File<\/h2>\n<p>This is the global schema of a typical Buzztouch JSON file:<\/p>\n<div id=\"attachment_1094\" style=\"width: 367px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/elements_in_btconfig_json.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1094\" class=\" wp-image-1094\" src=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/elements_in_btconfig_json-300x199.png\" alt=\"elements_in_btconfig_json.png\" width=\"357\" height=\"237\" srcset=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/elements_in_btconfig_json-300x199.png 300w, https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/elements_in_btconfig_json.png 398w\" sizes=\"auto, (max-width: 357px) 100vw, 357px\" \/><\/a><p id=\"caption-attachment-1094\" class=\"wp-caption-text\">Element chierarchy in Buzztouch JSON file<\/p><\/div>\n<p>There is one config variable in the beginning and it contains, again, exactly one array of BT_items. If the app does not use themes or tabs, these subarrays would be empty. Each app must use menus for navigation and screen to which to navigate, so the variable BT_menus and &#8212; especially &#8212; BT_screens are never empty.<\/p>\n<p>I&#8217;ve seen apps with almost 8,000 BT screens and BT_items, all entered manually. Regardless of the size, if the JSON compiles properly, we shall be able to use it as starting point for regenerating the app with Flutter.<\/p>\n<p>This sounds easy and is easy&#8230; until you start pondering how would you do that on your own. <a href=\"https:\/\/medium.com\/flutter-community\/parsing-complex-json-in-flutter-747c46655f51\">Reading JSON with Dart is difficult to learn if you want to start from the very beginning<\/a>.<\/p>\n<h2>What Does Reading JSON Files Look Like In Flutter?<\/h2>\n<p>Reading and parsing JSON files single-handedly gave me so much trouble that I wrote my own Dart generator code for JSON (technically, it&#8217;s a site in PHP)! Here is what the input would look like:<\/p>\n<div id=\"attachment_1096\" style=\"width: 433px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/flutter_childItem_class.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1096\" class=\" wp-image-1096\" src=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/flutter_childItem_class-300x56.png\" alt=\"flutter_childItem_class.png\" width=\"423\" height=\"79\" srcset=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/flutter_childItem_class-300x56.png 300w, https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/flutter_childItem_class.png 505w\" sizes=\"auto, (max-width: 423px) 100vw, 423px\" \/><\/a><p id=\"caption-attachment-1096\" class=\"wp-caption-text\">PHP code to generate ChildItem class in Flutter<\/p><\/div>\n<p>This would be the result:<\/p>\n<div id=\"attachment_1097\" style=\"width: 428px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/example_childitem_in_flutter.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1097\" class=\" wp-image-1097\" src=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/example_childitem_in_flutter-300x255.png\" alt=\"example_childitem_in_flutter.png\" width=\"418\" height=\"355\" srcset=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/example_childitem_in_flutter-300x255.png 300w, https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/example_childitem_in_flutter.png 604w\" sizes=\"auto, (max-width: 418px) 100vw, 418px\" \/><\/a><p id=\"caption-attachment-1097\" class=\"wp-caption-text\">Example ChildItem Class in Flutter, to read JSON<\/p><\/div>\n<p>This code I would copy and paste in the appropriate class for reading and parsing JSON data.<br \/>\nNow realize that for each plugin there would need to be one such class and the prospect of rewriting Buzztouch app have lost its appeal!<\/p>\n<p>After that I, luckily, found <a href=\"http:\/\/app.quicktype.io\">app.quicktype.io<\/a>, and reading Buzztouch JSON just became bearable. Here is how that looks like.<\/p>\n<h2>How To Import Buzztouch JSON File Into Flutter and Dart<\/h2>\n<p>Flutter is the framework for creating mobile apps and Dart is the programming language underneath. Actually, we import that JSON into Dart and yes, it is up to the challenge &#8212; it will swallow the JSON and interpret without problems provided we use a site called <a href=\"https:\/\/app.quicktype.io\">QuickType<\/a> to generate Dart code for the JSON at hand.<\/p>\n<p>Off we go to app.quicktype.io and paste the entire JSON into the left side of the screen. Select Dart as the languge of choice in the upper right of the browser screen and you will get Dart code to read the entire JSON.<\/p>\n<div id=\"attachment_1095\" style=\"width: 566px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/app_quicktype_io_json_to_dart.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1095\" class=\" wp-image-1095\" src=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/app_quicktype_io_json_to_dart-300x183.png\" alt=\"app_quicktype_io_json_to_dart.png\" width=\"556\" height=\"339\" srcset=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/app_quicktype_io_json_to_dart-300x183.png 300w, https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/app_quicktype_io_json_to_dart-768x468.png 768w, https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/app_quicktype_io_json_to_dart-1024x624.png 1024w, https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/app_quicktype_io_json_to_dart.png 1381w\" sizes=\"auto, (max-width: 556px) 100vw, 556px\" \/><\/a><p id=\"caption-attachment-1095\" class=\"wp-caption-text\">Turning JSON code into Dart with app.quicktype.io site<\/p><\/div>\n<h2>Problems With Code Generated From App.Quicktype.Io<\/h2>\n<p>Although each BT JSON file has the same basic structure, the code that the site outputs will differ from app to app. It means that using this approach it is impossible to AUTOMATICALLY create a Flutter app from JSON file. Each variation of JSON will result in a slightly different Dart code because of the presence of plugin variables.<\/p>\n<p>When you enter data into a Buzztouch screen working on Buzztouch server, you actually enter value for a varible, which is held in the cloud until the app reads it from the JSON file. If the screen has, say, 8 fields to enter in total, but you enter only three insted of all eight, the JSON created will contain only the fields with values and will not contain code for non-values. So the Dart code generator will not know about the missing five fields, will not take them into account and the code generated would become different after a while.<\/p>\n<p>Here is what a JSON for a plugin looks like if no data were changed in the cloud:<\/p>\n<div id=\"attachment_1098\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_before_parameters.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1098\" class=\"size-medium wp-image-1098\" src=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_before_parameters-300x86.png\" alt=\"json_before_parameters.png\" width=\"300\" height=\"86\" srcset=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_before_parameters-300x86.png 300w, https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_before_parameters.png 424w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1098\" class=\"wp-caption-text\">JSON code before parameters were changed<\/p><\/div>\n<p>Let us now change the values:<\/p>\n<div id=\"attachment_1099\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/change_parameters_in_the_plugin.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1099\" class=\"size-medium wp-image-1099\" src=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/change_parameters_in_the_plugin-300x116.png\" alt=\"change_parameters_in_the_plugin.png\" width=\"300\" height=\"116\" srcset=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/change_parameters_in_the_plugin-300x116.png 300w, https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/change_parameters_in_the_plugin.png 753w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1099\" class=\"wp-caption-text\">Change parameters in the plugin fields<\/p><\/div>\n<p>This will be the resulting JSON:<\/p>\n<div id=\"attachment_1100\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/new_json.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1100\" class=\"size-medium wp-image-1100\" src=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/new_json-300x162.png\" alt=\"new_json.png\" width=\"300\" height=\"162\" srcset=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/new_json-300x162.png 300w, https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/new_json.png 444w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1100\" class=\"wp-caption-text\">New JSON has more fields than in the beginning<\/p><\/div>\n<p>To counter that, and because I wanted to have <strong>a general mechanism to interpret every possible Buzztouch app<\/strong>, I went ahead and entered all the fields in all the plugins I needed for the <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.environmentalagency.gibenviro\">GibEnviro<\/a> app and submitted that for quicktype.io. The code generated was surprising, as it contained one large class of data instead of dozens of smaller classes for each plugin.<\/p>\n<p>There&#8217;s about 100 parameters in that class and the result is that I had only one (albeit that large) class to pass around all the plugin parameters in the Flutter app. So writing the classes that emulated Buzztouch plugins suddenly became a normal programming task. The input is just one class with all the parameters and the code in the JSON directs which screen is to be shown next.<\/p>\n<h2>Interpreting Data for One BT Plugin<\/h2>\n<p>If you have ever looked into the source code for a buzztouch plugin, you have seen reading the parameter value and then interpreting it according to the size of the screen. Code in Flutter \/ Dart is no different. There will be only syntactical differences, let&#8217;s take <a href=\"https:\/\/whitebuffalowebsites.com\/\">Susan Metoxen&#8217;s<\/a> well-known plugin <em>Menu With Image<\/em> as an example. The following line will read the value of parameter <strong>listRowBackgroundColor<\/strong> from the JSON file in <strong>this.screenData<\/strong> and will assign it to variable <strong>listBackgroundColor<\/strong> &#8212; this is in Java for Android:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">listBackgroundColor = BT_strings.getStyleValueForScreen(this.screenData, &quot;listRowBackgroundColor&quot;, &quot;#213E58&quot;);<\/pre>\n<p>Another such line, but this time from Objective C:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ndescriptionFontColor = &#x5B;BT_color getColorFromHexString:&#x5B;BT_strings getStyleValueForScreen:theParentMenuScreenData nameOfProperty:@&quot;listDescriptionFontColor&quot; defaultValue:@&quot;#000000&quot;]];\r\n<\/pre>\n<p>Finally, the code in Dart could look like this:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nimageHeight = returnValueDouble(widget.scr.headerImageHeightLargeDevice, 127.0);\r\n<\/pre>\n<p>Here <strong>scr<\/strong> denotes that large class with 100 parameters, and one of these parameters is <strong>headerImageHeightLargeDevice<\/strong>. The value returned will be a <strong>double<\/strong> &#8212; that&#8217;s Dart&#8217;s parlance for <em>floating point variables<\/em>. Note that I wrote function <strong>returnValueDouble<\/strong> and that it looks like this:<\/p>\n<div class=\"oembed-gist\"><script src=\"https:\/\/gist.github.com\/AstroDule\/9611b470a927743706b19ad8267a2c38.js\"><\/script><noscript>View the code on <a href=\"https:\/\/gist.github.com\/AstroDule\/9611b470a927743706b19ad8267a2c38\">Gist<\/a>.<\/noscript><\/div>\n<p>That&#8217;s just so that you finally see some Dart code. Dart is a relatively easy language to learn (if you already know several other computer programming languages, that is!).<\/p>\n<p>To interpret BT values from JSON I had to write several other routines, especially for handling colors. But it is done, there are no more suprises so it is possible to use the same code to interpret many classical BT plugins.<\/p>\n<h2>Which Buzztouch Plugins Are Available in Flutter Right Now?<\/h2>\n<p>To develop <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.environmentalagency.gibenviro\">GibEnviro<\/a>, I had to use more than a dozen of plugins. Here is a partial list:<\/p>\n<table width=\"#100%\">\n<tbody>\n<tr>\n<td>\u00a0Menu With Image<\/td>\n<td>\u00a0WB_screen_menuImage<\/td>\n<td>\u00a0screenMenuImage()<\/td>\n<\/tr>\n<tr>\n<td>Menu Buttons<\/td>\n<td>BT_screen_menuButtons<\/td>\n<td>btScreenMenuButtons()<\/td>\n<\/tr>\n<tr>\n<td>Place Call<\/td>\n<td>BT_placeCall<\/td>\n<td>BT_screen_map<\/td>\n<\/tr>\n<tr>\n<td>Screen Map<\/td>\n<td>BT_screen_map<\/td>\n<td>btScreenMap<\/td>\n<\/tr>\n<tr>\n<td>Send Email<\/td>\n<td>BT_sendEmail<\/td>\n<td>btSendEmail<\/td>\n<\/tr>\n<tr>\n<td>XIB Button Menu<\/td>\n<td>JM_Xib_button_menu<\/td>\n<td>jmXibButtonMenu()<\/td>\n<\/tr>\n<tr>\n<td>Share Email<\/td>\n<td>BT_shareEmail<\/td>\n<td>btShareEmail()<\/td>\n<\/tr>\n<tr>\n<td>Alert View<\/td>\n<td>JC_AlertView<\/td>\n<td>jcAlertView()<\/td>\n<\/tr>\n<tr>\n<td>Custom URL<\/td>\n<td>BT_screen_customURL<\/td>\n<td>btScreencustomURL()<\/td>\n<\/tr>\n<tr>\n<td>HTML Doc<\/td>\n<td>BT_screen_htmlDoc<\/td>\n<td>btScreenHtmldoc()<\/td>\n<\/tr>\n<tr>\n<td>Email Image<\/td>\n<td>Email_image<\/td>\n<td>emailImage()<\/td>\n<\/tr>\n<tr>\n<td>Send Email<\/td>\n<td>BT_sendEmail<\/td>\n<td>sendMail()<\/td>\n<\/tr>\n<tr>\n<td>Share Email<\/td>\n<td>BT_shareEmail<\/td>\n<td>btShareEmail()<\/td>\n<\/tr>\n<tr>\n<td>Location Item<\/td>\n<td>BT_locationItem<\/td>\n<td>btLocationItem()<\/td>\n<\/tr>\n<tr>\n<td>Map Location<\/td>\n<td>BT_mapLocation<\/td>\n<td>btMapLocation()<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>These plugins &#8212; actually, in Dart, they are classes &#8212; are functionally the same or similar to the &#8220;original&#8221; Buzztouch screens. They are not completely identical but are &#8220;good enough&#8221; for this app.<\/p>\n<h2>What About Other Plugins Which Are Not Mentioned Above?<\/h2>\n<p>All plugins from Buzztouch can be rewritten in Flutter although that may not be the route to success. There are some things that are better done in Flutter directly without reading plugins data from the server. Take <strong>Splash screen<\/strong> as an example. That code executes once in the beginning of the app, will take on the screen for a couple of seconds and then be gone. It is much simpler to change that number of seconds in the app directly then to go to the server, find two places where the Splash screen is referenced, change the values, experiment with it and so on.<\/p>\n<p><strong>The point is: whatever the plugin was for, it can be done better and nicer in Flutter.<\/strong><\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_1105\" style=\"width: 238px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/gibenviro_app_starting_screen.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1105\" class=\" wp-image-1105\" src=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/gibenviro_app_starting_screen-144x300.png\" alt=\"gibenviro_app_starting_screen\" width=\"228\" height=\"475\" srcset=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/gibenviro_app_starting_screen-144x300.png 144w, https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/gibenviro_app_starting_screen.png 373w\" sizes=\"auto, (max-width: 228px) 100vw, 228px\" \/><\/a><p id=\"caption-attachment-1105\" class=\"wp-caption-text\">GibEnviro app, the starting screen<\/p><\/div>\n<p>If your app needs a plugin that is not mentioned here, I can, of course, add it to the stable. After all, I spent four years of my life writing BT plugins in Java and Objective C, and I can also do that in Flutter. But the point is this: <strong>why only rewrite the app plugin by plugin &#8212; why not improve the app to modern standards, both visually and with usability in mind<\/strong>!?<\/p>\n<p><a href=\"https:\/\/duskosavic.com\/blog\/contact-dusko-savic\/\">Send me a message through email if interested in upgrading your old apps to Flutter.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article is about rewriting Buzztouch apps using Flutter as the framework of choice. It will be highly technical in content, so if you only want an old app rewritten, without actually knowing how it is done, let me know &hellip; <a href=\"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[266,273,571,1],"tags":[647,434,300,638,648,639,4,147,650,573,640,637,649,653,654,642,641,251,643,432,644,651,601,652,646,394,645],"series":[],"class_list":["post-1084","post","type-post","status-publish","format-standard","hentry","category-android","category-apps-as-a-business","category-apps-server","category-programming","tag-alert-view","tag-android-2","tag-android-apps","tag-buzztouch","tag-custom-ursl","tag-dart","tag-duskosaviccom","tag-email","tag-email-image","tag-flutter","tag-flutter-framework","tag-gibenviro","tag-html-doc","tag-location-item","tag-map-location","tag-menu-buttons","tag-menu-with-image","tag-php","tag-place-call","tag-plugin","tag-screen-map","tag-send","tag-send-email","tag-share","tag-share-email","tag-splash-screen","tag-xiv-button-menu"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How To Rewrite Buzztouch Apps in Flutter - DuskoSavic.com<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How To Rewrite Buzztouch Apps in Flutter - DuskoSavic.com\" \/>\n<meta property=\"og:description\" content=\"This article is about rewriting Buzztouch apps using Flutter as the framework of choice. It will be highly technical in content, so if you only want an old app rewritten, without actually knowing how it is done, let me know &hellip; Continue reading &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/\" \/>\n<meta property=\"og:site_name\" content=\"DuskoSavic.com\" \/>\n<meta property=\"article:published_time\" content=\"2019-04-20T19:05:23+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-03-02T07:35:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_from_buzztouch_cloud-300x204.png\" \/>\n<meta name=\"author\" content=\"Dusko\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dusko\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/programming\\\/how-to-rewrite-buzztouch-apps-in-flutter\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/programming\\\/how-to-rewrite-buzztouch-apps-in-flutter\\\/\"},\"author\":{\"name\":\"Dusko\",\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/#\\\/schema\\\/person\\\/5c90e82c5c70eaeee96d0b2efbfd4396\"},\"headline\":\"How To Rewrite Buzztouch Apps in Flutter\",\"datePublished\":\"2019-04-20T19:05:23+00:00\",\"dateModified\":\"2021-03-02T07:35:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/programming\\\/how-to-rewrite-buzztouch-apps-in-flutter\\\/\"},\"wordCount\":1719,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/#\\\/schema\\\/person\\\/5c90e82c5c70eaeee96d0b2efbfd4396\"},\"image\":{\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/programming\\\/how-to-rewrite-buzztouch-apps-in-flutter\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/04\\\/json_from_buzztouch_cloud-300x204.png\",\"keywords\":[\"alert view\",\"android\",\"Android apps\",\"buzztouch\",\"custom ursl\",\"dart\",\"duskosavic.com\",\"email\",\"email image\",\"flutter\",\"flutter framework\",\"gibenviro\",\"html doc\",\"location item\",\"map location\",\"menu buttons\",\"menu with image\",\"php\",\"place call\",\"plugin\",\"screen map\",\"send\",\"send email\",\"share\",\"Share Email\",\"splash screen\",\"XIV Button Menu\"],\"articleSection\":[\"Android\",\"Apps As a Business\",\"apps server\",\"Programming\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/duskosavic.com\\\/blog\\\/programming\\\/how-to-rewrite-buzztouch-apps-in-flutter\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/programming\\\/how-to-rewrite-buzztouch-apps-in-flutter\\\/\",\"url\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/programming\\\/how-to-rewrite-buzztouch-apps-in-flutter\\\/\",\"name\":\"How To Rewrite Buzztouch Apps in Flutter - DuskoSavic.com\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/programming\\\/how-to-rewrite-buzztouch-apps-in-flutter\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/programming\\\/how-to-rewrite-buzztouch-apps-in-flutter\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/04\\\/json_from_buzztouch_cloud-300x204.png\",\"datePublished\":\"2019-04-20T19:05:23+00:00\",\"dateModified\":\"2021-03-02T07:35:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/programming\\\/how-to-rewrite-buzztouch-apps-in-flutter\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/duskosavic.com\\\/blog\\\/programming\\\/how-to-rewrite-buzztouch-apps-in-flutter\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/programming\\\/how-to-rewrite-buzztouch-apps-in-flutter\\\/#primaryimage\",\"url\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/04\\\/json_from_buzztouch_cloud.png\",\"contentUrl\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/04\\\/json_from_buzztouch_cloud.png\",\"width\":1146,\"height\":778,\"caption\":\"JSON based definition of Buzztouch apps in the cloud\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/programming\\\/how-to-rewrite-buzztouch-apps-in-flutter\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How To Rewrite Buzztouch Apps in Flutter\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/\",\"name\":\"DuskoSavic.com\",\"description\":\"Rapid Mobile Apps Development With Flutter\",\"publisher\":{\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/#\\\/schema\\\/person\\\/5c90e82c5c70eaeee96d0b2efbfd4396\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/duskosavic.com\\\/blog\\\/#\\\/schema\\\/person\\\/5c90e82c5c70eaeee96d0b2efbfd4396\",\"name\":\"Dusko\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d249b8ea0c85e62fd0339dd1412b99f721f072408db9a9a546efe3a86a93b667?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d249b8ea0c85e62fd0339dd1412b99f721f072408db9a9a546efe3a86a93b667?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d249b8ea0c85e62fd0339dd1412b99f721f072408db9a9a546efe3a86a93b667?s=96&d=mm&r=g\",\"caption\":\"Dusko\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d249b8ea0c85e62fd0339dd1412b99f721f072408db9a9a546efe3a86a93b667?s=96&d=mm&r=g\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How To Rewrite Buzztouch Apps in Flutter - DuskoSavic.com","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/","og_locale":"en_US","og_type":"article","og_title":"How To Rewrite Buzztouch Apps in Flutter - DuskoSavic.com","og_description":"This article is about rewriting Buzztouch apps using Flutter as the framework of choice. It will be highly technical in content, so if you only want an old app rewritten, without actually knowing how it is done, let me know &hellip; Continue reading &rarr;","og_url":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/","og_site_name":"DuskoSavic.com","article_published_time":"2019-04-20T19:05:23+00:00","article_modified_time":"2021-03-02T07:35:28+00:00","og_image":[{"url":"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_from_buzztouch_cloud-300x204.png","type":"","width":"","height":""}],"author":"Dusko","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Dusko","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/#article","isPartOf":{"@id":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/"},"author":{"name":"Dusko","@id":"https:\/\/duskosavic.com\/blog\/#\/schema\/person\/5c90e82c5c70eaeee96d0b2efbfd4396"},"headline":"How To Rewrite Buzztouch Apps in Flutter","datePublished":"2019-04-20T19:05:23+00:00","dateModified":"2021-03-02T07:35:28+00:00","mainEntityOfPage":{"@id":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/"},"wordCount":1719,"commentCount":0,"publisher":{"@id":"https:\/\/duskosavic.com\/blog\/#\/schema\/person\/5c90e82c5c70eaeee96d0b2efbfd4396"},"image":{"@id":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/#primaryimage"},"thumbnailUrl":"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_from_buzztouch_cloud-300x204.png","keywords":["alert view","android","Android apps","buzztouch","custom ursl","dart","duskosavic.com","email","email image","flutter","flutter framework","gibenviro","html doc","location item","map location","menu buttons","menu with image","php","place call","plugin","screen map","send","send email","share","Share Email","splash screen","XIV Button Menu"],"articleSection":["Android","Apps As a Business","apps server","Programming"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/","url":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/","name":"How To Rewrite Buzztouch Apps in Flutter - DuskoSavic.com","isPartOf":{"@id":"https:\/\/duskosavic.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/#primaryimage"},"image":{"@id":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/#primaryimage"},"thumbnailUrl":"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_from_buzztouch_cloud-300x204.png","datePublished":"2019-04-20T19:05:23+00:00","dateModified":"2021-03-02T07:35:28+00:00","breadcrumb":{"@id":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/#primaryimage","url":"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_from_buzztouch_cloud.png","contentUrl":"https:\/\/duskosavic.com\/blog\/wp-content\/uploads\/2019\/04\/json_from_buzztouch_cloud.png","width":1146,"height":778,"caption":"JSON based definition of Buzztouch apps in the cloud"},{"@type":"BreadcrumbList","@id":"https:\/\/duskosavic.com\/blog\/programming\/how-to-rewrite-buzztouch-apps-in-flutter\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/duskosavic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How To Rewrite Buzztouch Apps in Flutter"}]},{"@type":"WebSite","@id":"https:\/\/duskosavic.com\/blog\/#website","url":"https:\/\/duskosavic.com\/blog\/","name":"DuskoSavic.com","description":"Rapid Mobile Apps Development With Flutter","publisher":{"@id":"https:\/\/duskosavic.com\/blog\/#\/schema\/person\/5c90e82c5c70eaeee96d0b2efbfd4396"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/duskosavic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/duskosavic.com\/blog\/#\/schema\/person\/5c90e82c5c70eaeee96d0b2efbfd4396","name":"Dusko","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d249b8ea0c85e62fd0339dd1412b99f721f072408db9a9a546efe3a86a93b667?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d249b8ea0c85e62fd0339dd1412b99f721f072408db9a9a546efe3a86a93b667?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d249b8ea0c85e62fd0339dd1412b99f721f072408db9a9a546efe3a86a93b667?s=96&d=mm&r=g","caption":"Dusko"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/d249b8ea0c85e62fd0339dd1412b99f721f072408db9a9a546efe3a86a93b667?s=96&d=mm&r=g"}}]}},"_links":{"self":[{"href":"https:\/\/duskosavic.com\/blog\/wp-json\/wp\/v2\/posts\/1084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/duskosavic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/duskosavic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/duskosavic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/duskosavic.com\/blog\/wp-json\/wp\/v2\/comments?post=1084"}],"version-history":[{"count":27,"href":"https:\/\/duskosavic.com\/blog\/wp-json\/wp\/v2\/posts\/1084\/revisions"}],"predecessor-version":[{"id":3469,"href":"https:\/\/duskosavic.com\/blog\/wp-json\/wp\/v2\/posts\/1084\/revisions\/3469"}],"wp:attachment":[{"href":"https:\/\/duskosavic.com\/blog\/wp-json\/wp\/v2\/media?parent=1084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/duskosavic.com\/blog\/wp-json\/wp\/v2\/categories?post=1084"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/duskosavic.com\/blog\/wp-json\/wp\/v2\/tags?post=1084"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/duskosavic.com\/blog\/wp-json\/wp\/v2\/series?post=1084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}