<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Backendless</title>
    <description>The latest articles on DEV Community by Backendless (@backendless).</description>
    <link>https://dev.to/backendless</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F568507%2F89ee8121-485c-494a-aa46-314146a51f6c.png</url>
      <title>DEV Community: Backendless</title>
      <link>https://dev.to/backendless</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/backendless"/>
    <language>en</language>
    <item>
      <title>How To Integrate A FlutterFlow App With A Backendless Backend (Complete Tutorial)</title>
      <dc:creator>Backendless</dc:creator>
      <pubDate>Fri, 17 Mar 2023 19:33:37 +0000</pubDate>
      <link>https://dev.to/backendless/how-to-integrate-a-flutterflow-app-with-a-backendless-backend-complete-tutorial-445j</link>
      <guid>https://dev.to/backendless/how-to-integrate-a-flutterflow-app-with-a-backendless-backend-complete-tutorial-445j</guid>
      <description>&lt;p&gt;In this article, we are going to briefly introduce you to FlutterFlow, a low-code builder for mobile apps with a visual builder that lets you build cross-platform native apps with &lt;a href="https://backendless.com/developers/#flutter"&gt;Flutter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We will also describe how to add a powerful and scalable Backendless backend to complement a FlutterFlow frontend.&lt;/p&gt;

&lt;p&gt;Building a mobile or web app used to be an enormous undertaking. In the past, creating apps, or digital products as they are sometimes called, required lots of technical knowledge and many months – even years – of dedicated development time.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://backendless.com/nocode-vs-low-code-vs-full-code-app-development-strategies/"&gt;no-code/low-code movement&lt;/a&gt; has changed that. Now, with tools like Backendless and FlutterFlow, non-technical builders can learn and build apps in months or even weeks.&lt;/p&gt;

&lt;p&gt;Ready to build beautiful and &lt;a href="https://backendless.com/superscaling-build-apps-that-grow-without-limit/"&gt;scalable&lt;/a&gt; apps with Backendless and FlutterFlow? Then let’s get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try Backendless For Free To Power Up Your FlutterFlow App
&lt;/h2&gt;

&lt;p&gt;Make your FlutterFlow app more powerful and scalable than ever by adding a Codeless Backendless backend and real-time database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://develop.backendless.com/registration"&gt;Start Your 30-Day Free Trial&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;p&gt;1. What is FlutterFlow&lt;/p&gt;

&lt;p&gt;2. Frontend vs Backend Development – and Why It Matters&lt;/p&gt;

&lt;p&gt;3. Benefits of Adding a Backendless Backend and Database&lt;/p&gt;

&lt;p&gt;4. How to Integrate a FlutterFlow App with a Backendless Backend&lt;/p&gt;

&lt;p&gt;4.1 User Registration with Backendless&lt;/p&gt;

&lt;p&gt;4.2 Login with Backendless&lt;/p&gt;

&lt;p&gt;4.3 Run a Query in Backendless&lt;/p&gt;

&lt;p&gt;4.4 Create a New Object in Backendless&lt;/p&gt;

&lt;p&gt;4.5 Edit an Existing Object in Backendless&lt;/p&gt;

&lt;p&gt;4.6 Send an Email Using a Template in Backendless&lt;/p&gt;

&lt;p&gt;5. Conclusion&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;What is FlutterFlow?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://flutterflow.io/?utm_source=backendless&amp;amp;utm_medium=integration_guide"&gt;FlutterFlow&lt;/a&gt; is a platform that allows users to easily create and develop mobile apps without coding knowledge. The platform offers a range of pre-built projects, including templates for different types of apps such as travel apps, which users can use as a starting point for their own project.&lt;/p&gt;

&lt;p&gt;The app’s canvas provides users with a visual interface to drag and drop widgets to create the desired layout. Users can select from a range of widgets and modify their properties, such as text size and font. FlutterFlow’s widget tree allows users to see the architecture of their app, which can be composed of multiple pages.&lt;/p&gt;

&lt;p&gt;FlutterFlow also offers a range of features that make it easy to add functionality to your app. Users can add actions to different items and access third-party databases via API.&lt;/p&gt;

&lt;p&gt;The platform also includes an animation editor to add animations to different elements in the app. FlutterFlow’s customization options include setting up themes, selecting language options, and integrating with GitHub and other tools.&lt;/p&gt;

&lt;p&gt;Overall, FlutterFlow’s user-friendly interface and variety of features make it a useful platform for anyone looking to create mobile app UIs without coding knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Frontend vs Backend Development – and Why It Matters
&lt;/h2&gt;

&lt;p&gt;From a high-level perspective, an application’s frontend is what the end user or customer will interact with. This may be an app on their mobile device, an interactive website, or a piece of software. The backend of an application is where long-term data is stored and much of the “heavy lifting” occurs.&lt;/p&gt;

&lt;p&gt;An application’s speed and usability, and thus the user experience, is dependent on the processing power of the device where computations occur. Apps built with a beautiful frontend will get little traction if the app is painfully slow.&lt;/p&gt;

&lt;p&gt;That is why it is recommended that as much of the logic as possible be stored on the backend. A typical server – including Cloud servers – contains far more processing power than a typical mobile phone, tablet, or laptop.&lt;/p&gt;

&lt;p&gt;Similarly, the capabilities of the backend will be essential to growth and scale. Developers should be careful to disregard backend development because that is where the bulk of user experience failures occur.&lt;/p&gt;

&lt;p&gt;A solid backend should not only include a database, but should offer the ability to create backend logic, build and access APIs, provide ample storage for files, images, and videos, and support messaging and notification systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Benefits of Adding a Backendless Backend and Database
&lt;/h2&gt;

&lt;p&gt;We’ve now established that a successful app requires much more than just an impressive user interface. Most apps will be supported by their backend, including servers (hosting), data storage, user management, and in many cases, logic.&lt;/p&gt;

&lt;p&gt;The more capable an app’s backend, the more effective the app and the better the user experience.&lt;/p&gt;

&lt;p&gt;FlutterFlow states over 350k creators are utilizing their Flutter-based low-code mobile app development platform, but for all the strengths the platform offers on the frontend, it’s backend capabilities – and particularly database features – are lacking.&lt;/p&gt;

&lt;p&gt;FlutterFlow offers fantastic low-code UI development tools. For all the strengths the platform offers on the frontend, however, it’s backend capabilities are limited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That’s where Backendless comes in.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With a powerful visual database, &lt;a href="https://backendless.com/docs/rest/index.html"&gt;huge assortment of pre-built APIs&lt;/a&gt; and the capability to &lt;a href="https://backendless.com/features/api-services/codeless"&gt;build your own codeless APIs&lt;/a&gt;, Backendless easily fills in all the backend gaps in your FlutterFlow app.&lt;/p&gt;

&lt;p&gt;For developers looking to build a long-term product, Backendless is critical. Backendless scales infinitely out of the box, meaning you never need to worry about your server infrastructure holding up under heavy traffic. Additionally, you can &lt;a href="https://backendless.com/pricing/backendless-cloud/"&gt;host your app on Backendless’ cloud servers&lt;/a&gt; in the United States or European Union &lt;a href="https://backendless.com/european-union-hosting-cluster/"&gt;(perfect for GDPR compliance)&lt;/a&gt; or &lt;a href="https://backendless.com/pricing/backendless-pro/"&gt;on your own on-premise servers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;From a feature standpoint, Backendless provides the most complete low-code backend capabilities on the market. In this article, we will discuss some of the basics – user authentication (registration and login) and database manipulation. However, that merely scratches the surface of what Backendless has to offer.&lt;/p&gt;

&lt;p&gt;Other features your FlutterFlow app will benefit from include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/docs/rest/index.html"&gt;A large pre-built API collection&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/what-is-serverless-computing/"&gt;Serverless hosting&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/codeless"&gt;Codeless logic builder&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/cloud-code/"&gt;Cloud Code, timers, and event handlers&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/#user-engagement"&gt;Email and push notification support&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/build-faster/team-driven-development"&gt;Team-driven development&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  and much more.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;How to Integrate a FlutterFlow App with a Backendless Backend
&lt;/h2&gt;

&lt;p&gt;From this point on, we will be demonstrating how to integrate FlutterFlow with Backendless. In this article, we’re going to walk you through the process of integrating several basic backend functions into your FlutterFlow app (click to jump to each section):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  User Registration
&lt;/li&gt;
&lt;li&gt;  User Login
&lt;/li&gt;
&lt;li&gt;  Query Your Database
&lt;/li&gt;
&lt;li&gt;  Create a New Data Object
&lt;/li&gt;
&lt;li&gt;  Edit or Delete an Existing Object
&lt;/li&gt;
&lt;li&gt;  Send an Email Using a Template
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get started, you will need a &lt;a href="https://flutterflow.io/create-account?utm_source=backendless"&gt;FlutterFlow account&lt;/a&gt; as well as a &lt;a href="https://develop.backendless.com/login"&gt;Backendless account&lt;/a&gt; (&lt;a href="https://develop.backendless.com/registration"&gt;register here for free&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; The simplest way to access Backendless’ robust backend features is to build your frontend with Backendless as well. Be sure to &lt;a href="https://backendless.com/how-to-build-a-no-code-app-with-ui-builder/"&gt;check out our no-code UI Builder&lt;/a&gt; to see how it stacks up to FlutterFlow.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;User Registration
&lt;/h2&gt;

&lt;p&gt;Let’s start with User Registration.&lt;/p&gt;

&lt;p&gt;User registration opens up the entire set of &lt;a href="https://backendless.com/features/backendless-core/user-management"&gt;user management&lt;/a&gt; functions in Backendless. These include session management, password management, user roles, and relating users to other data objects.&lt;/p&gt;

&lt;p&gt;User registration also opens up user engagement opportunities such as &lt;a href="https://backendless.com/features/user-engagement/email-marketing"&gt;email messaging&lt;/a&gt;, &lt;a href="https://backendless.com/features/user-engagement/email-marketing"&gt;push notifications&lt;/a&gt;, and &lt;a href="https://backendless.com/features/backendless-core/pub-sub-messaging"&gt;in-app messaging&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Firstly, let’s create a new page named Registration. Change the AppBar title text to User Registration so it describes the page logic.&lt;/p&gt;

&lt;p&gt;Under the AppBar, add the Column component with two Text Fields (&lt;code&gt;EmailField&lt;/code&gt; and &lt;code&gt;PasswordField&lt;/code&gt;) and a Button (&lt;code&gt;RegisterButton&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;The Widget Tree will look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/01-FlutterFlow-user-registration-Widget-Tree.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xHxgU_rr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/01-FlutterFlow-user-registration-Widget-Tree-600x595.png" alt="FlutterFlow user registration Widget Tree" width="600" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Toggle the Password Field setting for the &lt;code&gt;PasswordField&lt;/code&gt; component:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/02-FlutterFlow-password-field-toggle.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nuWX81P4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/02-FlutterFlow-password-field-toggle-600x490.png" alt="FlutterFlow password field toggle" width="600" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, add the disable options for the RegisterButton so it is inactive when the &lt;code&gt;EmailField&lt;/code&gt; or the &lt;code&gt;PasswordField&lt;/code&gt; are not filled:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/03-Disable-register-button-if-password-or-email-not-filled.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2aPQ8opX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/03-Disable-register-button-if-password-or-email-not-filled-442x600.png" alt="Disable register button if password or email not filled" width="442" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, I’ll skip the description of setting up the components style, alignment, and paddings (you can change these at your own discretion). Finally, the page layout might look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/04-Example-user-registration-page-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--99B7WdSv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/04-Example-user-registration-page-in-FlutterFlow-335x600.png" alt="Example user registration page in FlutterFlow" width="335" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the UI is ready. Now let’s go to the registration part.&lt;/p&gt;

&lt;p&gt;Let’s create a new POST API and name it &lt;code&gt;RegisterUserAPI&lt;/code&gt;. Configure it with corresponding URL and headers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/05-Define-Register-User-API-call-to-Backendless-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---F3BWQS7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/05-Define-Register-User-API-call-to-Backendless-in-FlutterFlow-600x294.png" alt="Define Register User API call to Backendless in FlutterFlow" width="600" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The URL value is &lt;a href="https://api.backendless.com/APP_ID/REST_API_KEY/users/register"&gt;https://api.backendless.com/APP_ID/REST_API_KEY/users/register&lt;/a&gt; (or &lt;a href="https://eu-api.backendless.com/APP_ID/REST_API_KEY/users/register"&gt;https://eu-api.backendless.com/APP_ID/REST_API_KEY/users/register&lt;/a&gt; for the EU cluster). Be sure to replace &lt;code&gt;APP_ID&lt;/code&gt; and &lt;code&gt;REST_API_KEY&lt;/code&gt; with your app’s values, found on your Backendless Backend Dashboard.&lt;/p&gt;

&lt;p&gt;Also let’s create two variables – &lt;code&gt;email&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt; of type String – that would be passed to the body of the &lt;a href="https://backendless.com/docs/rest/users_user_registration.html"&gt;Backendless User Registration API&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/06-Create-user-registration-API-call-variables-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SOxMoro0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/06-Create-user-registration-API-call-variables-in-FlutterFlow-600x214.png" alt="Create user registration API call variables in FlutterFlow" width="600" height="214"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And then pass these variables to the request body:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/07-Pass-user-registration-variables-to-request-body.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u6yiMts---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/07-Pass-user-registration-variables-to-request-body-600x261.png" alt="Pass user registration variables to request body" width="600" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you’re able to test the RegisterUserAPI from the Response &amp;amp; Test tab:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/08-Test-user-registration-API-call-from-FlutterFlow-to-Backendless.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l77tqku1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/08-Test-user-registration-API-call-from-FlutterFlow-to-Backendless-600x404.png" alt="Test user registration API call from FlutterFlow to Backendless" width="600" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, the API works correctly and the registered user object is returned with status 200 as expected.&lt;/p&gt;

&lt;p&gt;Now we can move forward to the RegisterButton actions. Create a new On Tap action and configure an Action Chain that looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/09-On-Tap-Action-Chain-for-user-registration-button-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5F7m9mc---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/09-On-Tap-Action-Chain-for-user-registration-button-in-FlutterFlow-600x593.png" alt="On Tap Action Chain for user registration button in FlutterFlow" width="600" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1. Сall the RegisterUserAPI and pass the &lt;code&gt;email&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt; values:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/10-Call-RegisterUserAPI.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_WQf9jih--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/10-Call-RegisterUserAPI-390x600.png" alt="Call RegisterUserAPI" width="390" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result of the request will be set to the &lt;code&gt;registerUserResult&lt;/code&gt; variable.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;email&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt; values are taken from the corresponding &lt;code&gt;EmailField&lt;/code&gt; and &lt;code&gt;PasswordField&lt;/code&gt; components:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/11-Add-email-and-password-values-to-variables.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xLlR5L4g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/11-Add-email-and-password-values-to-variables-304x600.png" alt="Add email and password values to variables" width="304" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. After the RegisterUserAPI is called, we receive its response. It could be successful (3) or failed (4).&lt;/p&gt;

&lt;p&gt;3. If the response is successful, an alert with a “User has been registered in Backendless. You can now login.” message is shown:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/12-Set-successful-user-registration-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pQLklccT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/12-Set-successful-user-registration-message-288x600.png" alt="Set successful user registration message" width="288" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4. Otherwise, the failure alert is shown with the error text received in the &lt;code&gt;registerUserResult&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/13-Set-failed-user-registration-message-with-result-from-API-call.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WrNBuVnj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/13-Set-failed-user-registration-message-with-result-from-API-call-303x600.png" alt="Set failed user registration message with result from API call" width="303" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will only display the message from the error, not the whole object. This can be done by using the Custom JSON Path name:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/14-Use-custom-JSON-path-to-display-only-error-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MRbrmHBT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/14-Use-custom-JSON-path-to-display-only-error-message-355x600.png" alt="Use custom JSON path to display only error message" width="355" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5. Finally, we can clear the &lt;code&gt;EmailField&lt;/code&gt; and &lt;code&gt;PasswordField&lt;/code&gt; components:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/15-Clear-email-and-password-text-components.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2Mx2b6CE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/15-Clear-email-and-password-text-components-600x477.png" alt="Clear email and password text components" width="600" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The RegisterButton On Tap action is configured and we can now test how the User Registration works.&lt;/p&gt;

&lt;p&gt;Return to the UI Builder page and press the “Run your app in Test Mode” button. Please note that the API won’t work in the Preview mode.&lt;/p&gt;

&lt;p&gt;Wait until the test session is loaded, enter an email and password of a new user and click Register:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/16-Test-user-registration-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oMni_N6_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/16-Test-user-registration-in-FlutterFlow-335x600.png" alt="Test user registration in FlutterFlow" width="335" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the registration was successful, we will receive a message about success:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/17-Successful-user-registration-test.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ssCM62GW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/17-Successful-user-registration-test-338x600.png" alt="Successful user registration test" width="338" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If an error occurred during registration (for example, an attempt was made to register an existing user), we will receive the following notification:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/18-Failed-user-registration-test-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0mkODu3q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/18-Failed-user-registration-test-message-336x600.png" alt="Failed user registration test message" width="336" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With that, user registration is complete. Now let’s move to logging in the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Login with Backendless
&lt;/h2&gt;

&lt;p&gt;For this section, we’ll skip some of the details that were previously described in the Register User section.&lt;/p&gt;

&lt;p&gt;Create a new page named Login and change the AppBar title text to Login so it reflects the page logic.&lt;/p&gt;

&lt;p&gt;Also, for this page we need two Input Field components (&lt;code&gt;LoginField&lt;/code&gt; and &lt;code&gt;PasswordField&lt;/code&gt;) and a &lt;code&gt;LoginButton&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/19-Example-FlutterFlow-user-login-Widget-Tree.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x4WiBEAR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/19-Example-FlutterFlow-user-login-Widget-Tree-586x600.png" alt="Example FlutterFlow user login Widget Tree" width="586" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we did with the Registration page, toggle the Password Field setting for the &lt;code&gt;PasswordField&lt;/code&gt; component and add the disabled options for the &lt;code&gt;LoginButton&lt;/code&gt; so it is inactive when &lt;code&gt;LoginField&lt;/code&gt; or the &lt;code&gt;PasswordField&lt;/code&gt; are not filled. These steps were also described in the previous section (Registration page).&lt;/p&gt;

&lt;p&gt;Finally, the page layout might look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/20-Example-user-login-page-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XQQMY-SP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/20-Example-user-login-page-in-FlutterFlow-335x600.png" alt="Example user login page in FlutterFlow" width="335" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the UI is ready. Now let’s go to the login part.&lt;/p&gt;

&lt;p&gt;Let’s create a new POST API and name it &lt;code&gt;LoginAPI&lt;/code&gt;. Configure it with corresponding URL and headers:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/21-Define-user-login-API-call-from-FlutterFlow-to-Backendless.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GQEaUnk2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/21-Define-user-login-API-call-from-FlutterFlow-to-Backendless-600x294.png" alt="Define user login API call from FlutterFlow to Backendless" width="600" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The URL value is &lt;a href="https://api.backendless.com/APP_ID/REST_API_KEY/users/register"&gt;https://api.backendless.com/APP_ID/REST_API_KEY/users/login&lt;/a&gt; (or &lt;a href="https://eu-api.backendless.com/APP_ID/REST_API_KEY/users/register"&gt;https://eu-api.backendless.com/APP_ID/REST_API_KEY/users/login&lt;/a&gt; for the EU cluster). Be sure to replace &lt;code&gt;APP_ID&lt;/code&gt; and &lt;code&gt;REST_API_KEY&lt;/code&gt; with your app’s values, found on your Backendless Backend Dashboard.&lt;/p&gt;

&lt;p&gt;Also create two variables – login and password of type String that would be passed to the body of the &lt;a href="https://backendless.com/docs/rest/users_login.html"&gt;Backendless Login API&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/22-Define-variables-for-user-login-API-call.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZJkmvLRJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/22-Define-variables-for-user-login-API-call-600x170.png" alt="Define variables for user login API call" width="600" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pass these variables to the request body:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/23-Pass-user-login-variables-into-API-request-body.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--47ZGMXs2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/23-Pass-user-login-variables-into-API-request-body-600x219.png" alt="Pass user login variables into API request body" width="600" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we’re able to test the LoginAPI from the Response &amp;amp; Test tab:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/24-Test-user-login-API-call-from-FlutterFlow-to-Backendless.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LkIZpjum--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/24-Test-user-login-API-call-from-FlutterFlow-to-Backendless-600x414.png" alt="Test user login API call from FlutterFlow to Backendless" width="600" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The API works correctly and the logged in user object is returned with status 200 as expected.&lt;/p&gt;

&lt;p&gt;Now we can move forward to the &lt;code&gt;LoginButton&lt;/code&gt; actions. Create a new On Tap action and configure an Action Chain that looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/25-On-Tap-Action-Chain-for-user-login-button.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--74cxyt-6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/25-On-Tap-Action-Chain-for-user-login-button-600x543.png" alt="On Tap Action Chain for user login button" width="600" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1. Call the LoginAPI and pass the &lt;code&gt;login&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt; values taken from the corresponding &lt;code&gt;LoginField&lt;/code&gt; and &lt;code&gt;PasswordField&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The result of the request will be set to the &lt;code&gt;loginResult&lt;/code&gt; variable:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/26-Add-login-values-to-LoginAPI-and-pass-result-to-loginResult-variable.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yIoVq8Z2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/26-Add-login-values-to-LoginAPI-and-pass-result-to-loginResult-variable-255x600.png" alt="Add login values to LoginAPI and pass result to loginResult variable" width="255" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. After the LoginAPI is called we receive its response. It could be successful (3) or failed (4).&lt;/p&gt;

&lt;p&gt;3. If the response is successful, an alert with a “User has been logged in to Backendless” message is shown:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/27-Set-successful-login-result-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZX6PrMdr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/27-Set-successful-login-result-message-283x600.png" alt="Set successful login result message" width="283" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4. Otherwise, the failure alert is shown with the error text received in the &lt;code&gt;loginResult&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/28-Set-failed-login-result-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b6FNdkyM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/28-Set-failed-login-result-message-299x600.png" alt="Set failed login result message" width="299" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5. Finally, we can clear the &lt;code&gt;LoginField&lt;/code&gt; and &lt;code&gt;PasswordField&lt;/code&gt; components:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/29-Clear-email-and-password-field-values.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eyZdbeKw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/29-Clear-email-and-password-field-values-600x481.png" alt="Clear email and password field values" width="600" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now the &lt;code&gt;LoginButton&lt;/code&gt; On Tap action is configured and we can test the login.&lt;/p&gt;

&lt;p&gt;Return to the UI Builder page and press the “Run your app in Test Mode” button. Please note that the API won’t work in the Preview mode.&lt;/p&gt;

&lt;p&gt;Wait until the test session is loaded, enter the login and password values of the user and click Login:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/30-Test-user-login-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LdBE3CtR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/30-Test-user-login-in-FlutterFlow-334x600.png" alt="Test user login in FlutterFlow" width="334" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the login was successful, we will receive a message about success:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/31-Successful-user-login-test-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QmLDUFUR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/31-Successful-user-login-test-message-334x600.png" alt="Successful user login test message" width="334" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If an error occurred (for example, an attempt was made with incorrect password), we will receive the following notification:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/32-Failed-user-login-test-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GIbJW-P0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/32-Failed-user-login-test-message-334x600.png" alt="Failed user login test message" width="334" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Run a Query in Backendless
&lt;/h2&gt;

&lt;p&gt;In this section, let’s walk through how to retrieve data from your database by running a query.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/features/backendless-core/backendless-database"&gt;Backendless Database&lt;/a&gt; uses a SQL-based querying system. This approach allows you to easily query your data and display exactly what you want the user to see.&lt;/p&gt;

&lt;p&gt;We will again create a simple page named &lt;code&gt;DataOperations&lt;/code&gt; for demonstration.&lt;/p&gt;

&lt;p&gt;Change the AppBar title text to Data Operations so it describes the page logic.&lt;/p&gt;

&lt;p&gt;This time, firstly, let’s define a new GET API call to retrieve data from the Backendless Person table:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/33-Define-API-call-to-retrieve-data-from-Backendless-Database.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1iTjf1Xx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/33-Define-API-call-to-retrieve-data-from-Backendless-Database-600x289.png" alt="Define API call to retrieve data from Backendless Database" width="600" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name this API &lt;code&gt;PersonFind&lt;/code&gt; and сonfigure it with corresponding URL: &lt;a href="https://api.backendless.com/APP_ID/REST_API_KEY/users/register"&gt;https://api.backendless.com/APP_ID/REST_API_KEY/data/Person&lt;/a&gt; (or &lt;a href="https://eu-api.backendless.com/APP_ID/REST_API_KEY/users/register"&gt;https://eu-api.backendless.com/APP_ID/REST_API_KEY/data/Person&lt;/a&gt; for the EU cluster). Be sure to replace &lt;code&gt;APP_ID&lt;/code&gt; and &lt;code&gt;REST_API_KEY&lt;/code&gt; with your app’s values, found on your Backendless Backend Dashboard.&lt;/p&gt;

&lt;p&gt;Create a variable – &lt;code&gt;whereClause&lt;/code&gt; of type String. Set the default value for this variable: &lt;code&gt;objectId IS NOT NULL&lt;/code&gt;. This means that if we want to get all records from the table without any conditions, we’ll pass the &lt;code&gt;objectId IS NOT NULL&lt;/code&gt; condition to the query parameters. Otherwise, the specified conditions will be passed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/34-Define-variables-for-data-retrieval-API-call.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FrBURSD8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/34-Define-variables-for-data-retrieval-API-call-600x126.png" alt="Define variables for data retrieval API call" width="600" height="126"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pass the &lt;code&gt;whereClause&lt;/code&gt; variable to the query Parameter named &lt;code&gt;where&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/35-Pass-where-clause-variable-to-query-parameter.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Lf5QKbQE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/35-Pass-where-clause-variable-to-query-parameter-600x168.png" alt="Pass where clause variable to query parameter" width="600" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The API call for the &lt;a href="https://backendless.com/docs/rest/data_search_with_where_clause.html"&gt;Backendless Data Retrieval&lt;/a&gt; is ready to be tested:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/36-Test-data-retrieval-API-call-from-FlutterFlow-to-Backendless-Database.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1oe4GDYJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/36-Test-data-retrieval-API-call-from-FlutterFlow-to-Backendless-Database-600x414.png" alt="Test data retrieval API call from FlutterFlow to Backendless Database" width="600" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the Person table exists in Backendless and has any records, they will be returned in the response. Otherwise, you’ll receive an error message saying that the corresponding table doesn’t exist. Notice that the &lt;code&gt;whereClause&lt;/code&gt; value is set to &lt;code&gt;objectId IS NOT NULL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Please create the Person table in Backendless with the name (String) and age (Int) columns if it doesn’t exist.&lt;/p&gt;

&lt;p&gt;As for our API, it is ready and we can move forward to the UI.&lt;/p&gt;

&lt;p&gt;For the DataOperations page, create a new Page Variable &lt;code&gt;personRecords&lt;/code&gt; of type List. This can be done from the State Management tab of the page component:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/37-Create-new-page-variable-for-the-Data-Operations-page.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Twc5csz7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/37-Create-new-page-variable-for-the-Data-Operations-page-518x600.png" alt="Create new page variable for the Data Operations page" width="518" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add the Column component with the &lt;code&gt;ConditionField&lt;/code&gt; (TextField), &lt;code&gt;FindButton&lt;/code&gt; and a &lt;code&gt;PersonList&lt;/code&gt; (ListView):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/38-FlutterFlow-Data-Operations-page-Widget-Tree.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1NnZEzLb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/38-FlutterFlow-Data-Operations-page-Widget-Tree-593x600.png" alt="FlutterFlow Data Operations page Widget Tree" width="593" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let’s configure the &lt;code&gt;PersonList&lt;/code&gt; component. This component will present the Person objects retrieved from Backendless.&lt;/p&gt;

&lt;p&gt;In the Generate Dynamic Children tab of the &lt;code&gt;PersonList&lt;/code&gt;, set the &lt;code&gt;personList&lt;/code&gt; variable with maximum amount of records = 100 (Backendless server sets the &lt;a href="https://backendless.com/docs/rest/data_data_paging.html"&gt;maximum allowed value for the page size&lt;/a&gt; to 100 objects) and value from the &lt;code&gt;personRecords&lt;/code&gt; variable, defined previously (we’ll populate this variable with records a little bit later):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/39-Set-personList-variable-with-maximum-records-of-100.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2Hg2M1Te--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/39-Set-personList-variable-with-maximum-records-of-100-422x600.png" alt="Set personList variable with maximum records of 100" width="422" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configure the conditional visibility for the &lt;code&gt;PersonList&lt;/code&gt;, so it doesn’t appear when there are no records:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/40-Configure-conditional-visibility-for-the-PersonList.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K_TnSJxc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/40-Configure-conditional-visibility-for-the-PersonList-300x600.png" alt="Configure conditional visibility for the PersonList" width="300" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Return to the UI Builder and add a Column with 3 Text components (&lt;code&gt;NameText&lt;/code&gt;, &lt;code&gt;AgeText&lt;/code&gt; and &lt;code&gt;ObjectIdText&lt;/code&gt;) and a Divider in the &lt;code&gt;PersonList&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/41-Add-column-with-3-text-components-to-PersonList.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1nLGLN9q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/41-Add-column-with-3-text-components-to-PersonList.png" alt="Add column with 3 text components to PersonList" width="526" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configure the &lt;code&gt;NameText&lt;/code&gt;, &lt;code&gt;AgeText&lt;/code&gt;, and &lt;code&gt;ObjectIdText&lt;/code&gt; components, so they represent the values from the &lt;code&gt;PersonList&lt;/code&gt; items:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/42-Configure-Name-component.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7He2THbU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/42-Configure-Name-component-386x600.png" alt="Configure Name component" width="386" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/43-Configure-Age-component.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GPk6GuxE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/43-Configure-Age-component-385x600.png" alt="Configure Age component" width="385" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/44-Configure-ObjectId-component.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LlPifX8u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/44-Configure-ObjectId-component-384x600.png" alt="Configure ObjectId component" width="384" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, our UI layout will look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/45-Example-Data-Operations-page-layout-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oQSxX1tb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/45-Example-Data-Operations-page-layout-in-FlutterFlow-335x600.png" alt="Example Data Operations page layout in FlutterFlow" width="335" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, there are several rows in the &lt;code&gt;PersonList&lt;/code&gt;. Each row will correspond to the record from the &lt;code&gt;personRecords&lt;/code&gt; variable.&lt;/p&gt;

&lt;p&gt;The text from the &lt;code&gt;ConditionField&lt;/code&gt; component will be used as the condition for querying data from Backendless when the &lt;code&gt;FindButton&lt;/code&gt; is pressed. So let’s finally add the logic to the &lt;code&gt;FindButton&lt;/code&gt; On Tap action:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/46-On-Tap-Action-Logic-for-Find-button.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VvF542O_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/46-On-Tap-Action-Logic-for-Find-button-600x524.png" alt="On Tap Action Logic for Find button" width="600" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1. Call the PersonFind API and pass the &lt;code&gt;whereClause&lt;/code&gt; value from the &lt;code&gt;ConditionField&lt;/code&gt;. The result of the request will be set to the &lt;code&gt;findResult&lt;/code&gt; variable:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/47-Call-PersonFind-API-with-where-clause-value.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--prLdZMpB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/47-Call-PersonFind-API-with-where-clause-value-279x600.png" alt="Call PersonFind API with where clause value" width="279" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. After the PersonFind API is called we receive its response. It could be successful (3) or failed (4).&lt;/p&gt;

&lt;p&gt;3. If the response is successful, we set the response array to the &lt;code&gt;personRecords&lt;/code&gt; variable:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/48-Set-successful-response-array-to-personRecords-variable.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dW9uL6nh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/48-Set-successful-response-array-to-personRecords-variable-374x600.png" alt="Set successful response array to personRecords variable" width="374" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4. If the server returned an error trying to retrieve objects (e.g. the Person table doesn’t exist), the failure alert is shown with the error text received in the &lt;code&gt;findResult&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/49-Set-API-call-failure-message-alert.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VHYyvgN1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/49-Set-API-call-failure-message-alert-296x600.png" alt="Set API call failure message alert" width="296" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now the &lt;code&gt;FindButton&lt;/code&gt; On Tap action is configured and we can move to the tests.&lt;/p&gt;

&lt;p&gt;Return to the UI Builder page and press the “Run your app in Test Mode” button. Please note that the API won’t work in the Preview mode.&lt;/p&gt;

&lt;p&gt;Wait until the test session is loaded, enter (optionally) the condition value and click Find:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/50-Test-Data-Operations-page-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ud_1lCPd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/50-Test-Data-Operations-page-in-FlutterFlow-335x600.png" alt="Test Data Operations page in FlutterFlow" width="335" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the API call was successful, we will see a list of records, retrieved from Backendless:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/51-Successful-Data-Operations-page-test-result.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1TZ8y5T1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/51-Successful-Data-Operations-page-test-result-336x600.png" alt="Successful Data Operations page test result" width="336" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If an error occurred (e.g. using invalid condition), we will receive the following notification:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/52-Failed-Data-Operations-page-API-call-test-result.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jlAziME6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/52-Failed-Data-Operations-page-API-call-test-result-332x600.png" alt="Failed Data Operations page API call test result" width="332" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As the data retrieval is ready, we can now move on to object creation.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Create New Object in Backendless
&lt;/h2&gt;

&lt;p&gt;In this section, we’ll take a look at how to save data into our Backendless Database from FlutterFlow.&lt;/p&gt;

&lt;p&gt;Create a new page named &lt;code&gt;PersonPage&lt;/code&gt;. This page will contain logic to create (and later, edit) a Person object.&lt;/p&gt;

&lt;p&gt;Return to the DataOperations page and add a new IconButton named &lt;code&gt;CreatePersonButton&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/53-Add-button-to-create-new-object-on-Data-Operations-page.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6bqlEthQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/53-Add-button-to-create-new-object-on-Data-Operations-page-600x449.png" alt="Add button to create new object on Data Operations page" width="600" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This button will navigate us to the &lt;code&gt;PersonPage&lt;/code&gt; without any parameters – just for creating a new Person.&lt;/p&gt;

&lt;p&gt;Also, we’ll clear a &lt;code&gt;personRecords&lt;/code&gt; variable here, so the On Tap action has this behavior:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/54-On-Tap-action-to-clear-personRecords-variable.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mqsNzCI6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/54-On-Tap-action-to-clear-personRecords-variable-549x600.png" alt="On Tap action to clear personRecords variable" width="549" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/55-Action-to-clear-personRecords-variable.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xd8XNkXV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/55-Action-to-clear-personRecords-variable-421x600.png" alt="Action to clear personRecords variable" width="421" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s go back to the PersonPage and create a Page variable – &lt;code&gt;titleText&lt;/code&gt; of type String:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/56-Create-titleText-Page-variable.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IhStRTtz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/56-Create-titleText-Page-variable-600x517.png" alt="Create titleText Page variable" width="600" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Change the AppBar style to the one that contains the back button (so you can return to the previous page) and set the AppBar title to the &lt;code&gt;titleText&lt;/code&gt; variable.&lt;/p&gt;

&lt;p&gt;For the page, add an On Page Load action and set the &lt;code&gt;titleText&lt;/code&gt; variable value to “Create a new Person” (this title can be different in the future, but we’ll return to it in the following sections):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/57-Add-On-Page-Load-action-and-set-titleText-variable-value.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bECSBdMH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/57-Add-On-Page-Load-action-and-set-titleText-variable-value-383x600.png" alt="Add On Page Load action and set titleText variable value" width="383" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, for this page we need two Input Field components (&lt;code&gt;NameField&lt;/code&gt; and &lt;code&gt;AgeField&lt;/code&gt;) and a &lt;code&gt;SaveButton&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/58-Add-two-input-field-components-and-Save-button.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gJzCZ7Wf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/58-Add-two-input-field-components-and-Save-button-529x600.png" alt="Add two input field components and Save button" width="529" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Modify the disabled state option for the Save button (it should be disabled when the &lt;code&gt;NameField&lt;/code&gt; or &lt;code&gt;AgeField&lt;/code&gt; is not filled):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/59-Modify-disabled-state-option-for-Save-button.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m1Z_cBjX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/59-Modify-disabled-state-option-for-Save-button-382x600.png" alt="Modify disabled state option for Save button" width="382" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now it’s time to add a new POST API to create a new Person. Configure it as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/60-Define-create-new-person-object-API-call-from-FlutterFlow-to-Backendless-Database.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ei3Qc-rh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/60-Define-create-new-person-object-API-call-from-FlutterFlow-to-Backendless-Database-600x289.png" alt="Define create new person object API call from FlutterFlow to Backendless Database" width="600" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The URL value is &lt;a href="https://api.backendless.com/APP_ID/REST_API_KEY/users/register"&gt;https://api.backendless.com/APP_ID/REST_API_KEY/data/Person&lt;/a&gt; (or &lt;a href="https://eu-api.backendless.com/APP_ID/REST_API_KEY/users/register"&gt;https://eu-api.backendless.com/APP_ID/REST_API_KEY/data/Person&lt;/a&gt; for the EU cluster). Be sure to replace &lt;code&gt;APP_ID&lt;/code&gt; and &lt;code&gt;REST_API_KEY&lt;/code&gt; with your app’s values, found on your Backendless Backend Dashboard.&lt;/p&gt;

&lt;p&gt;Also create two variables – &lt;code&gt;name&lt;/code&gt; of type String and &lt;code&gt;age&lt;/code&gt; of type Int – that will be passed to the body of the &lt;a href="https://backendless.com/docs/rest/data_single_object_create.html"&gt;Backendless Saving Single Object API&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/61-Create-name-and-age-variables.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kKYuk2AJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/61-Create-name-and-age-variables-600x216.png" alt="Create name and age variables" width="600" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pass these variables to the request body:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/62-Pass-varaibles-to-request-body.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ud_-I0Cq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/62-Pass-varaibles-to-request-body-600x220.png" alt="Pass variables to request body" width="600" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now the PersonSave API is ready to be tested. Go to the Response &amp;amp; Test tab, enter the test &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;age&lt;/code&gt; values and run the API:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/63-Test-PersonSave-API-call-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DWpfGuR---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/63-Test-PersonSave-API-call-in-FlutterFlow-600x344.png" alt="Test PersonSave API call in FlutterFlow" width="600" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The API works correctly and the created Person object is returned with status 200 as expected.&lt;/p&gt;

&lt;p&gt;Now we can move forward to the &lt;code&gt;SaveButton&lt;/code&gt; actions. Create a new On Tap action and configure an Action Chain that looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/64-On-Tap-Action-Chain-for-Save-button.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_c8sE8zD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/64-On-Tap-Action-Chain-for-Save-button-579x600.png" alt="On Tap Action Chain for Save button" width="579" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1. Call the PersonSave API and pass the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;age&lt;/code&gt; values from the &lt;code&gt;NameField&lt;/code&gt; and &lt;code&gt;AgeField&lt;/code&gt;. The result of the request will be set to the &lt;code&gt;saveResult&lt;/code&gt; variable:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/65-Pass-name-and-age-values-into-saveResult-variable.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lwRTy-nP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/65-Pass-name-and-age-values-into-saveResult-variable-379x600.png" alt="Pass name and age values into saveResult variable" width="379" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. After the SaveAPI is called we receive its response. It could be successful (3) or failed (5).&lt;/p&gt;

&lt;p&gt;3. If the response is successful, we’ll see an alert with a success message “Object was successfully saved in Backendless. You will be redirected to the Data Operations page.”:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/66-Set-successful-API-call-response-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aH_lU5Vp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/66-Set-successful-API-call-response-message-285x600.png" alt="Set successful API call response message" width="285" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4. After the alert is closed, we are automatically redirected back to the Data Operations page.&lt;/p&gt;

&lt;p&gt;5. If any error occurred while saving a new Person object, an error alert will appear with the error text received in the &lt;code&gt;saveResult&lt;/code&gt;. As usual, we will display only the message from the error (as we did in the previous section), not the whole object. This can be done by using the Custom JSON Path name:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/67-Set-failed-API-call-error-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EmVJ1rVZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/67-Set-failed-API-call-error-message-298x600.png" alt="Set failed API call error message" width="298" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6. Finally, we clear the &lt;code&gt;NameField&lt;/code&gt; and &lt;code&gt;AgeField&lt;/code&gt; components:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/68-Clear-name-and-age-text-fields.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--68fdSlTJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/68-Clear-name-and-age-text-fields-600x486.png" alt="Clear name and age text fields" width="600" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now the &lt;code&gt;SaveButton&lt;/code&gt; On Tap action is configured and we can move to the tests.&lt;/p&gt;

&lt;p&gt;Return to the UI Builder, select the DataOperations page, and press the “Run your app in Test Mode” button. Please note that the API won’t work in the Preview mode.&lt;/p&gt;

&lt;p&gt;Wait until the test session is loaded, enter the condition, review the records matching the criteria, and click the Add New Person button to open the PersonPage:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/69-Load-Data-Operations-page-in-FlutterFlow-tester.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9sE26g-o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/69-Load-Data-Operations-page-in-FlutterFlow-tester-333x600.png" alt="Load Data Operations page in FlutterFlow tester" width="333" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fill the Name and Age in the corresponding fields and click Save:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/70-Test-Creat-new-person-page.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NCD5npJK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/70-Test-Creat-new-person-page-337x600.png" alt="Test Create new person page" width="337" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If everything is ok, the success message will appear:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/71-Successful-object-creation-in-Backendless-Database-via-API.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T-4SYtXK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/71-Successful-object-creation-in-Backendless-Database-via-API-335x600.png" alt="Successful object creation in Backendless Database via API" width="335" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can now press the Back button to return to the previous DataOperations page. Enter the condition again and you’ll see a newly created record:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/72-Review-newly-created-person-object-on-Data-Operations-page.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qn9PVeLX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/72-Review-newly-created-person-object-on-Data-Operations-page-336x600.png" alt="Review newly created person object on Data Operations page" width="336" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now when we’ve finished with creating a new object in Backendless, we can move forward to editing the existing objects.&lt;/p&gt;

&lt;p&gt;Take a look at the next section to learn how to update or delete an object.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Edit an Existing Object in Backendless
&lt;/h2&gt;

&lt;p&gt;Now that we’ve learned out how to create a new object in Backendless, it will be easier to understand process of object editing. We can use the existing PersonPage for this.&lt;/p&gt;

&lt;p&gt;Firstly, let’s add the &lt;code&gt;personObject&lt;/code&gt; to the PersonPage parameters:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/73-Add-personObject-to-Person-Page-parameters.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ynUFe5Cc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/73-Add-personObject-to-Person-Page-parameters-550x600.png" alt="Add personObject to Person Page parameters" width="550" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This parameter will be passed from the Data Operations page and will be used to identify an object we want to update or delete.&lt;/p&gt;

&lt;p&gt;Return to the DataOperations page, select the &lt;code&gt;PersonList&lt;/code&gt; Column and add the On Tap action:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/74-On-Tap-action-for-Person-List-column-on-Data-Operations-page.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_n2d0PMP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/74-On-Tap-action-for-Person-List-column-on-Data-Operations-page-600x539.png" alt="On Tap action for Person List column on Data Operations page" width="600" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1. Navigate to the PersonPage. Here we’ll pass the selected &lt;code&gt;PersonList&lt;/code&gt; Item as the &lt;code&gt;personObject&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/75-Pass-Person-List-item-to-Person-Page-as-personObject.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sa9luQ4S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/75-Pass-Person-List-item-to-Person-Page-as-personObject-305x600.png" alt="Pass Person List item to Person Page as personObject" width="305" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. Clear the &lt;code&gt;personRecords&lt;/code&gt; list:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/76-Clear-personRecords-list.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6E_IG2LK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/76-Clear-personRecords-list-429x600.png" alt="Clear personRecords list" width="429" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We’re finished with the DataOperations page and now can work directly with the PersonPage.&lt;/p&gt;

&lt;p&gt;On the PersonPage, change the On Page Load action to follow the condition:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/77-Change-On-Page-Load-action-on-Person-Page.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W2Bzd1ln--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/77-Change-On-Page-Load-action-on-Person-Page-600x413.png" alt="Change On Page Load action on Person Page" width="600" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1. Check if the &lt;code&gt;personObject&lt;/code&gt; is set.&lt;/p&gt;

&lt;p&gt;2. If the &lt;code&gt;personObject&lt;/code&gt; is set on page, set the &lt;code&gt;titleText&lt;/code&gt; value to “Edit Person”:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/78-Set-titleText-value-to-Edit-Person.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fk6zsB8Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/78-Set-titleText-value-to-Edit-Person-282x600.png" alt="Set titleText value to Edit Person" width="282" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3. Otherwise, set the &lt;code&gt;titleText&lt;/code&gt; value to “Create a new Person”:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/79-Set-titleText-value-to-Create-a-new-Person.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Abv1RR2G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/79-Set-titleText-value-to-Create-a-new-Person-275x600.png" alt="Set titleText value to Create a new Person" width="275" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the &lt;code&gt;NameField&lt;/code&gt; and &lt;code&gt;AgeField&lt;/code&gt; set the Initial Values if the &lt;code&gt;personObject&lt;/code&gt; is set:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/80-Set-name-initial-value-if-personObject-is-set.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HT8SRfSE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/80-Set-name-initial-value-if-personObject-is-set-600x546.png" alt="Set name initial value if personObject is set" width="600" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/81-Set-age-initial-value-if-personObject-is-set.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J5nF9ik0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/81-Set-age-initial-value-if-personObject-is-set-600x541.png" alt="Set age initial value if personObject is set" width="600" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also add the Icon Button (&lt;code&gt;DeleteButton&lt;/code&gt;) on the PersonPage, so finally the page may look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/82-Person-Page-with-dynamic-text-and-save-and-delete-buttons.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BbvVezW0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/82-Person-Page-with-dynamic-text-and-save-and-delete-buttons-333x600.png" alt="Person Page with dynamic text and save and delete buttons" width="333" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let’s add a new PersonUpdate PUT API call. Configure it as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/83-Define-PersonUpdate-PUT-API-call-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XsV9ID0R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/83-Define-PersonUpdate-PUT-API-call-in-FlutterFlow-600x292.png" alt="Define PersonUpdate PUT API call in FlutterFlow" width="600" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The URL value is &lt;a href="https://api.backendless.com/APP_ID/REST_API_KEY/data/Person/[objectId"&gt;https://api.backendless.com/APP_ID/REST_API_KEY/data/Person/[objectId&lt;/a&gt;] (or &lt;a href="https://eu-api.backendless.com/APP_ID/REST_API_KEY/data/Person/[objectId"&gt;https://eu-api.backendless.com/APP_ID/REST_API_KEY/data/Person/[objectId&lt;/a&gt;] for the EU cluster). Be sure to replace &lt;code&gt;APP_ID&lt;/code&gt; and &lt;code&gt;REST_API_KEY&lt;/code&gt; with your app’s values, found on your Backendless Backend Dashboard.&lt;/p&gt;

&lt;p&gt;Create an &lt;code&gt;objectId&lt;/code&gt; variable of type String that will be passed as a dynamic parameter to the &lt;a href="https://backendless.com/docs/rest/data_single_object_update.html"&gt;Backendless Update Single Object API&lt;/a&gt; url. Also, create two variables – &lt;code&gt;name&lt;/code&gt; of type String and &lt;code&gt;age&lt;/code&gt; of type Int – that will be passed to the body of the request. These are the parameters we would have an ability to change in the Person object:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/84-Create-name-age-and-objectId-variables.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G4sG5xa7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/84-Create-name-age-and-objectId-variables-600x218.png" alt="Create name, age, and objectId variables" width="600" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pass the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;age&lt;/code&gt; variables to the request body:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/85-Pass-variables-to-request-body.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0BjxgOSi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/85-Pass-variables-to-request-body-600x220.png" alt="Pass variables to request body" width="600" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now the PersonUpdate API is ready to be tested. Go to the Response &amp;amp; Test tab, enter test &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;age&lt;/code&gt;, and &lt;code&gt;objectId&lt;/code&gt; values (choose any Person object in your database to test with) and run the API:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/86-Test-PersonSave-API-call-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ubncgiff--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/86-Test-PersonSave-API-call-in-FlutterFlow-600x339.png" alt="Test PersonSave API call in FlutterFlow" width="600" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The API works correctly and the updated Person object is returned with status 200 as expected. Notice that &lt;code&gt;objectId&lt;/code&gt; value is the id of the existing object in Backendless Database.&lt;/p&gt;

&lt;p&gt;Now we can move forward to the SaveButton actions. Edit the existing On Tap action to look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/87-Save-button-On-Tap-actions.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--28bW-rDS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/87-Save-button-On-Tap-actions-563x600.png" alt="Save button On Tap actions" width="563" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1. Check if the &lt;code&gt;personObject&lt;/code&gt; is set.&lt;/p&gt;

&lt;p&gt;2. If the &lt;code&gt;personObject&lt;/code&gt; is set, call the PersonUpdate API:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/88-Call-PersonUpdate-API.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y332ydnQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/88-Call-PersonUpdate-API-249x600.png" alt="Call PersonUpdate API" width="249" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pass the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;age&lt;/code&gt; values from the &lt;code&gt;NameField&lt;/code&gt; and &lt;code&gt;AgeField&lt;/code&gt; (like we did when creating a Person in the previous section). Also, pass the &lt;code&gt;objectId&lt;/code&gt; value taken from the &lt;code&gt;personObject&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/89-Pass-objectId-value-from-personObject-into-JSON-path.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pY1DFPk1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/89-Pass-objectId-value-from-personObject-into-JSON-path-387x600.png" alt="Pass objectId value from personObject into JSON path" width="387" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3. After the PersonUpdate API is called, we receive its response. It could be successful (4) or failed (5).&lt;/p&gt;

&lt;p&gt;4. If the response is successful, we’ll see an alert with a success message “Object was successfully updated in Backendless.”:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/90-Set-Update-API-success-response-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jwV1eUe7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/90-Set-Update-API-success-response-message-282x600.png" alt="Set Update API success response message" width="282" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5. If any error occurred while updating a Person object, an error alert will appear with the error text received in the &lt;code&gt;updateResult&lt;/code&gt;. As usual, we will display only the message from the error (as we did in all previous sections):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/91-Set-Update-API-failure-error-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ybKUKUUv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/91-Set-Update-API-failure-error-message-293x600.png" alt="Set Update API failure error message" width="293" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6. If the &lt;code&gt;personObject&lt;/code&gt; is not set, a new object will be created. The steps 6-10 are the same as the saving steps 1-5 from the previous section – we call the PersonSave API to create a new Person and return to the DataOperations page if the creation was successful.&lt;/p&gt;

&lt;p&gt;We’ve finished the object update functionality and now it’s time to implement the object deletion.&lt;/p&gt;

&lt;p&gt;Add a new DELETE API call called PersonDelete and configure it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/92-Define-Delete-object-API-call-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SEo6_daG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/92-Define-Delete-object-API-call-in-FlutterFlow-600x268.png" alt="Define Delete object API call in FlutterFlow" width="600" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The URL value is &lt;a href="https://api.backendless.com/APP_ID/REST_API_KEY/users/register"&gt;https://api.backendless.com/APP_ID/REST_API_KEY/data/Person/[objectId]&lt;/a&gt; (or &lt;a href="https://eu-api.backendless.com/APP_ID/REST_API_KEY/users/register"&gt;https://eu-api.backendless.com/APP_ID/REST_API_KEY/data/Perso/[objectId]&lt;/a&gt; for the EU cluster). Be sure to replace &lt;code&gt;APP_ID&lt;/code&gt; and &lt;code&gt;REST_API_KEY&lt;/code&gt; with your app’s values, found on your Backendless Backend Dashboard.&lt;/p&gt;

&lt;p&gt;To pass the &lt;code&gt;objectId&lt;/code&gt; parameter to the URL, add it in the Variables tab:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/93-Create-objectId-variable.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LPD9Ljho--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/93-Create-objectId-variable-600x131.png" alt="Create objectId variable" width="600" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to the Response &amp;amp; Test tab, enter the &lt;code&gt;objectId&lt;/code&gt; of the existing Backendless object, and run the API:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/94-Test-delete-object-API-call-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1W1Y3YkH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/94-Test-delete-object-API-call-in-FlutterFlow-600x308.png" alt="Test delete object API call in FlutterFlow" width="600" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The API works correctly and returns the deletion timestamp with status 200 as expected.&lt;/p&gt;

&lt;p&gt;Add the On Tap action for the &lt;code&gt;DeleteButton&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/95-Delete-button-On-Tap-actions.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qmXHRMMD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/95-Delete-button-On-Tap-actions-580x600.png" alt="Delete button On Tap actions" width="580" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1. Firstly a Confirmation Dialog is shown. User is asked if he/she is really want to delete an object:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/96-Ask-user-to-confirm-that-they-want-to-delete-the-object.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KDMArdqF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/96-Ask-user-to-confirm-that-they-want-to-delete-the-object-245x600.png" alt="Ask user to confirm that they want to delete the object" width="245" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. If the user confirms the object deletion, the PersonDelete API (3) is called.&lt;/p&gt;

&lt;p&gt;3. Otherwise, the dialog just closes without any further actions.&lt;/p&gt;

&lt;p&gt;4. After the PersonDelete API is called, we receive its response. It could be successful (5) or failed (6).&lt;/p&gt;

&lt;p&gt;5. If the response is successful, we’ll see an alert with a success message “Object was deleted from Backendless. You will be redirected to the Data Operations page.”.&lt;/p&gt;

&lt;p&gt;6. After the alert is closed, we are automatically redirected back to the Data Operations page.&lt;/p&gt;

&lt;p&gt;7. Otherwise, an error alert will appear with the error text received in the saveResult.&lt;/p&gt;

&lt;p&gt;Now the &lt;code&gt;SaveButton&lt;/code&gt; and &lt;code&gt;DeleteButton&lt;/code&gt; On Tap actions are configured and we can move to the tests.&lt;/p&gt;

&lt;p&gt;Return to the UI Builder, select the DataOperations page, and press the “Run your app in Test Mode” button. Please note that the API won’t work in the Preview mode.&lt;/p&gt;

&lt;p&gt;Retrieve the records from Backendless and click on any item:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/97-Load-objects-then-select-an-item-on-the-debug-Data-Operations-screen.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--56rfLtMK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/97-Load-objects-then-select-an-item-on-the-debug-Data-Operations-screen-334x600.png" alt="Load objects then select an item on the debug Data Operations screen" width="334" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will be redirected to the PersonPage. Edit the Person &lt;code&gt;age&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/98-Edit-the-person-age-on-the-Person-page.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H6Sr84gu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/98-Edit-the-person-age-on-the-Person-page-334x600.png" alt="Edit the person age on the Person page" width="334" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and click Save. If everything is fine, you’ll see a corresponding message:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/99-Success-message-if-person-successfully-updated.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H8v6gRex--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/99-Success-message-if-person-successfully-updated-335x600.png" alt="Success message if person successfully updated" width="335" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now click the Delete Button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/100-Delete-object-warning-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pjm8bU2j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/100-Delete-object-warning-message-334x600.png" alt="Delete object warning message" width="334" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and confirm the object deletion.&lt;/p&gt;

&lt;p&gt;You’ll receive a message after the object is deleted:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/101-Successful-deletion-confirmation-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qOF1oZvW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/101-Successful-deletion-confirmation-message-334x600.png" alt="Successful deletion confirmation message" width="334" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And will be redirected to the Data Operations page.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Sending Email with Template
&lt;/h2&gt;

&lt;p&gt;In the final part of this article, let’s look at sending emails with templates.&lt;/p&gt;

&lt;p&gt;Firstly, open Backendless Console and configure the &lt;a href="https://backendless.com/docs/rest/email_settings.html"&gt;Email Settings&lt;/a&gt; to enable the Email Delivery API. Then create a simple &lt;a href="https://backendless.com/docs/rest/email_templates.html"&gt;Email Template&lt;/a&gt; to test the functionality.&lt;/p&gt;

&lt;p&gt;Now we can switch back to FlutterFlow.&lt;/p&gt;

&lt;p&gt;Create a new Page named &lt;code&gt;EmailTemplate&lt;/code&gt;, change the AppBar title and add a column with two TextField components (&lt;code&gt;TemplateNameField&lt;/code&gt; and &lt;code&gt;EmailsField&lt;/code&gt;) and a Button (&lt;code&gt;SendButton&lt;/code&gt;):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/102-Email-Template-page-Widget-Tree-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EZr2cba---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/102-Email-Template-page-Widget-Tree-in-FlutterFlow-519x600.png" alt="Email Template page Widget Tree in FlutterFlow" width="519" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the page layout should look like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/103-Email-Template-page-layout.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q485y5xE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/103-Email-Template-page-layout-336x600.png" alt="Email Template page layout" width="336" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The email addresses can be filled in the corresponding field separated by comma.&lt;/p&gt;

&lt;p&gt;Let’s add a new API to send emails and name it &lt;code&gt;SendEmailWithTemplate&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/104-Define-Send-Email-With-Template-API-call-in-FlutterFlow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rvizniyw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/104-Define-Send-Email-With-Template-API-call-in-FlutterFlow-600x292.png" alt="Define Send Email With Template API call in FlutterFlow" width="600" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The URL value is &lt;a href="https://api.backendless.com/APP_ID/REST_API_KEY/users/register"&gt;https://api.backendless.com/APP_ID/REST_API_KEY/emailtemplate/send&lt;/a&gt; (or &lt;a href="https://eu-api.backendless.com/APP_ID/REST_API_KEY/users/register"&gt;https://eu-api.backendless.com/APP_ID/REST_API_KEY/emailtemplate/send&lt;/a&gt; for the EU cluster). Be sure to replace &lt;code&gt;APP_ID&lt;/code&gt; and &lt;code&gt;REST_API_KEY&lt;/code&gt; with your app’s values, found on your Backendless Backend Dashboard.&lt;/p&gt;

&lt;p&gt;Also let’s create two variables – &lt;code&gt;templateName&lt;/code&gt; of type String and &lt;code&gt;addresses&lt;/code&gt; of type List that will be passed to the body of the &lt;a href="https://backendless.com/docs/rest/email_send_email_with_templates_api.html"&gt;Send Emails with Templates API&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/105-Create-variables-for-email-API-call.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xuK2B-R7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/105-Create-variables-for-email-API-call-600x171.png" alt="Create variables for email API call" width="600" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pass these variables to the request body:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/106-Pass-variables-to-request-body.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c-B2tgDx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/106-Pass-variables-to-request-body-600x219.png" alt="Pass variables to request body" width="600" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you might have noticed, the &lt;code&gt;addresses&lt;/code&gt; parameter is a List of Strings and the value from the &lt;code&gt;EmailsField&lt;/code&gt; is a type of String, so we need the ability to parse the string value to the list.&lt;/p&gt;

&lt;p&gt;Let’s create a simple custom code &lt;code&gt;split()&lt;/code&gt; function for this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/107-Create-custom-code-split-function.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--16_wWISu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/107-Create-custom-code-split-function-600x229.png" alt="Create custom code split function" width="600" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;split()&lt;/code&gt; function takes a String variable named &lt;code&gt;input&lt;/code&gt; as a parameter and returns a list, created from this input parameter separated by commas.&lt;/p&gt;

&lt;p&gt;Now we can configure the On Tap action for the SendButton.&lt;/p&gt;

&lt;p&gt;Add the Button disabled options:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/108-Add-button-disabled-options-for-Send-button.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r56evzbI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/108-Add-button-disabled-options-for-Send-button-341x600.png" alt="Add button disabled options for Send button" width="341" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the button is disabled if any of the input fields are empty.&lt;/p&gt;

&lt;p&gt;Now add the On Tap action with the actions chain:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/109-Send-button-On-Tap-actions.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dmGHNZJJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/109-Send-button-On-Tap-actions-600x586.png" alt="Send button On Tap actions" width="600" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1. Сall the SendEmailWithTemplate API and pass the &lt;code&gt;templateName&lt;/code&gt; and &lt;code&gt;addresses&lt;/code&gt; values:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/110-Call-SendEmailWithTemplate-API-call.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qndMHHyQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/110-Call-SendEmailWithTemplate-API-call-600x445.png" alt="Call SendEmailWithTemplate API call" width="600" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/111-Pass-variables-into-email-API-call.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xSWT5EAY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/111-Pass-variables-into-email-API-call-265x600.png" alt="Pass variables into email API call" width="265" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result of the request will be set to the &lt;code&gt;emailResult&lt;/code&gt; variable.&lt;/p&gt;

&lt;p&gt;As you can see, the &lt;code&gt;addresses&lt;/code&gt; parameter value is the value from the &lt;code&gt;EmailsField&lt;/code&gt;, split to the array using the split function:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/112-addresses-parameter-as-set-using-the-split-function.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sJ3QKdp1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/112-addresses-parameter-as-set-using-the-split-function-306x600.png" alt="addresses parameter as set using the split function" width="306" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. After the SendEmailWithTemplate API is called, we receive its response. It could be successful (3) or failed (5).&lt;/p&gt;

&lt;p&gt;3. If the response is successful, an alert with an “Email was sent successfully. Please check your email box.” message is shown:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/113-Define-email-success-message-action.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S8fk_Bpa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/113-Define-email-success-message-action-284x600.png" alt="Define email success message action" width="284" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4. After the successful alert is closed both text fields are cleared:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/114-Clear-email-template-and-addresses-fields.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d_DHk6pl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/114-Clear-email-template-and-addresses-fields-600x474.png" alt="Clear email template and addresses fields" width="600" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5. Otherwise, the failure alert is shown with the error text received in the &lt;code&gt;emailResult&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/115-Define-email-failure-error-message-action.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QS0vAliO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/115-Define-email-failure-error-message-action-293x600.png" alt="Define email failure error message action" width="293" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;SendButton&lt;/code&gt; On Tap action is configured and we can now test how Sending Email with Template works.&lt;/p&gt;

&lt;p&gt;Return to the UI Builder page and press the “Run your app in Test Mode” button. Wait until the test session is loaded, enter a template name an email (or emails separated by commas) and click Send:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/116-Send-Email-With-Template-page-in-test-debug-mode.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7rcSA4-9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/116-Send-Email-With-Template-page-in-test-debug-mode-336x600.png" alt="Send Email With Template page in test (debug) mode" width="336" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the email was sent successfully, we will receive a message about success:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/117-Email-successfully-sent-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0IK5wa91--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/117-Email-successfully-sent-message-335x600.png" alt="Email successfully sent message" width="335" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the email appears in your email inbox:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/118-Test-email-received-in-inbox.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lhpTIr5A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/118-Test-email-received-in-inbox-600x225.png" alt="Test email received in inbox" width="600" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Otherwise, if the error occurred (e.g. user entered incorrect template name), the error message will appear:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2023/03/119-Test-email-failure-error-message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UykBbe26--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2023/03/119-Test-email-failure-error-message-335x600.png" alt="Test email failure error message" width="335" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;

&lt;p&gt;You should now have a basic handle on how to interact with a Backendless backend via FlutterFlow, but this is just the tip of the iceberg. Adding a Backendless backend and database to a FlutterFlow mobile app gives your app incredible flexibility.&lt;/p&gt;

&lt;p&gt;With FlutterFlow’s easy frontend interface and Backendless’ many pre-built APIs, your possibilities become endless.&lt;/p&gt;

&lt;p&gt;In addition to managing users and data, Backendless gives you access to &lt;a href="https://backendless.com/features/backendless-core/cloud-code"&gt;Cloud Code&lt;/a&gt; timers, event handlers, and whatever &lt;a href="https://backendless.com/features/backendless-core/codeless"&gt;Codeless logic&lt;/a&gt; you can think of on the backend.&lt;/p&gt;

&lt;p&gt;Your app is virtually limitless.&lt;/p&gt;

&lt;p&gt;Thanks for reading and Happy Codeless Coding!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was first published on &lt;a href="https://backendless.com/how-to-integrate-flutterflow-with-backendless/"&gt;backendless.com&lt;/a&gt; on March 13, 2023.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>tutorial</category>
      <category>database</category>
      <category>api</category>
    </item>
    <item>
      <title>Join the Free Database Training Course From Backendless</title>
      <dc:creator>Backendless</dc:creator>
      <pubDate>Fri, 24 Feb 2023 15:42:51 +0000</pubDate>
      <link>https://dev.to/backendless/join-the-free-database-training-course-from-backendless-2ggn</link>
      <guid>https://dev.to/backendless/join-the-free-database-training-course-from-backendless-2ggn</guid>
      <description>&lt;p&gt;Building the perfect database doesn’t have to take months or years. Backendless Database is a robust, powerful, and infinitely scalable database solution perfect for coders and no-coders alike.&lt;/p&gt;

&lt;p&gt;In our newest &lt;strong&gt;ongoing&lt;/strong&gt; video course, you will learn all of the ins and outs of our incredibly robust real-time database.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/WLTrNhu9m8Q"&gt;
&lt;/iframe&gt;
&lt;br&gt;
Backendless founder Mark Piller will guide you through all of the powerful functionality of our most innovative feature: &lt;a href="https://backendless.com/feature/backendless-database/?utm_campaign=dbcourseblog" rel="noopener noreferrer"&gt;Backendless Database&lt;/a&gt;. New videos release each week, expanding on new topics as well as addressing your questions and feedback.&lt;/p&gt;

&lt;p&gt;Looking for an explanation of a specific element of Backendless Database? Leave a comment below. &lt;strong&gt;Be sure to bookmark this post as we will be updating it weekly as new lessons are released.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whether you’re an experienced coder looking to speed up development dramatically or a no-coder looking for a truly scalable database solution, this course can help you. Watch the intro video above for more information and &lt;a href="https://www.youtube.com/playlist?list=PLWRqDbbT5r9CUikehiVM89gqd-9mhG2Wh" rel="noopener noreferrer"&gt;start the course for free today&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This course is part of the &lt;a href="https://backendless.com/become-a-backendless-certified-software-engineer/ideal-backendless-learning-path/" rel="noopener noreferrer"&gt;&lt;strong&gt;Backendless Learning Path&lt;/strong&gt;&lt;/a&gt; that ends with the opportunity to become a &lt;a href="https://backendless.com/become-a-backendless-certified-software-engineer/" rel="noopener noreferrer"&gt;Certified Backendless Engineer&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Data Tables, Columns and Records
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/hYtnU_yKNIM"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we explain the core concepts of a backend database. We go over the basic elements of a database, such as tables, columns, and records. We describe how tables are similar to spreadsheets and how they are used to store data of a specific kind. We also explain that when a table is created in Backendless, it automatically provides an API for adding, retrieving, modifying, and deleting records. Finally, we also briefly introduce data types that we will go over in more detail in future videos.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. About Data Types
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/sCO1SusmVwY"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we discuss the importance of data types in building logic for your application. We explain that data types directly relate to columns and records, and that they are important for both frontend and backend development. We introduce some basic data types, such as text and numbers, and explain the operations that they support. We also explain how to identify the data types for the data that you’re working with, which is done early on in the design stage of your application. Finally, we show how to create a table in Backendless Database for the properties of an entity.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Adding Data Records
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/6PBzDB9znbg"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we will be discussing different ways to add data to your Backendless Database. One way is through the Management Console, which we briefly covered in a previous video. The other way is by using the API. We will go over the mechanics of what it means to get data into the Backendless Database and how it relates to the database schema. We will also go over how to manually enter data into the database through the Management Console and how to use the API to add data to the database through a REST endpoint URL. We will also be looking at how to use the API with external systems such as UI development systems and how to format the data in JSON format.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. String and Text Data Types
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/B-asb8y17GI"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we’ll be discussing the string and text data types. Both string and text are data types that can be assigned to columns in your database tables, and they designate that those columns can store string-based information. The operations that are applicable to text include concatenation, searching within text, and checking if a substring or character is present. We’ll also go over some of the configuration parameters and demonstrate how they come into play when storing or updating data in the database. Additionally, we’ll show the difference between using a string and text data type and the effects it has on search speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Multiple Choice Data Type
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/3fVjnk8nL-U"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we will be reviewing the multiple choice data type. This data type is special in that it internally uses the string data type, but it provides extra value by making it easier for you to make selections for values and visualize them accordingly in Backendless Console. We will review the configuration options for the multiple choice data type, such as maximum length, default value, and constraints. We will also show how to rearrange values and how to enable or disable colors. Additionally, we will demonstrate how the “use validation” option works and how it can be used to restrict acceptable values for a particular column. Lastly, we will show how to use the values/labels option and how to enable multiple selection for a column.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Numeric Data Types
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/EQs5Xf-rItc"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we’ll be discussing the numeric data types. We’ll take a look at the core numeric data types: int, double, and decimal, and the ranges they support. Int is for whole numbers and supports a large range of data, double is a floating point with double precision and is not recommended for scientific data due to precision, and decimal has a fixed precision and scale. We’ll also take a look at the shortcut, money, which is a decimal with a precision of 10 and scale of 2, making it convenient to represent a fraction of currency. We’ll also show how to define and configure these data types in Backendless Console and demonstrate how to store data in the Data Browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Auto Number Data Type
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/vEy4xmud6II"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we’re diving into a powerful data type called Auto Number (also known as Auto Increment). This type of data allows for values in a specific column to be automatically assigned and incremented as new records are added to the table. It’s a simple but effective concept, especially when you need to assign unique values that are easy to understand. We demonstrate how to set up an Auto Number column and highlight some key considerations to keep in mind when configuring this type of column. Additionally, we show you how to control the initial value of the column and how the database will adjust it to the next available value if you attempt to go below a previously established threshold.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. DateTime Data Type
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/HKQPDt2HZtc"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we will be discussing the datetime data type. We will demonstrate how to create a column of this data type and the data formats that it supports. We will also show you the kind of things that you can do to retrieve data using this data type. We will start with configuring a column, and as an example, we will take a look at the date of birth column. We will also demonstrate some examples of how to query the database with the syntax that we support. Additionally, we will show you how to store data with the datetime information and how the database automatically converts the data to the client’s time zone.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Boolean Data Type
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/BPfenJcZqRA"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we discuss the Boolean data type in the Backendless Database. Boolean values are traditionally either true or false and they may indicate whether something happened or not, whether there is a certain quality present or not, and so on. In Backendless, there is a third value that a Boolean type may contain and it is null. We will discuss when and why you may want to use this third option. Finally, we also show how to create a Boolean column in Backendless and the different options available for visualization.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. File Reference Data Type
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/-DLMiQLYv8E"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we will be discussing the file reference data type. The file reference data type is designed to provide the ability for your data records to reference a file that is stored somewhere, whether that be in the Backendless file storage system or anywhere on the web with a URL. We recommend using the file storage system for any use cases outside of storing JSON files and manipulating the JSON data inside of them. Backendless provides a file system that is a powerful system where you can store files in directories, upload, download, move them, delete files, and get directory listings. In this video, we’ll show how to create a reference to a file in the file storage system and how the data is returned when querying the database.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. JSON Data Type
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/a0aVxa-cTr8"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we’re going to be discussing the JSON data type. The database itself is a relational system that provides support for well-structured data where you can describe pretty much any entity by identifying its properties and declaring those properties as columns and the corresponding data tables as a result. However, there are some cases when any given entity may need to have additional description that does not follow a specific structure, and that’s where JSON comes in. We’ll be discussing some use cases and examples of when it makes sense to start using JSON in Backendless. We’ll also demonstrate how to create a JSON column and work with JSON documents in Backendless Console.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Money Data Type
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/uIGTgwDp38Y"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we talk about the money data type available in Backendless Console. Money is a shortcut for the decimal type that is already pre-configured to express currency values with precision 10 and scale 2. That said, additional formatting may be necessary when displaying currency values in the UI, even though the actual numeric value might return from the API without a trailing zero. We’ll be discussing different ways of formatting data in an upcoming video dedicated to UI Builder – stay tuned!&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Color Data Type
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/PBO_Cy2M4wU"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we discuss the Color data type in Backendless Database. With this data type, you can easily store and display colors for your web and mobile applications with Backendless. The Color data type is a specialized string shortcut that returns a hexadecimal value, making it simple to select and create the exact color you need. We’ll show you how to use the intuitive color selector to quickly assign properties to records or use default values if desired. We’ll also discuss how you’ll be able to use our upcoming Visualization feature to easily see all of your data properties at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  14. Data Import and API Setup
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/6cHz0JKN0v8"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we dive into the world of Backendless Database APIs. To start learning, we’ll need some sample data to work with. We’ve prepared a sample schema in the sample database data, which can be downloaded using the link below. In this tutorial, we’ll walk you through the process of importing the sample data into your Backendless database and give you a sneak peek of the actual data import process. By the end of this video, you’ll have a better understanding of how to import data into Backendless and how to visualize your data using the schema visual modeler feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  15. What is API?
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/YZZh1zqowtA"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we are taking you through the basics of Backendless Database APIs. Before diving into the actual API lectures, we want to make sure you have a solid understanding of what APIs are and how they are structured. This will make it easier for you to understand our documentation and make you a better engineer in the process. This video will show you how to run a basic API request and take a look at its structure using REST Console and dev tools. We will also cover the elements of an API request including HTTP method, endpoint, headers, and body. By the end of this video, you will have a good understanding of the structure of API requests and responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  16. Basic Data Retrieval API
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ZTYeybQ-Sjs"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we’ll be focusing strictly on the basics of data retrieval from the Backendless Database. We’ll be using the product table for demonstration purposes and will go through the REST Console to retrieve data. We’ll also show you how to retrieve the data using the API in an application. We’ll switch to the UI Builder where we’ll create a new page using the template for basic data retrieval. The logic for data retrieval sits on the actual page and we’ll briefly go over the on page enter handler. Finally, we’ll preview the page and see how the data is rendered in the UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  17. Data Retrieval With Sorting
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/oonA8oq5Www"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we will be discussing data sorting. Data sorting is a simple process that sorts data either in ascending or descending order, regardless of whether it’s numeric, alphanumeric, or alphabetic. The data sorting process is made easy in Backendless with the data retrieval API. We’ll also show you how to sort data from the REST console perspective and in UI Builder, the codeless alternative. The process involves identifying the columns, selecting the property to sort by, and modifying the URL with the sort by parameter. We’ll demonstrate how to sort by multiple columns and how to sort in descending order.&lt;/p&gt;

&lt;h2&gt;
  
  
  18. Requesting Specific Properties
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Kcndko1vSZ8"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we dive into the data retrieval API and explore how to request specific properties when making database queries. We demonstrate the process using both the REST Console and UI Builder, showing how to restrict the data returned to optimize performance and ensure security. We also explain the structure of the REST API and how to specify which properties you want to retrieve. Finally, we cover how this applies to relations and how it works in UI Builder, where you can instruct the backend to return only specific properties for every single object.&lt;/p&gt;

&lt;h2&gt;
  
  
  19. Excluding Specific Properties
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/IX6Flc1xsAI"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we learn how to specify which properties should be excluded in a request to Backendless Database. Whether you choose to use inclusion or exclusion, it all depends on your use case. We’ll be using UI Builder to demonstrate the process, which will also work for regular APIs with our SDKs. We’ll be exploring the exclude properties connector. This connector expects a list of properties that should not be returned to the client. And to answer the burning question, what happens if you specify a property in both the property list and the exclude properties list? We’ll run the page and find out.&lt;/p&gt;

&lt;h2&gt;
  
  
  20. About the Where Clause
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/vnczIQQMpQA"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we review the power of the “where clause” in Backendless Database. We’ll discuss the structure of the where clause, starting with the most basic form of identifying a column name, operator, and value. We then cover how the where clause can get more complex by combining conditions for multiple columns using “and” and “or” logical operators. Finally, we also cover how to test and run the where clause in Backendless Console and through REST API.&lt;/p&gt;

&lt;h2&gt;
  
  
  21. Where Clause Operators and Data Types
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/NPk4oCA3Q78"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we dive into the available operators for various data types in the where clause structure. From numeric data types like integers and decimals, to text data types like string and text, to datetime data types, and Boolean data types, we cover the different operators you can use to build conditions in your queries. We’ll also show specific examples of how these operators work in practice using Backendless Console.&lt;/p&gt;

&lt;h2&gt;
  
  
  22. Database Functions
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/5-7rTBRTx8s"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we go through the powerful mechanism of database functions. We explain how functions can be used to transform data coming from the database and make conditions more precise, elegant, and powerful. We start with a demonstration of basic scenarios before going through a list of all the available functions in Backendless. The video covers two main uses of database functions: data transformation and use in the “where” clause. We also categorize the functions in Backendless into three categories: date-time functions, string functions, and aggregate functions.&lt;/p&gt;

&lt;h2&gt;
  
  
  23. Data Paging
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/GSOj5p9R9eo"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we dive into the concept of data paging, an extremely important aspect of backend systems that has direct impact on data retrieval APIs. Data paging allows for the retrieval of larger sets of data in chunks or pages and can be controlled through the use of parameters in the data retrieval API. This technique is implemented for performance reasons, as retrieving all data at once can negatively impact both the user experience and the performance of the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  24. Retrieve an Object by ID
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/993QG_3K9io"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we review an API that allows for the retrieval of a specific object by its object ID. The API has additional parameters that can be specified and we walk you through them in detail. We also demonstrate how this functionality can be useful in a product page scenario, where a product is identified by its object ID and displayed on a screen. We take you through the backend section to show what objects are in the data table and how they can be retrieved.&lt;/p&gt;

&lt;h2&gt;
  
  
  25. Object Update API
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/RO2nmOqIaH8"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we discuss the Object Update API that enables the modification of one or more properties of an object in the database. It is different from storing a new object because the object is already in the database, with an object ID assigned to it. In Backendless Console, we demonstrate how modifications done in the data browser do not use the API. We then demonstrate how to use the API to update a record and how it can be used with any of our SDKs.&lt;/p&gt;

&lt;h2&gt;
  
  
  26. Object Delete API
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Xjd9HGTujEg"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we talk about the Object Delete API, which is an API designed to delete a specific object in the database. We identify that object with its object ID. Every single object stored in the database has its own unique ID, and that’s the ID we use to identify a specific object that should be deleted. We demonstrate how to use this API with the REST API provided by Backendless, and we also do a demo using Codeless, but it will equally apply to the API available in all of our SDKs.&lt;/p&gt;

&lt;h2&gt;
  
  
  27. Bulk Create API
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Rg-tuLaD1I0"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we learn about the Bulk Create API, which allows users to save multiple objects in the database with a single API call. As an example, we’ll explore how this API can benefit users who are working on a to-do app where they need to save multiple tasks. By using the Bulk Create API, fewer API calls to the database are needed which can result in a better user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  28. Bulk Delete API
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/jA2DZHVK2Vk"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we will talk about the Bulk Delete API that allows you to delete multiple objects from a table. We will demonstrate how it works using the REST Console and then show an example in UI Builder. In the UI Builder example, we will show how you can select multiple records with checkboxes and delete them at once. We will also discuss the different types of where clauses you can use, including how to use the “in” operator to specify individual object IDs to be deleted.&lt;/p&gt;

&lt;h2&gt;
  
  
  29. Bulk Update API
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/1OpyP-DDZ8U"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we will be discussing the Bulk Update API, which allows you to update multiple objects with a single API call. You can update a single or multiple properties, and the objects to be updated are identified with the where clause identical to the way it works with the Bulk Delete API. We will be going over some animations with slides to demonstrate the mechanics of how bulk update works. Then, we’ll review that API in REST Console, and finally, there will be a demo with UI Builder and Codeless bulk update.&lt;/p&gt;

&lt;h2&gt;
  
  
  30. Object Upsert API
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/AQTFFB3B2tw"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In this video, we will be discussing the Upsert API, a special API that allows you to create new objects in the database and update existing ones using the same method. The convenience of this API is huge, and there are many practical applications where you might need to use it. If your system imports data from an external source, for example, you may need to write extra logic to determine if an item already exists in the database before you can update it. With Upsert, this logic is built into the API, so you don’t have to worry about it. Object ID is a required property for both create and update, and the API uses it to determine if the object needs to be created or updated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This course is the second video in the ideal Backendless learning path. Between the video courses and &lt;a href="https://backendless.com/introducing-backendless-missions-learn-get-rewards/" rel="noopener noreferrer"&gt;Backendless Missions&lt;/a&gt;, you will have a strong foundation that will allow you to build virtually any type of application with Backendless.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;a href="https://www.youtube.com/playlist?list=PLWRqDbbT5r9ClwHuSiZZqOpbqu0ac0Boq" rel="noopener noreferrer"&gt;Codeless Fundamentals&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; Backendless Database Training Course &amp;lt;- You are here&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.youtube.com/playlist?list=PLWRqDbbT5r9B0NlVfXvk6o-Av-o_9-ATq" rel="noopener noreferrer"&gt;Backendless User Management&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.youtube.com/playlist?list=PLWRqDbbT5r9CoT7FpUKVb3fmg4ZkUj4vd" rel="noopener noreferrer"&gt;UI Builder Intro&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.youtube.com/playlist?list=PLWRqDbbT5r9CJlZrWlGrQOZSZ5mxUK1Zf" rel="noopener noreferrer"&gt;UI Builder Masterclass&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Complete the path to have the opportunity to become a &lt;a href="https://backendless.com/become-a-backendless-certified-software-engineer/" rel="noopener noreferrer"&gt;Backendless Certified Engineer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Not a Backendless developer yet? &lt;a href="https://develop.backendless.com/registration" rel="noopener noreferrer"&gt;Get started for free today!&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More Videos Coming Weekly
&lt;/h2&gt;

&lt;p&gt;Unlike our previous courses, this course is &lt;strong&gt;ongoing&lt;/strong&gt;. We will be adding new videos weekly.&lt;/p&gt;

&lt;p&gt;If you have specific questions or areas of Backendless Database you’d like to learn more about, &lt;strong&gt;leave a comment below&lt;/strong&gt;. Your feedback may be the basis for a future video!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article first appeared on &lt;a href="https://backendless.com/mastering-backendless-database/" rel="noopener noreferrer"&gt;https://backendless.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>cloud</category>
      <category>leadership</category>
      <category>mentorship</category>
    </item>
    <item>
      <title>Redis: What It Is, What It Does, and Why You Should Care</title>
      <dc:creator>Backendless</dc:creator>
      <pubDate>Thu, 12 Jan 2023 15:20:38 +0000</pubDate>
      <link>https://dev.to/backendless/redis-what-it-is-what-it-does-and-why-you-should-care-fje</link>
      <guid>https://dev.to/backendless/redis-what-it-is-what-it-does-and-why-you-should-care-fje</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F12%2FRedis-What-it-is-what-it-does-why-you-should-care.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F12%2FRedis-What-it-is-what-it-does-why-you-should-care.png" title="Redis - What it is, what it does, why you should care" alt="Redis - What it is, what it does, why you should care" width="800" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Redis is an open source in-memory data store that can be used as a database, cache, or message broker. It’s often used for caching web pages and reducing the load on servers.&lt;/p&gt;

&lt;p&gt;Redis also has some features that make it attractive for use as a database, such as support for transactions and publish/subscribe messaging. However, it doesn’t have all the features of a traditional database like MySQL or MongoDB.&lt;/p&gt;

&lt;p&gt;In this blog post, we’ll take a look at what Redis is, what it does, and why you might want to consider using it in your next project.&lt;/p&gt;

&lt;p&gt;We’ll also take a look at some of the benefits and drawbacks of using Redis for caching.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Redis?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://redis.com/" rel="noopener noreferrer"&gt;Redis&lt;/a&gt; is an open source in-memory data store that works really well as a cache or message broker, but it can also be used as a database when you don’t need all the features of a traditional database. It offers excellent performance, with the ability to quickly read and write data to memory. Additionally, Redis supports atomic operations, making it ideal for caching scenarios where you need fast access time.&lt;/p&gt;

&lt;h3&gt;
  
  
  In-memory database
&lt;/h3&gt;

&lt;p&gt;An in-memory database is a type of database that stores data entirely in main memory (RAM) rather than on disk. In-memory databases are designed to provide fast access to data by leveraging the high speed of main memory, which is several orders of magnitude faster than disk storage.&lt;/p&gt;

&lt;p&gt;In-memory databases are commonly used in applications that require fast access to large amounts of data, such as real-time analytics, online gaming, e-commerce, and social media. They are also used in applications that require high performance and &lt;a href="https://backendless.com/what-is-app-scaling-and-why-it-matters/" rel="noopener noreferrer"&gt;scalability&lt;/a&gt;, as in-memory databases can handle high volumes of data and transactions without sacrificing performance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/12/How-Redis-typically-works.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hh930hcuzyx9o4fjvwl.png" alt="How Redis typically works" width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the main drawbacks of in-memory databases is that they are more sensitive to data loss in the event of a crash or shutdown, as the data is stored entirely in memory and is not persisted to disk. To address this issue, many in-memory databases, including Redis, provide features such as persistence and replication, which allow data to be saved to disk and replicated across multiple servers to ensure data durability and availability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis persistence
&lt;/h2&gt;

&lt;p&gt;Redis persistence is a feature of the Redis database that allows data to be saved to disk and restored in the event of a crash or shutdown. By default, Redis stores data in memory, which means that it is lost when the Redis server is shut down or restarted. Redis persistence enables data to be saved to disk and restored when the Redis server starts up again, ensuring that data is not lost in the event of a crash or shutdown.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://redis.com/redis-enterprise/technology/durable-redis/" rel="noopener noreferrer"&gt;Redis persistence can be configured&lt;/a&gt; in several ways, depending on the needs of the application. The simplest form of persistence is snapshotting, which involves periodically saving the entire Redis dataset to disk. This approach is fast and efficient, but it can result in data loss if the Redis server crashes between snapshots.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/12/durable-redis-2.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0b7fln38qkqbggalr6a.png" alt="Redis persistence" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Image source: redis.com)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Another form of persistence is append-only file (AOF) persistence, which involves saving each write operation to a log file on disk. This approach provides better durability than snapshotting, as it allows the Redis server to recreate the dataset by replaying the log file in the event of a crash. However, it can be slower and more resource-intensive than snapshotting.&lt;/p&gt;

&lt;p&gt;Overall, Redis persistence is a valuable feature that allows data to be saved to disk and restored in the event of a crash or shutdown, ensuring data durability and availability.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Redis used for?
&lt;/h2&gt;

&lt;p&gt;Redis is often used for caching web pages, reducing load on servers and improving page loading times. It can also be used as a message broker to facilitate communication between different parts of an application. Additionally, Redis supports transactions, making it possible to execute multiple operations atomically.&lt;/p&gt;

&lt;p&gt;Let’s look at some specific Redis use cases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Real-time analytics: Applications can use Redis to store and process large amounts of data in real-time, allowing organizations to quickly analyze and visualize data to make business decisions.&lt;/li&gt;
&lt;li&gt; Online gaming: Gaming software can use Redis to store and manage game state, such as player profiles, game scores, and leaderboards, which allows for fast and seamless gameplay.&lt;/li&gt;
&lt;li&gt; E-commerce: Ecommerce apps can use Redis to store and manage data related to online shopping, such as product catalogs, user profiles, and shopping cart contents, which enables fast and efficient shopping experiences for users.&lt;/li&gt;
&lt;li&gt; Social media: Social apps can use Redis to store and manage data related to social media interactions, such as user profiles, friend lists, and news feeds, which allows for fast and smooth user experiences.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What are key-value pairs?
&lt;/h2&gt;

&lt;p&gt;In Redis, a key-value pair is a data structure that consists of a unique key, which is used to identify the data, and a value, which is the data itself. Key-value pairs are the most basic data structure in Redis, and they are used to store and manage data in the database.&lt;/p&gt;

&lt;p&gt;Redis supports a wide range of data types for keys and values, including strings, hashes, lists, sets, and sorted sets. This allows developers to store and manipulate a variety of data types in Redis, such as text, numbers, arrays, and complex data structures.&lt;/p&gt;

&lt;p&gt;Redis provides a rich set of commands for working with key-value pairs, such as SET, GET, and DEL for strings, HSET, HGET, and HDEL for hashes, and LPUSH, LGET, and LREM for lists. These commands enable developers to store, retrieve, and manipulate data in Redis efficiently and easily.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rich data structures
&lt;/h2&gt;

&lt;p&gt;Data structures in Redis are collections of data that are organized and managed in a specific way to support efficient operations. For example, the string data type in Redis is a sequence of bytes that can be used to store and manipulate text or binary data. The hash data type, on the other hand, is a mapping of field-value pairs that can be used to store and manipulate complex data structures.&lt;/p&gt;

&lt;p&gt;Each data structure in Redis has its own unique set of operations that can be performed on it, such as GET, SET, and DELETE for strings, HGET, HSET, and HDEL for hashes, and LPUSH, LPOP, and LRANGE for lists. These operations enable developers to efficiently store, retrieve, and manipulate data in Redis.&lt;/p&gt;

&lt;p&gt;Overall, data structures in Redis are an important aspect of the framework, as they provide the underlying foundation for efficient data management and manipulation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chat and messaging applications
&lt;/h2&gt;

&lt;p&gt;To support chat and messaging applications, Redis can be used to store and manage data related to conversations, users, and messages. For example, Redis can be used to store information about individual conversations, such as the participants and the latest messages. It can also be used to store information about individual users, such as their profile details and their list of contacts. Finally, Redis can be used to store the actual messages themselves, along with metadata such as the sender, recipient, and timestamp.&lt;/p&gt;

&lt;p&gt;In addition to storing data, Redis can also be used to manage messaging operations, such as delivering messages to recipients, broadcasting messages to multiple recipients, and storing messages for offline users. These capabilities make Redis a powerful tool for building chat and messaging applications that are fast, scalable, and reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Session store
&lt;/h2&gt;

&lt;p&gt;Session store is a mechanism for storing user session data in a web application. In a Redis session store, session data is stored in a Redis database, which is a fast, in-memory data structure store that can be used as a cache, database, and message broker.&lt;/p&gt;

&lt;p&gt;In a Redis session store, session data is stored in a Redis database as key-value pairs, where the key is a unique identifier for the session and the value is the session data itself, which may include information such as the user’s login status, preferences, and shopping cart contents.&lt;/p&gt;

&lt;p&gt;The benefits of using a Redis session store include improved performance and scalability, as Redis can store and retrieve session data quickly and efficiently, even when dealing with large amounts of data. Additionally, Redis allows session data to be shared across multiple servers, which can be useful in a load-balanced environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the benefits of Redis?
&lt;/h2&gt;

&lt;p&gt;One of the main advantages of using Redis for caching is its fast read and write speeds. Redis can handle millions of operations per second, which allows it to serve webpages faster than traditional databases. It also offers excellent support for transactions, allowing applications to perform multiple operations atomically. Additionally, Redis supports the use of &lt;a href="https://backendless.com/features/backendless-core/pub-sub-messaging" rel="noopener noreferrer"&gt;pub/sub channels&lt;/a&gt; for fast data sharing between applications.&lt;/p&gt;

&lt;p&gt;Redis is also &lt;a href="https://backendless.com/what-is-app-scaling-and-why-it-matters/" rel="noopener noreferrer"&gt;highly scalable&lt;/a&gt; and can be deployed across multiple machines for high availability. This makes it ideal for distributed systems that need to quickly process large amounts of data.&lt;/p&gt;

&lt;p&gt;For example, Redis can be used to store session information in a distributed system and provide quick access to that data across multiple servers. This makes Redis incredibly powerful gaming applications because it can quickly and efficiently share data across multiple nodes in near real time.&lt;/p&gt;

&lt;p&gt;In addition to excellent performance, another advantage of Redis is that it offers a number of features that are not available in traditional databases. These include pub/sub, which allows you to publish messages and subscribe to them, as well as transactions and Lua scripting. These features can be used to build powerful applications that are not possible with traditional databases.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Lua scripting?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/12/Lua-Logo.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa86087gldyrti4kme19h.png" alt="Lua-Logo" width="150" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://redis.io/docs/manual/programmability/eval-intro/" rel="noopener noreferrer"&gt;Lua scripting&lt;/a&gt; is a technique for writing and executing scripts in the &lt;a href="https://www.lua.org/" rel="noopener noreferrer"&gt;Lua programming language&lt;/a&gt; within a host application. Lua is a lightweight, versatile, and embeddable scripting language that is widely used for writing scripts that can be run within other applications.&lt;/p&gt;

&lt;p&gt;In the context of Redis, Lua scripting allows developers to write and execute scripts that manipulate data stored in a Redis database. Redis provides a built-in scripting engine that supports Lua, which allows developers to write scripts that can be executed within the Redis server.&lt;/p&gt;

&lt;p&gt;One of the main advantages of Lua scripting in Redis is that it allows developers to write complex operations that can be executed atomically and in a single step. This means that the scripts can manipulate data in Redis without interference from other operations, ensuring data consistency and integrity.&lt;/p&gt;

&lt;p&gt;Overall, Lua scripting is a powerful and flexible tool that can be used within Redis to write and execute complex operations on data stored in the database.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the drawbacks of using Redis?
&lt;/h2&gt;

&lt;p&gt;Like any technology, Redis has some drawbacks that should be considered when deciding whether to use it in a particular application.&lt;/p&gt;

&lt;p&gt;One of the main drawbacks of Redis is that it stores data entirely in memory, which means that it can be sensitive to data loss in the event of a crash or shutdown. To address this issue, Redis provides features such as persistence and replication, which allow data to be saved to disk and replicated across multiple servers. However, these features can add complexity and overhead, which may not be suitable for all applications.&lt;/p&gt;

&lt;p&gt;Another drawback of Redis is that it is a single-threaded system, which means that it can only process one command at a time. This can limit the performance and scalability of Redis in applications that require high concurrency and parallelism. To address this issue, Redis provides clustering and sharding features that allow data to be distributed across multiple servers, but these features can be complex to set up and manage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Overall, Redis is an excellent tool for caching web pages and reducing server load, but it also has some features that can be used to create powerful distributed applications. It’s fast, scalable, and supports advanced features like Pub/Sub and Lua scripting. However, it does have some drawbacks such as the need for additional memory and the lack of ACID compliance or support for joins. Take all this into consideration before using Redis in your project.&lt;/p&gt;

&lt;p&gt;Alternately, Backendless offers &lt;a href="https://backendless.com/feature/hive/" rel="noopener noreferrer"&gt;Hive&lt;/a&gt;. Built on Redis, Hive provides the benefits of Redis with the vast feature set of Backendless. In addition to the advantages of Redis, Hive offers all of the capabilities of a traditional SQL database by integrating with &lt;a href="https://backendless.com/features/backendless-core/backendless-database" rel="noopener noreferrer"&gt;Backendless Database&lt;/a&gt;. With Backendless, you are able to work with data in a wide variety of ways to achieve your application’s needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try Backendless Free For 30 Days
&lt;/h2&gt;

&lt;p&gt;Build an app on Redis with Backendless’ Hive. Get started with a free 30-day trial.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://develop.backendless.com/registration" rel="noopener noreferrer"&gt;Start Free&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How does Redis compare to other NoSQL database systems?
&lt;/h3&gt;

&lt;p&gt;Redis is a type of NoSQL database, which stands for “not only SQL” and refers to a class of databases that do not use the traditional SQL relational model.&lt;/p&gt;

&lt;p&gt;Compared to other NoSQL databases, Redis has several unique characteristics that make it well-suited for certain applications. One of the main advantages of Redis is its in-memory storage, which allows it to provide fast access to data and high performance. This makes Redis well-suited for applications that require fast access to large amounts of data, such as real-time analytics, online gaming, and e-commerce.&lt;/p&gt;

&lt;p&gt;Another advantage of Redis is its support for a wide range of data structures, including strings, hashes, lists, sets, and sorted sets. This allows Redis to store and manipulate a variety of data types, making it a versatile and flexible tool for data management.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article first appeared on &lt;a href="https://backendless.com/redis-what-it-is-what-it-does-and-why-you-should-care/" rel="noopener noreferrer"&gt;Backendless.com&lt;/a&gt; on December 9, 2022.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwaredevelopment</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Custom ReactJS UI Components in Backendless UI Builder</title>
      <dc:creator>Backendless</dc:creator>
      <pubDate>Tue, 02 Aug 2022 19:13:17 +0000</pubDate>
      <link>https://dev.to/backendless/custom-reactjs-ui-components-in-backendless-ui-builder-4p4e</link>
      <guid>https://dev.to/backendless/custom-reactjs-ui-components-in-backendless-ui-builder-4p4e</guid>
      <description>&lt;p&gt;Custom UI Components are the latest innovation to introduced in UI Builder. This new release offers you the full flexibility of code on the frontend, fully integrated into your Codeless application. Read all about it here!&lt;/p&gt;

&lt;p&gt;Hello, I’m Vladimir, team lead of the Backendless JS team and architect of &lt;a href="https://backendless.com/developers/#ui-builder" rel="noopener noreferrer"&gt;UI Builder.&lt;/a&gt; In this article, I’m so excited to introduce you to a brand new feature in UI Builder called &lt;strong&gt;Custom UI Components&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Looking at our customers’ and &lt;a href="https://backendless.consulting/" rel="noopener noreferrer"&gt;our consulting teams&lt;/a&gt;‘ experience in building applications using UI Builder, we can see that many of them anyway face the same limitation: injecting third-party libraries into the UI Builder ecosystem.&lt;/p&gt;

&lt;p&gt;Today I’m going to tell you about this revolutionary new part of the UI Builder. At the end of the article, you should have a clear understanding of the basic principles we’ve applied to create this powerful new feature and you will be able to easily build your own custom components.&lt;/p&gt;

&lt;p&gt;First of all, this feature requires writing JavaScript code and specifically code using the &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;ReactJS&lt;/a&gt; library. To put this new feature to best use, you’ll want to have at least basic knowledge of that programming language and library.&lt;/p&gt;

&lt;p&gt;Although it’s not a problem if you are a low-code/no-code developer and you haven’t written any code before, in this article we are going to use simple constructions so I’m a hundred percent sure it won’t be an issue for you.&lt;/p&gt;

&lt;p&gt;However, if you would like to know more about ReactJS, you can start your journey from the following &lt;a href="https://reactjs.org/docs/introducing-jsx.html" rel="noopener noreferrer"&gt;article&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;p&gt;1. Set Up Backendless&lt;/p&gt;

&lt;p&gt;2. UI Components Location&lt;/p&gt;

&lt;p&gt;3. Creating New Custom UI Component&lt;/p&gt;

&lt;p&gt;4. Custom Component Logic&lt;/p&gt;

&lt;p&gt;5. Styling UI Components&lt;/p&gt;

&lt;p&gt;6. Component Properties&lt;/p&gt;

&lt;p&gt;7. Component Property With Data Binding&lt;/p&gt;

&lt;p&gt;8. Component Event Handlers&lt;/p&gt;

&lt;p&gt;9. Component Actions&lt;/p&gt;

&lt;p&gt;10. Use Third-Party Libraries&lt;/p&gt;

&lt;p&gt;11. Marketplace&lt;/p&gt;

&lt;p&gt;12. Closing&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="set-up"&gt;&lt;/a&gt;Set Up Backendless
&lt;/h2&gt;

&lt;p&gt;Before we get going, let’s make sure you have a &lt;a href="https://develop.backendless.com/registration" rel="noopener noreferrer"&gt;Backendless account&lt;/a&gt;. If you don’t have one already, just register for a &lt;a href="https://develop.backendless.com/registration" rel="noopener noreferrer"&gt;new free account here&lt;/a&gt; and create a new Backendless App.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/01-Create-an-app-in-Backendless.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F01-Create-an-app-in-Backendless-1200x845.png" alt="Create an app in Backendless"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="ui-components-location"&gt;&lt;/a&gt;UI Components Location
&lt;/h2&gt;

&lt;p&gt;Next, let’s take a look at the basic structure of an application built with UI Builder, where the UI Components are stored, and how the app imports and uses them.&lt;/p&gt;

&lt;p&gt;Each Backendless application can contain an unlimited number of &lt;a href="https://backendless.com/docs/uibuilder/ui_containers.html" rel="noopener noreferrer"&gt;UI Containers&lt;/a&gt;, and each UI Container can contain as many components as you need.&lt;/p&gt;

&lt;p&gt;This means the UI Components are stored on the UI Container level. You can change any UI Component and not worry that changes may affect other UI Containers.&lt;/p&gt;

&lt;p&gt;Let’s consider the following diagram of one UI Container instance:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/02-UI-Container-instance-diagram.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F02-UI-Container-instance-diagram-1200x891.png" alt="UI Container instance diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, there are four UI Components and four UI Pages. You can see that a particular UI Component (B) can be used in different UI Pages, or the component (D) may not be used on any UI Page yet.&lt;/p&gt;

&lt;p&gt;At the same time, a page may use numerous UI Components. Hopefully this clarifies the main vision of the UI Components’ role in a UI Container.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="create-new-component"&gt;&lt;/a&gt;Creating New Custom UI Component
&lt;/h2&gt;

&lt;p&gt;Alright, let’s move to more interesting things and create our first UI Component. To do so, go to the UI Builder designer and open the “Components” section.&lt;/p&gt;

&lt;p&gt;On the following screen, you can see all your Custom and Reusable components. We’ll talk about &lt;strong&gt;Reusable Components&lt;/strong&gt; in another article because this is no less important than the Custom Components feature.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/03-Components-area-in-UI-Builder.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F03-Components-area-in-UI-Builder-1200x429.png" alt="Components area in UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In order to start developing your first UI Component, click on the “New Custom Component” button to create a new one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/04-Create-a-new-Custom-Component-in-UI-Builder.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F04-Create-a-new-Custom-Component-in-UI-Builder-1200x603.png" alt="Create a new Custom Component in UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you’re done with the previous step, it immediately opens the component editor where we will actually develop the component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/05-Custom-UI-Component-development-screen-in-UI-Builder.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F05-Custom-UI-Component-development-screen-in-UI-Builder-1200x685.png" alt="Custom UI Component development screen in UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the screenshot above, you can see the UI Component editor which is divided into 3 sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  On the left-hand side, you can see the component files; you can manage your source files here; uploading files using drag-and-drop is supported as well&lt;/li&gt;
&lt;li&gt;  In the middle section, there are four sub-sections to edit the component “&lt;strong&gt;properties/events/actions&lt;/strong&gt;” and the “&lt;strong&gt;TEXT&lt;/strong&gt;” section for editing a selected file content.&lt;/li&gt;
&lt;li&gt;  And finally, the last section is a preview of the component “&lt;strong&gt;properties/events/actions&lt;/strong&gt;”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A little bit later, we will touch on each section in more detail, but for now, let’s create a simple component to see how it works on a UI Page.&lt;/p&gt;

&lt;p&gt;Select the “&lt;strong&gt;src/index.js&lt;/strong&gt;” and you will see the basic code of the UI Component. At this point, the component doesn’t render anything and if you place the component on a UI Page, it won’t make any difference.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/06-Basic-UI-Component-code-upon-new-component-creation.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F06-Basic-UI-Component-code-upon-new-component-creation-1200x524.png" alt="Basic UI Component code upon new component creation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you recall, I wrote at the beginning of the article that our UI Builder is based on the &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;ReactJS&lt;/a&gt; library, so we actually develop a React component and we use everything we can use in a React application.&lt;/p&gt;

&lt;p&gt;This means we can use &lt;a href="https://reactjs.org/docs/hooks-intro.html" rel="noopener noreferrer"&gt;Hooks&lt;/a&gt;, create &lt;a href="https://reactjs.org/docs/higher-order-components.html#gatsby-focus-wrapper" rel="noopener noreferrer"&gt;Higher-Order Components&lt;/a&gt;, and of course, we are allowed to create components using &lt;a href="https://reactjs.org/docs/glossary.html#jsx" rel="noopener noreferrer"&gt;JSX&lt;/a&gt; syntax.&lt;/p&gt;

&lt;p&gt;Let’s render a native &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input" rel="noopener noreferrer"&gt;Input HTML Element&lt;/a&gt; to see what it will look like in the UI Builder app.&lt;/p&gt;

&lt;p&gt;Copy/paste the following code in the editor and then save the component by clicking on the green “SAVE” button.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function MyCustomComponent() {

 return (
   &amp;lt;input type="text" placeholder="input your value here..."/&amp;gt;
 )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/07-Save-new-custom-component-in-UI-Builder.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F07-Save-new-custom-component-in-UI-Builder-1200x465.png" alt="Save new custom component in UI Builder"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Once it’s saved, go to the User Interface screen and add the UI Component onto the landing page. You can find all your Custom Components in the components toolbar on the right side.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/08-Drag-and-drop-new-Custom-Component-from-the-UI-Builder-toolbox.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F08-Drag-and-drop-new-Custom-Component-from-the-UI-Builder-toolbox-1200x382.png" alt="Drag and drop new Custom Component from the UI Builder toolbox"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let’s open the page in preview mode to how it looks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/09-Preview-of-custom-component-added-in-UI-Builder.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F09-Preview-of-custom-component-added-in-UI-Builder.png" alt="Preview of custom component added in UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations, you made your first custom UI component! Although it doesn’t look pretty at the moment, the main goal was to inject your own component into the UI Builder environment and we did it perfectly. It was easy, wasn’t it?&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;a id="custom-component-logic"&gt;&lt;/a&gt;Custom Component Logic
&lt;/h2&gt;

&lt;p&gt;Next, we are going to expand upon our component by adding its own state and behavior.&lt;/p&gt;

&lt;p&gt;Let’s create a greeting form that will show an alert with a greeting message on a button click. Go back to the component editor and select the “&lt;strong&gt;src/index.js&lt;/strong&gt;” file for editing, replace it with the following code, then save the component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState } from 'react'

export default function MyCustomComponent() {
 const \[name, setName\] = useState('')

 const sayHi = () =&amp;gt; {
   alert(\`Hello ${name}\`)
 }

 return ( 
   &amp;lt;div&amp;gt;
     &amp;lt;h4&amp;gt;Greeting!&amp;lt;/h4&amp;gt;

     &amp;lt;input 
       value={ name } 
       placeholder="input your name here..."
       onChange={ e =&amp;gt; setName(e.target.value) }
     /&amp;gt;

     &amp;lt;button onClick={ sayHi }&amp;gt;Say Hi&amp;lt;/button&amp;gt;
   &amp;lt;/div&amp;gt;
 )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/10-Create-input-with-alert-custom-component.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F10-Create-input-with-alert-custom-component-1200x634.png" alt="Create input with alert custom component"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We gave the component its own state by using the &lt;a href="https://reactjs.org/docs/hooks-reference.html#usestate" rel="noopener noreferrer"&gt;useState&lt;/a&gt; hook from the React library to create a &lt;a href="https://reactjs.org/docs/forms.html#controlled-components" rel="noopener noreferrer"&gt;controlled input component&lt;/a&gt; and use the value in the “&lt;code&gt;sayHi&lt;/code&gt;” handler. That’s it, let’s switch to the preview and refresh the browser page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/11-Preview-input-with-alert-custom-component.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F11-Preview-input-with-alert-custom-component.png" alt="Preview input with alert custom component"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Type any text into the input and click on the “Say Hi” button. You should see an alert as it’s shown on the screenshot below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/12-Custom-input-alert-preview.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F12-Custom-input-alert-preview-600x214.png" alt="Custom input alert preview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Amazing, right? In a few minutes, we have created a new custom component, typed a couple of lines of code and boom, it works like a charm.&lt;/p&gt;

&lt;p&gt;Can you imagine how many cases it can cover and how many problems it can solve? This very powerful feature, wouldn’t you say?&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="styling-components"&gt;&lt;/a&gt;Styling UI Components
&lt;/h2&gt;

&lt;p&gt;The default UI Containers have their own HTML element and can be decorated to look more attractive. That’s why we included the ability to add styles for every single component. You can use &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS" rel="noopener noreferrer"&gt;CSS&lt;/a&gt; but &lt;a href="https://lesscss.org/" rel="noopener noreferrer"&gt;LESS&lt;/a&gt; is supported as well.&lt;/p&gt;

&lt;p&gt;On top of that, each UI Container has a &lt;a href="https://backendless.com/docs/uibuilder/ui_themes.html" rel="noopener noreferrer"&gt;Theme&lt;/a&gt; and &lt;a href="https://backendless.com/docs/uibuilder/ui_extensions.html" rel="noopener noreferrer"&gt;App Extensions&lt;/a&gt; where styles can be made available globally for all pages and UI Components, so you can decorate your component according to the applied theme by using LESS variables.&lt;/p&gt;

&lt;p&gt;Back to our project, let’s customize our greeting component from the previous part.&lt;/p&gt;

&lt;p&gt;Open the component editor and select the “&lt;strong&gt;src/index.js&lt;/strong&gt;” file for editing and add a “greeting-form” class name to the root div to create a CSS scope for the component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function MyCustomComponent() {
  …


  return ( 
    &amp;lt;div className="greeting-form"&amp;gt;
    …

    &amp;lt;/div&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, open the “&lt;strong&gt;styles/index.less&lt;/strong&gt;” file for editing after the following content:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;// you can use LESS variables from the current Theme and app extensions of the UI-Container&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.greeting-form {
  input {
    width: 360px;
    background: #fff;
    color: #a3a3a3;
    font: inherit;
    box-shadow: 0 6px 10px 0 rgba(0, 0, 0 , .1);
    border: 1px solid rgba(51, 51, 51, 0.06);
    outline: 0;
    padding: 22px 18px;
    padding-right: 100px;
  }

  button {
    display: inline-block;
    font: inherit;
    border: 0;
    outline: 0;
    padding: 0;
    transition: all 200ms ease-in;
    cursor: pointer;
    margin-left: -96px;
    background: #7f8ff4;
    color: #fff;
    box-shadow: 0 0 10px 2px rgba(0, 0, 0, .1);
    border-radius: 2px;
    padding: 12px 36px;

    &amp;amp;:hover {
      background: #5e6fd8;
    }

    &amp;amp;:active {
      background: #5e6fd8;
      box-shadow: inset 0 0 10px 2px rgba(0, 0, 0, .2);
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/13-Add-greeting-form-styling-code-to-the-component-styles.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F13-Add-greeting-form-styling-code-to-the-component-styles-1200x861.png" alt="Add greeting-form styling code to the component styles"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save it and check this out on the preview page, you will be definitely surprised!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/14-Preview-with-greeting-form-styles-applied.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F14-Preview-with-greeting-form-styles-applied-1200x711.png" alt="Preview with greeting-form styles applied"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="component-props"&gt;&lt;/a&gt;Component Properties
&lt;/h2&gt;

&lt;p&gt;Now it’s time to start increasing the functionality of the component. The first one I am going to teach you is to add a couple of properties to the component and show you how you can use it with &lt;a href="https://backendless.com/features/backendless-core/codeless" rel="noopener noreferrer"&gt;Codeless&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let’s add a new property for configuring the “&lt;strong&gt;placeholder&lt;/strong&gt;” value of the input inside our component because frequently your component will be used on different pages/places and you will need to configure each instance of the component.&lt;/p&gt;

&lt;p&gt;For that, open the component editor and open the “Properties” tab and click on the “Add New” button and fill inputs as it’s shown on the screenshot below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/15-Add-new-property-to-custom-component-for-placeholder-text.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F15-Add-new-property-to-custom-component-for-placeholder-text-1200x647.png" alt="Add new property to custom component for placeholder text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s examine each filled input in more detail:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Reference In Code&lt;/strong&gt;: we typed “placeholder” to define the property in the component definition to be able to use the property in the component code&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Setting Label&lt;/strong&gt;: we typed “Placeholder” to display the setting in the component settings toolbar; if you take a look on the 3rd panel, you can see what it will look like&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Value Type&lt;/strong&gt;: in our case, it’s “text”; in the select, you can see the different types available now with more added as they become available&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Default Value&lt;/strong&gt;: this is a default value of the property which each use of the component will have&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now open the “&lt;strong&gt;src/index.js&lt;/strong&gt;” file and let’s apply the property to the Input component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function MyCustomComponent({ component }) {
  …

  return ( 
    &amp;lt;div className="greeting-form"&amp;gt;
      …

      &amp;lt;input 
        …
          placeholder={ component.placeholder }
        …
      /&amp;gt;

      …
    &amp;lt;/div&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the interface is quite simple. We just define the “&lt;strong&gt;component&lt;/strong&gt;” argument and then use a particular property where we need it.&lt;/p&gt;

&lt;p&gt;Save the component and open the UI section to see how the settings for our component were changed. There should be a new property “Placeholder” with default value.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/16-Custom-component-with-new-property-available-in-UI-Builder-User-Interface-area.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F16-Custom-component-with-new-property-available-in-UI-Builder-User-Interface-area-1200x660.png" alt="Custom component with new property available in UI Builder User Interface area"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you open the current page in the preview you can see the input has the new “&lt;strong&gt;type your name…&lt;/strong&gt;” instead of “input your name here…”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/17-Custom-input-component-with-updated-placeholder-in-preview.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F17-Custom-input-component-with-updated-placeholder-in-preview-1200x647.png" alt="Custom input component with updated placeholder in preview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can go to the UI and play with the property to see how it’s changed.&lt;/p&gt;

&lt;p&gt;Let’s move forward and enable &lt;code&gt;LogicHandler&lt;/code&gt; to control the value using Codeless. Just specify the “&lt;strong&gt;Logic Handler ID&lt;/strong&gt;” value and optionally set the “&lt;strong&gt;Handler Label&lt;/strong&gt;” value.&lt;/p&gt;

&lt;p&gt;As a result, you can see it in the handlers preview.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/18-Update-custom-component-Logic-Handler.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F18-Update-custom-component-Logic-Handler-1200x616.png" alt="Update custom component Logic Handler"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After saving these changes, go to the UI and select the component. You will see that it’s possible to add Logic for the component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/19-Custom-Component-with-Logic-capabilities.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F19-Custom-Component-with-Logic-capabilities-1200x601.png" alt="Custom Component with Logic capabilities"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s add logic for the component and return a simple message. Of course, the logic can get much more complicated, but for this example, it will be quite enough to return plain text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/20a-Add-Codeless-logic-to-a-custom-input-component.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F20a-Add-Codeless-logic-to-a-custom-input-component-1200x347.png" alt="Add Codeless logic to a custom input component"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see it displays the provided message instead of the default one:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/21a-Custom-message-preview-in-custom-component-with-Codeless-logic.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F21a-Custom-message-preview-in-custom-component-with-Codeless-logic.png" alt="Custom message preview in custom component with Codeless logic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="data-binding"&gt;&lt;/a&gt;Component Property With Data Binding
&lt;/h2&gt;

&lt;p&gt;Ok, we have learned how to specify new properties for a Custom Component, however, there is one more important option, this is Data Binding.&lt;/p&gt;

&lt;p&gt;You have probably already used data binding when developing your application. Data binding is an extremely useful tool in built-in components, so naturally we implemented this mechanism for the Custom Components as well.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You can learn more about data binding by watching our videos &lt;a href="https://youtu.be/oPNmza17zso" rel="noopener noreferrer"&gt;here&lt;/a&gt; and &lt;a href="https://www.youtube.com/watch?v=V0dWtm20vtM&amp;amp;t=0s" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let’s create a new property to control the Input value and bind the property to the DataModel to retranslate the value in another built-in Input component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/22a-Add-Data-Binding-to-a-custom-UI-component.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F22a-Add-Data-Binding-to-a-custom-UI-component-1200x605.png" alt="Add Data Binding to a custom UI component"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Modify the “&lt;strong&gt;src/index.js&lt;/strong&gt;” code with the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function MyCustomComponent({ component }) {
  const onInputChange = e =&amp;gt; {
    component.value = e.target.value
  }

  const sayHi = () =&amp;gt; {
    alert(\`Hello ${component.value}\`)
  }

  return ( 
    &amp;lt;div className="greeting-form"&amp;gt;
      &amp;lt;h4&amp;gt;Greeting!&amp;lt;/h4&amp;gt;

      &amp;lt;input 
        value={ component.value } 
        placeholder={ component.placeholder }
        onChange={ onInputChange }
      /&amp;gt;

      &amp;lt;button onClick={ sayHi }&amp;gt;Say Hi&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that we do not need the &lt;code&gt;useState&lt;/code&gt; hook anymore. Save the component and make sure it still works in preview mode.&lt;/p&gt;

&lt;p&gt;Now add a built-in Input component to the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/23-Add-built-in-Input-component-to-page-with-custom-input-component.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F23-Add-built-in-Input-component-to-page-with-custom-input-component-1200x409.png" alt="Add built-in Input component to page with custom input component"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open logic and create a data binding between these two input components using the &lt;strong&gt;PageData&lt;/strong&gt; model:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/24a-Create-data-binding-between-built-in-input-and-custom-input-components.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F24a-Create-data-binding-between-built-in-input-and-custom-input-components-339x600.png" alt="Create data binding between built-in input and custom input components"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open the page view preview and play with both inputs, you will see they both are changing synchronously.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/25-Preview-synced-built-in-and-custom-input-components.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F25-Preview-synced-built-in-and-custom-input-components.png" alt="Preview synced built-in and custom input components"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="event-handlers"&gt;&lt;/a&gt;Component Event Handlers
&lt;/h2&gt;

&lt;p&gt;Sometimes your component may fire an event and you need to add Codeless logic for the event of the component instance. In this section, I am going to show you how to specify event handlers and use them on a page.&lt;/p&gt;

&lt;p&gt;Let’s consider a case where we need to know when a user clicked on the “&lt;strong&gt;Say Hi&lt;/strong&gt;” button and what was typed in the input. For that, let’s register a new Event Handler with one context block “&lt;strong&gt;Name&lt;/strong&gt;”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/26-Add-an-event-handler-to-a-custom-component.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F26-Add-an-event-handler-to-a-custom-component-1200x488.png" alt="Add an event handler to a custom component"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, open the “&lt;strong&gt;src/index.js&lt;/strong&gt;” file and modify the current code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function MyCustomComponent({ component, eventHandlers }) {
  …

  const sayHi = () =&amp;gt; {
    eventHandlers.onSayHiClick({ name: component.value })
  }

  return ( 
    &amp;lt;div className="greeting-form"&amp;gt;
      …
    &amp;lt;/div&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the component and add logic for the event of component instance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/27a-Add-on-click-logic-to-custom-component.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F27a-Add-on-click-logic-to-custom-component-1200x514.png" alt="Add on click logic to custom component"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now if you refresh your preview, type any value into the input and click on the button you will the following message:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/28-Preview-of-on-click-logic-test.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F28-Preview-of-on-click-logic-test-600x214.png" alt="Preview of on click logic test"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="actions"&gt;&lt;/a&gt;Component Actions
&lt;/h2&gt;

&lt;p&gt;Custom component actions can be helpful when you need to affect the component outside of the component.&lt;/p&gt;

&lt;p&gt;Let’s say you want to clear the input value by clicking on the built-in Button component using a Codeless block. For that, there is the “&lt;strong&gt;Actions&lt;/strong&gt;” editor section which allows us to register actions for Custom Components.&lt;/p&gt;

&lt;p&gt;Just add a new action, and you can see how the block will look in the actions preview panel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/29-Add-a-custom-component-action.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F29-Add-a-custom-component-action-1200x331.png" alt="Add a custom component action"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“&lt;strong&gt;Action ID&lt;/strong&gt;” is a required field and we will use it in the component code to define what exactly should happen when we run the action. So, open the “&lt;strong&gt;src/index.js&lt;/strong&gt;” file and modify the current code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function MyCustomComponent({ component, eventHandlers }) {
  component.resetValue = () =&amp;gt; {
    component.value = ''
  }

  …
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that you’ve added the code:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Save the component&lt;/li&gt;
&lt;li&gt; Go to the UI screen&lt;/li&gt;
&lt;li&gt; Add an &lt;code&gt;id&lt;/code&gt; for the custom component, because otherwise you won’t be able to see the component actions in the Codeless Toolbar&lt;/li&gt;
&lt;li&gt; Add a built-in Button component to the page&lt;/li&gt;
&lt;li&gt; Add “OnClick” handler for the button&lt;/li&gt;
&lt;li&gt; and use the action codeless block&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/30-Give-the-custom-component-on-the-page-an-id.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F30-Give-the-custom-component-on-the-page-an-id-1200x534.png" alt="Give the custom component on the page an id"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/31-Add-a-built-in-button-to-reset-the-custom-component-value.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F31-Add-a-built-in-button-to-reset-the-custom-component-value-1200x521.png" alt="Add a built-in button to reset the custom component value"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/32-Create-OnClick-action-for-the-built-in-button.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F32-Create-OnClick-action-for-the-built-in-button-1200x434.png" alt="Create OnClick action for the built-in button"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything is done, open the page in preview and check out how it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="third-party-libraries"&gt;&lt;/a&gt;Use Third-Party Libraries
&lt;/h2&gt;

&lt;p&gt;Creating your own components is a very useful feature, however, sometimes there is an already-implemented module that you want to use in your UI Builder application.&lt;/p&gt;

&lt;p&gt;Next, I am going to show you how to use a third-party library in a Custom Component.&lt;/p&gt;

&lt;p&gt;For example, let’s create a new custom component to use the &lt;a href="https://www.npmjs.com/package/signature_pad" rel="noopener noreferrer"&gt;SignaturePad&lt;/a&gt; module. Download the component file: &lt;a href="https://unpkg.com/signature_pad@4.0.5/dist/signature_pad.umd.min.js" rel="noopener noreferrer"&gt;https://unpkg.com/signature_pad@4.0.5/dist/signature_pad.umd.min.js&lt;/a&gt; and then upload it into your “&lt;strong&gt;src/lib/&lt;/strong&gt;” folder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/33-Signature-pad-component-code-loaded-into-UI-Builder.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F33-Signature-pad-component-code-loaded-into-UI-Builder-1200x452.png" alt="Signature pad component code loaded into UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, open the “&lt;strong&gt;src/index.js&lt;/strong&gt;” file and replace the current code with the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useEffect, useRef } from 'react';

import SignaturePad from './lib/signature\_pad.umd.min';

export default function SignaturePadComponent() {
  const canvasRef = useRef(null);
  const signaturePadRef = useRef(null);

  const savePNG = () =&amp;gt; {
    const fileDataURL = signaturePadRef.current.toDataURL();

    download(fileDataURL, 'signature.png')
  }

  useEffect(() =&amp;gt; {
    signaturePadRef.current = new SignaturePad(canvasRef.current, {
      backgroundColor: 'rgb(255, 255, 255)',
    });

    window.addEventListener('resize', () =&amp;gt; {
      resizeCanvas(canvasRef.current, signaturePadRef.current);
    });

    resizeCanvas(canvasRef.current, signaturePadRef.current);
  }, \[\]);

  return (
    &amp;lt;div className="my-customComponent-signature-pad"&amp;gt;
      &amp;lt;div className="pad-body"&amp;gt;
        &amp;lt;canvas ref={ canvasRef }/&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;div className="pad-controls"&amp;gt;
        &amp;lt;button onClick={ savePNG }&amp;gt;save as PNG&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
  );
}

function resizeCanvas(canvas, signaturePad) {
  const ratio = Math.max(window.devicePixelRatio || 1, 1);

  canvas.width = canvas.offsetWidth \* ratio;
  canvas.height = canvas.offsetHeight \* ratio;
  canvas.getContext('2d').scale(ratio, ratio);

  signaturePad.clear();
}

async function download(dataURL, filename) {
  const a = document.createElement('a');

  a.href = dataURL;
  a.download = filename;

  a.click();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, specify styles in the “&lt;strong&gt;styles/index.less&lt;/strong&gt;” file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.my-customComponent-signature-pad {
  .pad-body {
    width: 400px;
    height: 200px;
    position: relative;
    border: 1px solid red;
    border-radius: 4px
    overflow: hidden;

  canvas {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
  }
}

  .pad-controls {
    margin-top: 5px;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save all the changes, place the component in a page and open it in preview.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/07/34-Signature-pad-preview-in-Backendless-using-ReactJS-and-UI-Builder.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F07%2F34-Signature-pad-preview-in-Backendless-using-ReactJS-and-UI-Builder.png" alt="Signature pad preview in Backendless using ReactJS and UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There you go, in less than a minute you integrated a module from NPM into your UI Builder application! This is amazing, isn’t it?&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="marketplace"&gt;&lt;/a&gt;Marketplace
&lt;/h2&gt;

&lt;p&gt;If you’re not familiar with JavaScript or React, don’t fret. Right now, we are working on numerous components that will be accessible using our Marketplace.&lt;/p&gt;

&lt;p&gt;For instance, the SignaturePad above has already been implemented and it’s going to be released very soon. You can follow up on this &lt;a href="https://github.com/Backendless/ui-builder-library" rel="noopener noreferrer"&gt;Git Repository&lt;/a&gt; to check how we build our components.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="closing"&gt;&lt;/a&gt;Closing
&lt;/h2&gt;

&lt;p&gt;In this guide, we touched on the new Custom UI Components feature and learned how to build your own component with and without external libraries.&lt;/p&gt;

&lt;p&gt;We also learned how to register a component’s properties, events and actions, and how to use it with Codeless.&lt;/p&gt;

&lt;p&gt;Of course, we are still adding to the feature and in the near future you will see some exciting improvements and additions.&lt;/p&gt;

&lt;p&gt;I hope you enjoyed this article, if you have any questions please leave comments here or contact us on our &lt;a href="https://support.backendless.com/" rel="noopener noreferrer"&gt;support forum&lt;/a&gt; or our &lt;a href="http://slack.backendless.com/" rel="noopener noreferrer"&gt;Slack channel&lt;/a&gt;. Thanks for reading and Happy Codeless Coding!&lt;/p&gt;

</description>
      <category>react</category>
      <category>tutorial</category>
      <category>javascript</category>
      <category>serverless</category>
    </item>
    <item>
      <title>2FA Login Plugin Featuring TOTP</title>
      <dc:creator>Backendless</dc:creator>
      <pubDate>Fri, 08 Apr 2022 16:25:08 +0000</pubDate>
      <link>https://dev.to/backendless/2fa-login-plugin-featuring-totp-1hcd</link>
      <guid>https://dev.to/backendless/2fa-login-plugin-featuring-totp-1hcd</guid>
      <description>&lt;p&gt;The &lt;strong&gt;2FA Login&lt;/strong&gt; plugin enables applications built with Backendless to provide an authentication option where a user can log in using the TOTP (Time-based One Time Password) form of two-factor authentication (2FA).&lt;/p&gt;

&lt;p&gt;With this approach, users of your Backendless-powered app can use a TOTP authenticator app such as Google Authenticator, Twilio’s Authy, and Microsoft Authenticator apps to login with a password generated by those apps. The &lt;a href="https://backendless.com/marketplace/2fa-login/"&gt;2FA Login plugin&lt;/a&gt; introduces a workflow with the APIs to coordinate the login process, which you can explore further in the &lt;a href="https://backendless.com/feature/2fa-totp-google-authenticator-twilio-authy/"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;2FA provides one more layer of security for your app, and the plugin is a powerful additional to our comprehensive suite of &lt;a href="https://backendless.com/features/backendless-core/user-management"&gt;User Management&lt;/a&gt; tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is 2-Factor Authentication (2FA)?
&lt;/h2&gt;

&lt;p&gt;Two-factor authentication (2FA) is an authentication process that requires two factors to login: something you know (like a password) and something you have (like a phone or security token).&lt;/p&gt;

&lt;p&gt;2-factor authentication is a designed to improve app data security. Adding 2FA support to your app can help protect your data from unauthorized access in case a user’s login identity (username, email, etc.) and password are compromised.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is TOTP?
&lt;/h2&gt;

&lt;p&gt;TOTP is a method of authentication that uses an app on the user’s mobile device to confirm the user’s login before allowing access to their account. TOTP can be used to protect accounts that hold sensitive information, such as bank accounts, cloud storage accounts, and email accounts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kF5eweo4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://lh3.googleusercontent.com/JWEiZ0b7mClKCv0IlzTX08sCEXiPaArjPNtWSfkUMClKpAR-lOgaTiFzmmrkhXufUj00MYgQkLr7wVQPXHzy_u9g%3Dw640-h400-e365-rj-sc0x00ffffff" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kF5eweo4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://lh3.googleusercontent.com/JWEiZ0b7mClKCv0IlzTX08sCEXiPaArjPNtWSfkUMClKpAR-lOgaTiFzmmrkhXufUj00MYgQkLr7wVQPXHzy_u9g%3Dw640-h400-e365-rj-sc0x00ffffff" alt="Google authentication" width="640" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TOTP is a type of two-factor authentication that uses a six-digit code (or one-time passcode, OTP) or one-time tokens generated by an authenticator app. The code changes every 30 seconds, so it’s unique for each login attempt.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Does TOTP Work?
&lt;/h2&gt;

&lt;p&gt;TOTP is based on the time and a secret key, so the server can generate the same code as the authenticator app. To complete the login process, the user manually enters the time-based code from the authenticator app into the app built with Backendless, which confirms the code before authenticating the user.&lt;/p&gt;

&lt;p&gt;Codes generated by the authentication process become inactive after the time lapses, acting as an additional layer of security.&lt;/p&gt;

&lt;p&gt;There are multiple TOTP apps in both the Google Play (Android) and Apple App Store (iOS). Some examples of these are &lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;amp;hl=en_US&amp;amp;gl=US"&gt;Google Authenticator&lt;/a&gt;, &lt;a href="https://www.microsoft.com/en-us/security/mobile-authenticator-app"&gt;Microsoft Authenticator&lt;/a&gt;, and &lt;a href="https://authy.com/guides/twilio/"&gt;Twilio Authy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Using an authenticator app along with TOTP further enables Backendless developers to restrict access to sensitive data, making Backendless even more secure for enterprise-level applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Enable 2FA in Your Backendless App
&lt;/h2&gt;

&lt;p&gt;To enable two-factor authentication in your application, you’ll need to use the &lt;a href="https://backendless.com/marketplace/2fa-login/"&gt;2FA Login plugin&lt;/a&gt; and its APIs. You can add the plugin for free by visiting &lt;strong&gt;Backend &amp;gt;&lt;/strong&gt; &lt;strong&gt;Marketplace &amp;gt; API SERVICES &amp;gt; All Services&lt;/strong&gt; in your Backendless app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/04/2FA-Login-Plugin.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UDlJEtTz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/04/2FA-Login-Plugin-469x600.png" alt="2FA Login Plugin" width="469" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To verify the installation, visit the &lt;strong&gt;Cloud Code&lt;/strong&gt; section of your backend and you should see the TOTP service in your list of API services.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/03/totp-service.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CYCmsq9y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/03/totp-service-334x600.png" alt="TOTP Service in Backendless" width="334" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The 2FA plugin supports 2FA at the individual user level. You can enable 2FA for the entire app or individual users can individually enable it (through your app).&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing TOTP With 2FA
&lt;/h3&gt;

&lt;p&gt;In a TOTP app, the user needs to scan a QR code or enter a “secret” code to add your application to the TOTP app. The 2FA plugin in Backendless provides both a QR code as well as a “secret” code as a part of the user registration process.&lt;/p&gt;

&lt;p&gt;The API supported by the 2FA Login plugin can be used either via &lt;a href="https://backendless.com/developers/#rest-api"&gt;REST&lt;/a&gt;, using a Backendless SDK, or with &lt;a href="https://backendless.com/features/build-faster/codeless"&gt;Codeless&lt;/a&gt;. Supported frontend languages include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Android/Java&lt;/li&gt;
&lt;li&gt;  JavaScript&lt;/li&gt;
&lt;li&gt;  Objective-C&lt;/li&gt;
&lt;li&gt;  Swift&lt;/li&gt;
&lt;li&gt;  Flutter&lt;/li&gt;
&lt;li&gt;  .NET&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can generate the client-side library for the API using the &lt;a href="https://backendless.com/features/build-faster/code-generation"&gt;Code Generator&lt;/a&gt; as shown below. This will enable you to use the API with the corresponding SDK.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/03/totp-service-codegen.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VcuKAXuK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/03/totp-service-codegen-341x600.png" alt="TOTP Service Code Generation" width="341" height="600"&gt;&lt;/a&gt;If your frontend language is not available, you can access the plugin via REST API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparing Top Authenticator App Providers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NVs5BqUQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/04/Google-Authenticator.png" alt="Google Authenticator logo" width="550" height="353"&gt;1. &lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;amp;hl=en_US&amp;amp;gl=US"&gt;Google Authenticator&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Google Authenticator is a popular two-factor authentication app that’s available on both Android and iOS.&lt;/p&gt;

&lt;p&gt;The technology behind Google Authenticator began as an open-source project, but when Google created a proprietary version, it became known as the familiar and simple alternative to newer 2FA systems. For individuals who use the Google suite of services, Google Authenticator has become a popular choice.&lt;/p&gt;

&lt;p&gt;Google Authenticator is available for free on the Google Play Store and Apple App Store.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IhuZZ8PU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/04/Microsoft-Authenticator.png" alt="Microsoft Authenticator logo" width="387" height="130"&gt;2. &lt;a href="https://www.microsoft.com/en-us/security/mobile-authenticator-app"&gt;Microsoft Authenticator&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Microsoft Authenticator is another popular two-factor authentication app that’s available on both Android and iOS. It supports a wide range of applications, most notably including the complete Microsoft suite of products such as Office 365, Azure AD, and many more.&lt;/p&gt;

&lt;p&gt;Microsoft Authenticator supports PIN and biometric authentication like TouchID tied to the user’s device, adding an additional layer of security to the login process.&lt;/p&gt;

&lt;p&gt;Microsoft Authenticator is available for free on the Google Play Store and Apple App Store.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uMJnQlwp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/04/Authy-Logo-white-background-600x170.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uMJnQlwp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/04/Authy-Logo-white-background-600x170.png" alt="Authy logo" width="600" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;a href="https://authy.com/guides/twilio/"&gt;Twilio Authy&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Twilio Authy is a popular two-factor authentication app that’s available on both Android and iOS. While Authy may not connect with as many third-party apps as Google Authenticator, it supports many devices other than Android and iOS devices. Authy also works with Apple Watches and desktop computers running Windows, Linux, or macOS. It is easy to set up since one account easily links to multiple devices.&lt;/p&gt;

&lt;p&gt;Like Microsoft Authenticator, Authy also supports PIN and biometric authentication, providing addition security compared to Google Authenticator.&lt;/p&gt;

&lt;p&gt;Twilio Authy is available for free on the Google Play Store and Apple App Store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;The 2FA Login plugin from Backendless is a great way to enable two-factor authentication for your app by enabling you to interact with a variety of authenticator apps.&lt;/p&gt;

&lt;p&gt;The plugin enables 2FA via TOTP for increased data and account security. It is just one more tool from Backendless to protect yourself and your uses from unauthorized account access.&lt;/p&gt;

&lt;p&gt;Download and install the plugin &lt;strong&gt;for free&lt;/strong&gt; from the Marketplace section of your Backendless backend today!&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is TOTP Authenticator?
&lt;/h3&gt;

&lt;p&gt;A TOTP authenticator is an app used for user authentication to allow access to a secure account. The authenticator uses a phone app which receives and validates a code generated by a server before allowing access to the account.&lt;/p&gt;

&lt;p&gt;For example, Google Authenticator is a TOTP app that can be used to protect a Google account including Google drive, Google email, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Do I Set Up TOTP?
&lt;/h3&gt;

&lt;p&gt;To set up TOTP for your Backendless app using the 2FA Login plugin, follow the instructions laid out in the plugin’s &lt;a href="https://backendless.com/feature/2fa-totp-google-authenticator-twilio-authy/"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  HOTP vs. TOTP
&lt;/h3&gt;

&lt;p&gt;HOTP stands for HMAC-based One-Time Password. It is the original standard that TOTP was based on. One of the inputs to both methods is a secret key, but TOTP uses the system time for the other input, whereas HOTP utilizes a counter that increments with each new validation. Both parties increment the counter and use it to compute one-time passwords using HOTP.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the 2FA Plugin support push notifications with the TOTP code?
&lt;/h3&gt;

&lt;p&gt;Many authenticator apps provide features such as one-tap push authentication for easier access. These notifications originate from the authenticator app, not Backendless itself.&lt;/p&gt;

&lt;p&gt;Many authenticator apps also include cloud backup for your accounts via platforms such as Google Drive. This is also controlled by the authenticator service, not hosted within Backendless.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on &lt;a href="https://backendless.com/2fa-login-plugin-featuring-totp/"&gt;backendless.com&lt;/a&gt; on April 4th, 2022.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>codenewbie</category>
      <category>security</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>How To Integrate A Bubble App With A Backendless Backend</title>
      <dc:creator>Backendless</dc:creator>
      <pubDate>Mon, 21 Mar 2022 15:47:29 +0000</pubDate>
      <link>https://dev.to/backendless/how-to-integrate-a-bubble-app-with-a-backendless-backend-2h6a</link>
      <guid>https://dev.to/backendless/how-to-integrate-a-bubble-app-with-a-backendless-backend-2h6a</guid>
      <description>&lt;p&gt;Bubble.io is one of the most popular no-code app builders on the market. When you integrate a feature-rich no-code Backendless backend with your Bubble app, you get a &lt;a href="https://backendless.com/features/backendless-core/backendless-database"&gt;visual relational database&lt;/a&gt;, &lt;a href="https://backendless.com/features/backendless-core/user-management"&gt;user management&lt;/a&gt;, &lt;a href="https://backendless.com/features/backendless-core/security"&gt;bulletproof security&lt;/a&gt;, &lt;a href="https://backendless.com/what-is-app-scaling-and-why-it-matters/"&gt;highly-scalable serverless hosting&lt;/a&gt;, and much more.&lt;/p&gt;

&lt;p&gt;Building a mobile or web app used to be an enormous undertaking. Creating apps, or digital products as they are sometimes called, required lots of technical knowledge and many months – even years – of dedicated development time.&lt;/p&gt;

&lt;p&gt;The no-code movement has changed that. Now, with no-code tools like Backendless and Bubble.io, non-technical builders can learn and build apps in months or even weeks. Those with technical knowledge can turn a six month project into a six &lt;em&gt;week&lt;/em&gt; project.&lt;/p&gt;

&lt;p&gt;In this article, we are going to briefly introduce you to Bubble.io, a leading no-code development platform that provides a robust toolkit for building apps visually. Then, we will describe how to add a powerful and scalable Backendless backend to complement a Bubble frontend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contents&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1. What is Bubble.io?&lt;/p&gt;

&lt;p&gt;2. Frontend vs backend development – and why it matters&lt;/p&gt;

&lt;p&gt;3. Benefits of adding a Backendless backend and database&lt;/p&gt;

&lt;p&gt;4. How to integrate a Bubble app with a Backendless backend&lt;/p&gt;

&lt;p&gt;4.1 Bubble app user registration and authentication via Backendless&lt;/p&gt;

&lt;p&gt;4.2 User login in Bubble via Backendless&lt;/p&gt;

&lt;p&gt;4.3 Saving data from Bubble into Backendless Database&lt;/p&gt;

&lt;p&gt;4.4 Querying Backendless Database from Bubble&lt;/p&gt;

&lt;p&gt;5. Conclusion&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="what-is-bubble"&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;What is Bubble.io?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://bubble.io/"&gt;Bubble.io&lt;/a&gt;, previously bubble.is, is a platform for building web apps visually using a drag-and-drop interface and workflow builder. Bubble offers wide user interface design capabilities without code, and comes complete with its own database.&lt;/p&gt;

&lt;p&gt;Bubble provides an excellent toolkit for building relatively simple applications, and thus greatly appeals to new developers with little or no coding experience. With the platform, users can build functioning apps very quickly and easily iterate with new features over time.&lt;/p&gt;

&lt;p&gt;Because of these capabilities, Bubble is a popular choice for so-called “citizen developers”. Many such users include non-technical entrepreneurs with app-based business ideas and technical startup founders seeking to quickly build a minimum viable product (MVP).&lt;/p&gt;

&lt;p&gt;Bubble’s simplicity can be easily complemented with it’s variety of integrations. Users can develop their early project with Bubble, then add additional tools to increase their app’s capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="frontend-vs-backend"&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;Frontend vs backend development – and why it matters
&lt;/h2&gt;

&lt;p&gt;From a high-level perspective, an application’s frontend is what the end user or customer will interact with. This may be an app on their mobile device, an interactive website, or a piece of software. The backend of an application is where long-term data is stored and much of the “heavy lifting” occurs.&lt;/p&gt;

&lt;p&gt;An application’s speed and usability, and thus the user experience, is dependent on the processing power of the device where computations occur. Apps built with a beautiful frontend will get little traction if the app is painfully slow.&lt;/p&gt;

&lt;p&gt;That is why it is recommended that as much of the logic as possible be stored on the backend. A typical server – include Cloud servers – contains far more processing power than a typical mobile phone, tablet, or laptop.&lt;/p&gt;

&lt;p&gt;Similarly, the capabilities of the backend will be essential to growth and scale. Developers should be careful to disregard backend development because that is where the bulk of user experience failures occur.&lt;/p&gt;

&lt;p&gt;A solid backend should not only include a database, but should offer the ability to create backend logic, build and access APIs, provide ample storage for files, images, and videos, and support messaging and notification systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="backendless-benefits"&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;Benefits of adding a Backendless backend and database
&lt;/h2&gt;

&lt;p&gt;We’ve now established that a successful app requires much more than just an impressive user interface. Most apps will be supported by their backend, including servers (hosting), data storage, user management, and in many cases, logic.&lt;/p&gt;

&lt;p&gt;The more capable an app’s backend, the more effective the app and the better the user experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bubble.io/?utm_source=backendless"&gt;Bubble.io&lt;/a&gt; has taken the no-code development world by storm, but for all the strengths the platform offers on the frontend, it’s backend capabilities are lacking.&lt;/p&gt;

&lt;p&gt;Bubble apps come with a built-in database that is adequate for an early stage business, but will struggle mightily if you intend to scale. The database is build for simplicity, not scalability, and will commonly slow down as the number of records being processed increases.&lt;/p&gt;

&lt;p&gt;When it comes to server-side logic, a Bubble backend will likely leave you wanting as well.&lt;/p&gt;

&lt;p&gt;To make up for these shortcomings, Bubble offers an API Connector plugin to facilitate working with a third-party backend and database.&lt;/p&gt;

&lt;h3&gt;
  
  
  That’s where Backendless comes in
&lt;/h3&gt;

&lt;p&gt;With a powerful visual database, &lt;a href="https://backendless.com/docs/rest/index.html"&gt;huge assortment of pre-built APIs&lt;/a&gt; and the capability to &lt;a href="https://backendless.com/features/api-services/codeless"&gt;build your own codeless APIs&lt;/a&gt;, Backendless easily fills in all the backend gaps in your Bubble app.&lt;/p&gt;

&lt;p&gt;For developers looking to build a long-term product, Backendless is critical. Backendless scales infinitely out of the box, meaning you never need to worry about your server infrastructure holding up under heavy traffic. Additionally, you can &lt;a href="https://backendless.com/pricing/backendless-cloud/"&gt;host your app on Backendless’ cloud servers&lt;/a&gt; in the United States or European Union &lt;a href="https://backendless.com/european-union-hosting-cluster/"&gt;(perfect for GDPR compliance)&lt;/a&gt; or &lt;a href="https://backendless.com/pricing/backendless-pro/"&gt;on your own on-premise servers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;From a feature standpoint, Backendless provides the most complete no-code backend capabilities on the market. In this article, we will discuss some of the basics – user authentication (registration and login) and database manipulation. However, that merely scratches the surface of what Backendless has to offer.&lt;/p&gt;

&lt;p&gt;Other features your Bubble app will benefit from include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/docs/rest/index.html"&gt;A large pre-built API collection&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/what-is-serverless-computing/"&gt;Serverless hosting&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/codeless"&gt;Codeless logic builder&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/cloud-code/"&gt;Cloud Code, timers, and event handlers&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/user-engagement/email-marketing"&gt;Email support&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/user-engagement/push-notifications"&gt;Push notification support&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/pub-sub-messaging"&gt;Pub/sub messaging support&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/build-faster/team-driven-development"&gt;Team-driven development&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;  and &lt;a href="https://backendless.com/features/#backendless-core"&gt;much more&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a id="integrate-with-bubble"&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;How to integrate a Bubble app with a Backendless backend
&lt;/h2&gt;

&lt;p&gt;From this point on, we will be demonstrating how to integrate Bubble with Backendless. In this article, we’re going to walk you through the process of integrating several basic backend functions into your Bubble app (click to jump to each section):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  User Registration
&lt;/li&gt;
&lt;li&gt;  User Login
&lt;/li&gt;
&lt;li&gt;  Save Data
&lt;/li&gt;
&lt;li&gt;  Query Your Database
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get started, you will need a &lt;a href="https://bubble.io/"&gt;Bubble account&lt;/a&gt; as well as a &lt;a href="https://develop.backendless.com/login"&gt;Backendless account&lt;/a&gt; (&lt;a href="https://develop.backendless.com/registration"&gt;register here for free&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; The simplest way to access Backendless’ robust backend features is to build your frontend with Backendless as well. Be sure to &lt;a href="https://backendless.com/how-to-build-a-no-code-app-with-ui-builder/"&gt;check out our no-code UI Builder&lt;/a&gt; to see how it stacks up to Bubble.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="registration"&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;Bubble app user registration and authentication via Backendless
&lt;/h2&gt;

&lt;p&gt;User registration, authentication and login are critical components of any app seeking to personalize its user’s experience. In addition to a registration API, Backendless offers a wide array of third-party login options such as Google, Facebook, Twitter, and many others. &lt;a href="https://backendless.com/secure-oauth-2-login-support/"&gt;You can read more about our OAuth 2.0 login support here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;User login opens up the entire set of &lt;a href="https://backendless.com/features/backendless-core/user-management"&gt;user management&lt;/a&gt; functions in Backendless. These include session management, password management, user roles, and relating user to other data objects.&lt;/p&gt;

&lt;p&gt;User registration also opens up user engagement opportunities such as &lt;a href="https://backendless.com/features/user-engagement/email-marketing"&gt;email messaging&lt;/a&gt;, &lt;a href="https://backendless.com/features/user-engagement/email-marketing"&gt;push notifications&lt;/a&gt;, and &lt;a href="https://backendless.com/features/backendless-core/pub-sub-messaging"&gt;in-app messaging&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let’s dive in. To get started, we are going to connect user registration in our Bubble app with our Backendless Database. Users registered by API will appear in the &lt;code&gt;Users&lt;/code&gt; table.&lt;/p&gt;

&lt;p&gt;First, let’s create a registration page. We will need two Input components with identifiers &lt;code&gt;Input Email&lt;/code&gt; (content format: Email) and &lt;code&gt;Input Password&lt;/code&gt; (content format: Password), a button with ID &lt;code&gt;Button Register User&lt;/code&gt; and an Alert with ID &lt;code&gt;Registration Result Alert&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-01.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pWPBy-GQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-01-600x360.png" alt="" width="600" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For integration between the platforms, we will use REST requests, which we will create using the API Connector plugin.&lt;/p&gt;

&lt;p&gt;You can install this plugin immediately after creating a new application, or later through the Assistant. To add a connector, go to the &lt;strong&gt;Plugins&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Add plugins&lt;/strong&gt; tab and add the &lt;strong&gt;API Connector&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-02.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Mihtf2kY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-02-1200x421.png" alt="Bubble app plugins" width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-03.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pxalMcn3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-03-1200x1118.png" alt="" width="800" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s create an API called Backendless and add the &lt;code&gt;RegisterUser&lt;/code&gt; method with the url required for registration (&lt;code&gt;https://api.backendless.com/APP_ID/REST_API_KEY/users/register&lt;/code&gt;). &lt;strong&gt;NOTE:&lt;/strong&gt; Be sure to add your own APP_ID and REST_API_KEY. Both can be found on your Backendless dashboard.&lt;/p&gt;

&lt;p&gt;We also need the email and password parameters (&lt;a href="https://backendless.com/docs/rest/users_user_registration.html"&gt;read the user registration API docs here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;We specified the parameters &lt;code&gt;email&lt;/code&gt;: &lt;code&gt;test@test.com&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt;: &lt;code&gt;111&lt;/code&gt; as test data. Press &lt;strong&gt;Initialize&lt;/strong&gt; / &lt;strong&gt;Reinitialize&lt;/strong&gt; call to verify the request:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-04.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o2AnDPkd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-04-1200x977.png" alt="" width="800" height="651"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If everything is correct, we will get a response from Backendless with a registered user object:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-05.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5JOu8LZV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-05-932x1200.png" alt="" width="800" height="1030"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt; to save the &lt;code&gt;RegisterUser&lt;/code&gt; method, and then clear the values ​​of the &lt;code&gt;email&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt; parameters from the corresponding inputs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-06.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wVip0-Up--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-06-600x77.png" alt="" width="600" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s return to the register page in order to add some more logic. Select the button &lt;strong&gt;Register User&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Start / Edit Workflow&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-07.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xJmu3j0O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-07-513x600.png" alt="" width="513" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our workflow consists of 4 steps:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-08.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QSpORHEi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-08-1200x234.png" alt="" width="800" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Verify that the user entered values ​​in the email and password fields
&lt;/h3&gt;

&lt;p&gt;Otherwise, we will display a message that these fields must be filled.&lt;/p&gt;

&lt;p&gt;To do this, choose &lt;strong&gt;Click here to add an action&lt;/strong&gt;, select &lt;strong&gt;Element Actions&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Show Message&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-09.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H3XgB2OW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-09-600x575.png" alt="" width="600" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, select &lt;strong&gt;Registration Result Alert&lt;/strong&gt; as the displayed element, enter an error message and put a filter that will trigger this action only when one or both of the input fields is not filled:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-10.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4otQhZxS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-10-447x600.png" alt="" width="447" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Call the Backendless user registration method directly
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Click here to add an action&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Plugins&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Backendless – RegisterUser&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--75uMsbMo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-11-600x574.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--75uMsbMo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-11-600x574.png" alt="" width="600" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We indicate that the data for the parameters of the &lt;code&gt;RegisterUser&lt;/code&gt; method must be taken from the &lt;code&gt;Input Email&lt;/code&gt; and &lt;code&gt;Input Password&lt;/code&gt; fields. The call should only be triggered if the values ​​of these fields are not empty:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-12.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_21TY_3i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-12-600x407.png" alt="" width="600" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Display a message about successful registration
&lt;/h3&gt;

&lt;p&gt;Once the request returns successfully in Step 2, we move to displaying a message. To do this, similar to the first step, add a &lt;strong&gt;Registration Result Alert&lt;/strong&gt; call and configure it as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-13.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EABHxKQB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-13-452x600.png" alt="" width="452" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select &lt;strong&gt;Registration Result Alert&lt;/strong&gt; as the displayed element and enter a message about successful registration. Then, use the &lt;strong&gt;Insert Dynamic Data&lt;/strong&gt; button to send the registered user’s email received in step 2.&lt;/p&gt;

&lt;p&gt;We display this message only if we have a field in the response in step 2 &lt;code&gt;objectId&lt;/code&gt; for the user.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Clear the Input Login and Input Password values
&lt;/h3&gt;

&lt;p&gt;To do this, click &lt;strong&gt;Click here to add action&lt;/strong&gt;, select &lt;strong&gt;Element Actions&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Reset inputs&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-14.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R6NHhbQW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-14-600x571.png" alt="" width="600" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The logic is ready. In the upper right corner, click on the Preview button, enter the email and password of the new user and click &lt;strong&gt;Register User&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-15.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AM7Ssssr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-15.png" alt="" width="800" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If registration was successful, we will receive a message about successful registration:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-16.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ID5ry-mA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-16-600x396.png" alt="" width="600" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If an error occurs during registration (for example, user tries to register an already-registered email address), then we will receive the following notification:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-17.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ouNWZ18g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-17-600x298.png" alt="" width="600" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can use the &lt;a href="https://backendless.com/docs/rest/backendless_error_codes.html"&gt;list of response error codes&lt;/a&gt; to set up specific error messages for your users, or simply display the error message received from the backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="login"&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;User login in Bubble via Backendless
&lt;/h2&gt;

&lt;p&gt;Now that we have registration set up, let’s build our Login page.&lt;/p&gt;

&lt;p&gt;On the page, we will need two Input components with identifiers &lt;code&gt;Input Login&lt;/code&gt; (content format: Text) and &lt;code&gt;Input Password&lt;/code&gt; (content format: Password), a button &lt;code&gt;Button Login&lt;/code&gt; and Alert &lt;code&gt;Login Result Alert&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-18.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qP5Z-gHh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-18-600x409.png" alt="" width="600" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the API call to Backendless, add the Login method with the url required for the login &lt;code&gt;https://api.backendless.com/APP_ID/REST_API_KEY/users/login&lt;/code&gt; (replace with your own &lt;code&gt;APP_ID&lt;/code&gt; and &lt;code&gt;REST_API_KEY&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/docs/rest/users_login.html"&gt;Per the docs&lt;/a&gt;, we will need the login and password parameters. As test data, we specified the parameters &lt;code&gt;login&lt;/code&gt;: &lt;code&gt;test@test.com&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt;: &lt;code&gt;111&lt;/code&gt;. Press &lt;strong&gt;Initialize / Reinitialize call&lt;/strong&gt; to verify the request:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-19.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N6jRPgqF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-19-1200x879.png" alt="" width="800" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If everything is correct, we will get a response from Backendless with a logged-in user object:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-20.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d7XpxndS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-20-884x1200.png" alt="" width="800" height="1086"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt; to save the &lt;code&gt;Login&lt;/code&gt; method, after which we clear the values ​​of the &lt;code&gt;login&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt; parameters from the corresponding inputs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-21.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Kuh6p1yt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-21-600x83.png" alt="" width="600" height="83"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s return to the main page in order to write some additional logic. Select the &lt;strong&gt;Login&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Start / Edit Workflow&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;Again, our workflow consists of 4 steps:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-22.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cqr7yg9b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-22-1200x204.png" alt="" width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Verify that the user has entered values ​​in the Bubble app’s login and password fields
&lt;/h3&gt;

&lt;p&gt;Otherwise, we will display a message that these fields must be filled.&lt;/p&gt;

&lt;p&gt;To do this, click &lt;strong&gt;Click here to add an action&lt;/strong&gt;, select &lt;strong&gt;Element Actions&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Show Message&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-23.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hUtExdiA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-23-600x575.png" alt="" width="600" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, select &lt;strong&gt;Login Result Alert&lt;/strong&gt; as the displayed element and enter an error message. Put a filter that will trigger this action only when one or both of the input fields is not filled:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-24.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mreNXeBv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-24-443x600.png" alt="" width="443" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Calling the user’s login method directly in Backendless
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Click here to add an action&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Plugins&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Backendless – Login&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-25.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LW6Fsvbj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-25-600x578.png" alt="" width="600" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We indicate that the data for the parameters of the &lt;code&gt;Login&lt;/code&gt; method must be taken from the &lt;code&gt;Input Login&lt;/code&gt; and &lt;code&gt;Input Password&lt;/code&gt; fields, and the call should be triggered only if the values ​​of these fields are not empty:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-26.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EpcIPZ-q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-26-600x482.png" alt="" width="600" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Display a message about a successful login
&lt;/h3&gt;

&lt;p&gt;Once we’ve gotten a successful result in step 2, we can move on to this step. To display the message, similarly to the first step, add a &lt;strong&gt;Login Result Alert&lt;/strong&gt; call and configure it as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-27.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--waEPg07F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-27-451x600.png" alt="" width="451" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select &lt;strong&gt;Login Result Alert&lt;/strong&gt; as the displayed element and enter a message about a successful login. Then, use the &lt;strong&gt;Insert Dynamic Data&lt;/strong&gt; button to send the email of the logged in user received in step 2.&lt;/p&gt;

&lt;p&gt;We display this message only if we receive the logged-in user’s &lt;code&gt;objectId&lt;/code&gt; field in the response from step 2.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Clear the Login Input and Password Input values
&lt;/h3&gt;

&lt;p&gt;To do this, click &lt;strong&gt;Click here to add an action&lt;/strong&gt;, select &lt;strong&gt;Element Actions&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Reset inputs&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-28.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lXDfPYZB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-28-600x571.png" alt="" width="600" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The logic is now ready. In the upper right corner, click on the &lt;strong&gt;Preview&lt;/strong&gt; button, enter the user login and password, and click &lt;strong&gt;Login&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-29.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DlnG3YJ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-29-600x396.png" alt="" width="600" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the login was successful, we will receive a message about a successful login:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-30.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8BBvkLum--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-30-600x393.png" alt="" width="600" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If an error occurred during registration (for example, the user does not exist), then we will receive the following notification:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-31.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cPJcDbAI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-31-600x279.png" alt="" width="600" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="save-data"&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;Saving data from Bubble into Backendless Database
&lt;/h2&gt;

&lt;p&gt;Bubble offers a built-in database that can be adequate for simple projects or MVP-level applications. When it comes time to scale, and you have tens of thousands of records to store and retrieve, a Bubble database can become a liability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/features/backendless-core/backendless-database"&gt;Backendless Database&lt;/a&gt; is what sets Backendless apart from every other no-code platform out there. Your database can store a wide range of data types (including &lt;a href="https://backendless.com/new-release-featuring-spatial-data-and-console-visibility-controls/"&gt;spatial/geo data&lt;/a&gt; and &lt;a href="https://backendless.com/how-to-add-json-objects-in-backendless-database/"&gt;JSON objects&lt;/a&gt;) and makes it trivially easy to create relations between objects. Plus, a Backendless database can scale infinitely out of the box.&lt;/p&gt;

&lt;p&gt;Backendless Database uses a SQL-based querying system. (We will touch on that more in the next section.) This approach allows you to easily query your data and display exactly what you want the user to see.&lt;/p&gt;

&lt;p&gt;To start working with our data, let’s first take a look at how to save data into our Backendless Database from our Bubble app. Let’s build a simple new page to try it out.&lt;/p&gt;

&lt;p&gt;On the page, we will need two Input components with identifiers &lt;code&gt;Input Name&lt;/code&gt; (content format: Text) and &lt;code&gt;Input Age&lt;/code&gt; (content format: Text (numbers only)), a button &lt;code&gt;Button Save&lt;/code&gt; and an alert &lt;code&gt;Save Result Alert&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-32.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7g74c4qC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-32-600x382.png" alt="" width="600" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will save a new object to a table called &lt;code&gt;Person&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the API call to Backendless, add the &lt;code&gt;SaveObject&lt;/code&gt; method with the url required to save the object &lt;code&gt;https://api.backendless.com/APP_ID/REST_API_KEY/data/Person&lt;/code&gt; (replace with your own &lt;code&gt;APP_ID&lt;/code&gt; and &lt;code&gt;REST_API_KEY&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/docs/rest/data_single_object_create.html"&gt;Per the docs&lt;/a&gt;, we’ll also need the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;age&lt;/code&gt; parameters. Let’s specify the parameters &lt;code&gt;name&lt;/code&gt;: &lt;code&gt;Bob&lt;/code&gt; and &lt;code&gt;age&lt;/code&gt;: &lt;code&gt;30&lt;/code&gt; as test data. Press &lt;strong&gt;Initialize / Reinitialize&lt;/strong&gt; call to verify the request:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-33.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9LSedTFj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-33-1200x872.png" alt="" width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If everything is correct, we will get a response from Backendless with a saved object:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-34.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HwpEHfJx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-34-1200x1171.png" alt="" width="800" height="781"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt; to save the &lt;code&gt;SaveObject&lt;/code&gt; method, after which we clear the values ​​of the name and age parameters from the corresponding inputs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-35.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KEHAPwBS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-35-600x78.png" alt="" width="600" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s return to the main page to add more logic. Select the &lt;strong&gt;Save object&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Start / Edit Workflow&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-36.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hPrH5ymU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-36-600x200.png" alt="" width="600" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once more, our workflow consists of 4 steps:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-37.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2CE_tQcP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-37-600x578.png" alt="" width="600" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Calling the method for saving a new object in Backendless
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Click here to add an action&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Plugins&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Backendless – SaveObject&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-38.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bqJXNWa_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-38-600x380.png" alt="" width="600" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We indicate that the data for the parameters of the &lt;code&gt;SaveObject&lt;/code&gt; method must be taken from the &lt;code&gt;Input Name&lt;/code&gt; and &lt;code&gt;Input Age&lt;/code&gt; fields:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-39.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kwqzloGE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-39-442x600.png" alt="" width="442" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we’ve confirmed that this executed properly, we can move on to the next step.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Display a message about successful saving
&lt;/h3&gt;

&lt;p&gt;To do this, add a &lt;strong&gt;Save Result Alert&lt;/strong&gt; call and configure it as follows:&lt;/p&gt;

&lt;p&gt;Select &lt;strong&gt;Save Result Alert&lt;/strong&gt; as the displayed item and enter a message about successful saving. Use the &lt;strong&gt;Insert Dynamic Data&lt;/strong&gt; button to transfer the &lt;code&gt;objectId&lt;/code&gt; of the saved object obtained in step 1 to the message.&lt;/p&gt;

&lt;p&gt;We will display this message only if we receive the &lt;code&gt;objectId&lt;/code&gt; of the stored object in the request response.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Clear the Input Name and Input Age values
&lt;/h3&gt;

&lt;p&gt;To do this, click &lt;strong&gt;Click here to add an action&lt;/strong&gt;, select &lt;strong&gt;Element Actions&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Reset inputs&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-40.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vuTqM_8d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-40-600x571.png" alt="" width="600" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, the logic is ready. In the upper right corner, click on the &lt;strong&gt;Preview&lt;/strong&gt; button, enter name and age and click &lt;strong&gt;Save object&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-41.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5rwcuJkn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-41-600x380.png" alt="" width="600" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the save is successful, we will receive the message:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-42.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zVpVMYWV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-42-600x399.png" alt="" width="600" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="query"&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;Querying Backendless Database from Bubble
&lt;/h2&gt;

&lt;p&gt;Finally, let’s walk through how to retrieve data from your database by running a query. We will again create a simple page for demonstration.&lt;/p&gt;

&lt;p&gt;For this example, on the main page, we only need one Input component with the &lt;code&gt;Input Where Clause&lt;/code&gt; identifier (content format: Text), a &lt;code&gt;Button Find&lt;/code&gt; button, and a component called Repeating Group with ID &lt;code&gt;Find Result Repeating Group&lt;/code&gt; to display the search results:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-43.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cT1xsemv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-43-600x408.png" alt="" width="600" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will be querying our previously-created &lt;code&gt;Person&lt;/code&gt; table.&lt;/p&gt;

&lt;p&gt;In the API call to Backendless, add the &lt;code&gt;Find&lt;/code&gt; method with the urls required for fetching &lt;code&gt;https://api.backendless.com/APP_ID/REST_API_KEY/data/Person&lt;/code&gt; (replace with your own &lt;code&gt;APP_ID&lt;/code&gt; and &lt;code&gt;REST_API_KEY&lt;/code&gt;) and an optional &lt;code&gt;where&lt;/code&gt; parameter (&lt;a href="https://backendless.com/docs/rest/data_search_with_where_clause.html"&gt;read the docs&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Press &lt;strong&gt;Initialize / Reinitialize&lt;/strong&gt; &lt;strong&gt;call&lt;/strong&gt; to validate the request:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-44.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u0fzRPOW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-44-1200x884.png" alt="" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If everything is correct, we will get a response from Backendless with an array of selected objects:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-45.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m_jvZ21l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-45-831x1200.png" alt="" width="800" height="1155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt; to save the &lt;code&gt;Find&lt;/code&gt; method and return to the main page where we’ll add further logic.&lt;/p&gt;

&lt;p&gt;Let’s select the button &lt;strong&gt;Find&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Start / Edit Workflow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this case, our workflow consists of 3 steps:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-46.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gWvG3Pkh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-46-1200x383.png" alt="" width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Calling the method for fetching objects from Backendless
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Click here to add an action&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Plugins&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Backendless – Find&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-47.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UszEO8U0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-47-600x577.png" alt="" width="600" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The data for the where parameter of the Find method should be taken from the &lt;code&gt;Input Where Clause&lt;/code&gt; field:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-48.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mjPJeIVy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-48-600x338.png" alt="" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the request completes successfully, we can move on to step 2.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Make the Find Result Repeating Group element visible
&lt;/h3&gt;

&lt;p&gt;Select &lt;strong&gt;Click here to add an action&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Show an element&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-49.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YYKzPjc8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-49-600x264.png" alt="" width="600" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, select the element &lt;code&gt;Find Result Repeating Group&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-50.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jZM2FZT8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-50-600x316.png" alt="" width="600" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Transfer the data obtained in step 1 to Find Result Repeating Group
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-51.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_466_rBS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-51-600x407.png" alt="" width="600" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s return to the main screen to complete the settings. Let’s configure Find Result Repeating Group as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-52.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lf6ozp6I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-52-426x600.png" alt="" width="426" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set the &lt;strong&gt;Type of content&lt;/strong&gt; to &lt;code&gt;Find&lt;/code&gt; – this component will display the data received as a result of a Find request. The &lt;strong&gt;Layout style&lt;/strong&gt; will be &lt;code&gt;Full list&lt;/code&gt; – the number of cells in the component will change dynamically depending on the number of objects received in the response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This element is visible on page load&lt;/strong&gt; should be left &lt;strong&gt;unchecked&lt;/strong&gt; – when loading the page, we will not display the Repeatable Group component; we will display it only when we load data from the server.&lt;/p&gt;

&lt;p&gt;Next, let’s add a Text component to the &lt;code&gt;Find Result Repeating Group&lt;/code&gt; cell:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-53.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wCp3pcwB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-53-1200x737.png" alt="" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since we have specified the &lt;code&gt;Find Result Repeating Group&lt;/code&gt; type as the result of the &lt;code&gt;Find&lt;/code&gt; query, we can now configure it to display the name and age fields of objects retrieved from the &lt;code&gt;Person&lt;/code&gt; table. To do this, use the &lt;strong&gt;Insert dynamic data&lt;/strong&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-54.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jyyv0wZx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-54-483x600.png" alt="" width="483" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The logic is now ready. Click on the &lt;strong&gt;Preview&lt;/strong&gt; button, then optionally enter a &lt;a href="https://backendless.com/docs/rest/data_search_with_where_clause.html"&gt;where clause&lt;/a&gt; and click &lt;strong&gt;Find&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-55.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8u0McW6o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-55-600x518.png" alt="" width="600" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a result of a query with the &lt;code&gt;whereClause&lt;/code&gt; of &lt;code&gt;age&amp;gt; 25&lt;/code&gt;, we receive a list of &lt;code&gt;Person&lt;/code&gt; table objects with &lt;code&gt;age&lt;/code&gt; greater than 25. If we execute a &lt;code&gt;Find&lt;/code&gt; query without specifying a &lt;code&gt;whereClause&lt;/code&gt;, we get a list of all objects:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-56.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nl2gx5OO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/10/Bubble-Integration-With-Backendless-56-473x600.png" alt="" width="473" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a id="conclusion"&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;

&lt;p&gt;You should now have a basic handle on how to interact with a Backendless backend via a Bubble app, but this is just the tip of the iceberg. Adding a Backendless backend and database to a Bubble app gives your app incredible flexibility and infinite scalability.&lt;/p&gt;

&lt;p&gt;With Bubble’s easy frontend interface and Backendless’ feature-rich backend and many pre-built APIs, your possibilities become endless.&lt;/p&gt;

&lt;p&gt;In addition to managing users and data, Backendless gives you access to timers, event handlers, and whatever Codeless logic you can think of on the backend.&lt;/p&gt;

&lt;p&gt;Your app is virtually limitless.&lt;/p&gt;

&lt;p&gt;Thanks for reading and Happy Codeless Coding!&lt;/p&gt;




&lt;p&gt;*This article was first published on &lt;a href="https://backendless.com/how-to-integrate-bubble-io-with-backendless/"&gt;backendless.com&lt;/a&gt; on December 2, 2021.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>devops</category>
      <category>codenewbie</category>
      <category>database</category>
    </item>
    <item>
      <title>Backend and Real-Time Database For Flutter Web And Mobile</title>
      <dc:creator>Backendless</dc:creator>
      <pubDate>Mon, 07 Mar 2022 22:06:22 +0000</pubDate>
      <link>https://dev.to/backendless/backend-and-real-time-database-for-flutter-web-and-mobile-5fma</link>
      <guid>https://dev.to/backendless/backend-and-real-time-database-for-flutter-web-and-mobile-5fma</guid>
      <description>&lt;p&gt;The &lt;a href="https://backendless.com/developers/#flutter" rel="noopener noreferrer"&gt;Backendless SDK for Flutter&lt;/a&gt; provides backend support for Flutter web applications as well as Android and iOS mobile apps. Now, your Flutter app can enjoy all the functions and features of a Backendless backend on both web and mobile.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://flutter.dev/" rel="noopener noreferrer"&gt;Flutter&lt;/a&gt; is a popular frontend development framework from Google that enables developers to build beautiful frontends for any screen. Flutter is designed to streamline cross-platform app development while maintaining a consistent user experience.&lt;/p&gt;

&lt;p&gt;In fact, Flutter is now the most-used cross-platform mobile framework in the world, &lt;a href="https://www.statista.com/statistics/869224/worldwide-software-developer-working-hours/" rel="noopener noreferrer"&gt;according to Statista&lt;/a&gt;. This is based on a 2021 developer survey of software developers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.statista.com/statistics/869224/worldwide-software-developer-working-hours/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.statista.com%2Fgraphic%2F1%2F869224%2Fworldwide-software-developer-working-hours.jpg" alt="Statistic: Cross-platform mobile frameworks used by software developers worldwide from 2019 to 2021 | Statista"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because of its versatility, Flutter is an excellent solution for coders seeking to deploy to multiple platforms – web, mobile, even tablet – from a single codebase.&lt;/p&gt;

&lt;p&gt;In particular, Flutter allows frontend developers to complete multi-platform projects much faster and with much less redundant development. Not only does a single codebase mean less work, it also means much less room for errors or inconsistencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Flutter?
&lt;/h2&gt;

&lt;p&gt;Flutter is an open-source UI toolkit originally launched for mobile app development. The Flutter framework has since expanded to include web app development support.&lt;/p&gt;

&lt;p&gt;Flutter code compiles into multiple client-side machine code languages. To put it simply, this means that the Flutter codebase you develop will look virtually pixel-perfect on any screen or device.&lt;/p&gt;

&lt;p&gt;Flutter also boasts the ability to iterate quickly. Changes to your Flutter code compile and become visible almost instantly, making development and testing incredibly streamlined.&lt;/p&gt;

&lt;p&gt;As we’ve mentioned, Flutter is a framework specifically designed for the frontend. As such, there is no “default” backend for a Flutter application. Backendless was among the first no-code/low-code backend services to support a Flutter frontend.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Flutter Web?
&lt;/h2&gt;

&lt;p&gt;Per &lt;a href="https://docs.flutter.dev/web" rel="noopener noreferrer"&gt;Flutter’s website&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Flutter’s web support delivers the same experiences on the web as on mobile. Building on the portability of Dart, the power of the web platform and the flexibility of the Flutter framework, you can now build apps for iOS, Android, and the browser from the same codebase. You can compile existing Flutter code written in Dart into a web experience because it is exactly the same Flutter framework and &lt;strong&gt;web&lt;/strong&gt; is just another device target for your app.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Flutter web support lets you use the same Flutter codebase to build progressive web apps (PWAs) and complex single page apps. The Backendless Flutter SDK supports both Flutter web apps and mobile apps, allowing you to build cross-platform applications with a single Backendless backend.&lt;/p&gt;

&lt;p&gt;Existing Flutter mobile apps can easily be repurposed for web browsers, making them available on desktop as well as mobile devices. Flutter web development is practically identical to Flutter mobile development.&lt;/p&gt;

&lt;p&gt;If you’re a web developer looking for a web platform that can easily be compiled for mobile as well, Flutter is an excellent option.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is No-code / Low-code app development?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://backendless.com/3-types-of-app-development-no-code-low-code-full-code/#no-code" rel="noopener noreferrer"&gt;No-code&lt;/a&gt;, or Codeless as we like to call it, development is app development that does not require the developer to manually write code. Using visual Codeless blocks, you are able to design logic and APIs visually.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/features/backendless-core/codeless" rel="noopener noreferrer"&gt;Codeless development&lt;/a&gt; can save up to 90% on development costs by speeding up processes and reducing developer hours for a project. For developers looking at a framework like Flutter, speed is key.&lt;/p&gt;

&lt;p&gt;Low-code development typically means that the developer has the capability to include some coded elements in the process. With Backendless, for example, you can add Java or JavaScript (Node.js to be specific) code to your backend.&lt;/p&gt;

&lt;p&gt;While low-code development may have a steeper learning curve, it also provides additional flexibility for the developer by removing some constraints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is Backendless the best backend for Flutter web app development?
&lt;/h2&gt;

&lt;p&gt;Backendless’ Flutter SDK, like all Backendless SDKs, works across platforms and device types out of the box. As a Flutter developer, one of your top priorities is serving the same UI and UX to all users, regardless of device type. You need a backend that will not hinder this goal.&lt;/p&gt;

&lt;p&gt;Also as a Flutter developer, getting your project built quickly, and having the ability to iterate quickly, are key. The less effort you have to expend bouncing between your frontend development and backend, the better. Backendless provides a secure, stable backend that you can practically set and forget.&lt;/p&gt;

&lt;p&gt;From a feature standpoint, Backendless provides everything a Flutter backend needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/real-time-data" rel="noopener noreferrer"&gt;Real-time database&lt;/a&gt; – As your Flutter app instantly reloads during development, you’ll want to ensure the data you’re working with is kept up-to-date at all times as well. Once you launch, your users will benefit from always seeing the latest data.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/user-management" rel="noopener noreferrer"&gt;User management&lt;/a&gt; – Easily implement user authentication, registration, and login for your Flutter app. Plus, once you’ve launched, you can manage all users visually, including setting and modifying user roles and permissions.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/user-engagement/push-notifications" rel="noopener noreferrer"&gt;Push notifications&lt;/a&gt; – Critical to user engagement, as well as many key business practices, push notifications can be invaluable – but also a hassle to implement. Backendless provides an easy-to-use push console for creating and sending custom &lt;a href="https://backendless.com/docs/flutter/push_overview.html" rel="noopener noreferrer"&gt;Flutter push notifications&lt;/a&gt; to iOS and Android devices.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/codeless" rel="noopener noreferrer"&gt;Codeless logic&lt;/a&gt; – Developers choose Flutter not only for development speed but for processing speed as well. Flutter apps can run incredibly fast on most devices, so why bog the app down with excessive frontend logic? Moving logic to the backend – and building it without code – lets you speed up development even more and improve performance at the same time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of the above features, and many others, come standard with Backendless.&lt;/p&gt;

&lt;p&gt;Finally, Backendless offers an inexpensive and highly scalable hosting solution (both &lt;a href="https://backendless.com/what-is-serverless-computing/" rel="noopener noreferrer"&gt;serverless&lt;/a&gt; and &lt;a href="https://backendless.com/pricing/backendless-pro/" rel="noopener noreferrer"&gt;on-premise&lt;/a&gt;) for Flutter developers. With &lt;a href="https://backendless.com/pricing/backendless-cloud/" rel="noopener noreferrer"&gt;Backendless Cloud&lt;/a&gt;, you may choose to host in the U.S. or, &lt;a href="https://backendless.com/european-union-hosting-cluster/" rel="noopener noreferrer"&gt;for the GDPR-conscious, in the E.U.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Backendless SDK support for Flutter Web
&lt;/h2&gt;

&lt;p&gt;When Flutter first launched, it was only suited for mobile platforms. Eventually, the Flutter framework expanded to include web apps as well, and now Flutter works on virtually any screen.&lt;/p&gt;

&lt;p&gt;Similarly, our Flutter SDK initially only supported a Flutter backend on mobile platforms (Android and iOS). As Flutter has grown in popularity, particularly relative to similar frameworks like React Native, a lot of users began asking for Web support, and we were happy to oblige. Our SDK for Flutter supports Flutter Web as well as Flutter mobile, and is available now &lt;a href="https://github.com/Backendless/Flutter-SDK" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;From the official &lt;a href="https://flutter.dev/web" rel="noopener noreferrer"&gt;Flutter website&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;With web support, you can compile existing Flutter code written in Dart into a client experience that can be embedded in the browser and deployed to any web server. You can use all the features of Flutter, and you don’t need a browser plug-in.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, you can implement cross-platform solutions for both mobile and web platforms using our SDK for Flutter Web. To get started with your Flutter web development, simply follow the &lt;a href="https://github.com/Backendless/Flutter-SDK#enable-web-support" rel="noopener noreferrer"&gt;instructions on our GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example Flutter Web backend using Backendless
&lt;/h2&gt;

&lt;p&gt;We have created a sample project to demonstrate how the Backendless SDK works with Flutter Web. You can find the example on GitHub here: &lt;a href="https://github.com/4lfant/backendless_web_example" rel="noopener noreferrer"&gt;https://github.com/4lfant/backendless_web_example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this example, you will see how to set up a Flutter web project, save a data object from the client-side to your &lt;a href="https://backendless.com/features/backendless-core/backendless-database" rel="noopener noreferrer"&gt;Backendless Database&lt;/a&gt;, and subscribe to and test a &lt;a href="https://backendless.com/features/backendless-core/pub-sub-messaging" rel="noopener noreferrer"&gt;messaging channel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This example showcases how to integrate a Flutter frontend with a Backendless database as well as how to utilize our pub/sub messaging system with a Flutter client-side.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get started with the Backendless SDK for Flutter Web
&lt;/h2&gt;

&lt;p&gt;New to Flutter and want to give it a try first? Check out our &lt;a href="https://backendless.com/getting-started-with-backendless-and-flutter/" rel="noopener noreferrer"&gt;Quick Start Guide for Flutter&lt;/a&gt; to see how to set up your first Flutter project.&lt;/p&gt;

&lt;p&gt;Be sure you check out our &lt;a href="https://backendless.com/how-to-create-chat-app-with-flutter-sdk/" rel="noopener noreferrer"&gt;Flutter chat app demo here&lt;/a&gt; and our guide to &lt;a href="https://backendless.com/push-notification-setup-for-flutter-sdk/" rel="noopener noreferrer"&gt;setting up push notifications for Flutter here&lt;/a&gt;. Additionally, you can learn &lt;a href="https://backendless.com/real-time-database-integration-for-flutter-developers/" rel="noopener noreferrer"&gt;how to connect your Flutter app to our real-time database here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you have an existing mobile app built with Flutter, you can easily add the web SDK to your project to allow make your app accessible on web as well.&lt;/p&gt;

&lt;p&gt;Are you looking to test a specific feature? Then try out our Flutter templates in &lt;a href="https://backendless.com/features/build-faster/code-generation" rel="noopener noreferrer"&gt;Code Generation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2020%2F07%2FFlutter-Code-Generation-1200x681.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2020%2F07%2FFlutter-Code-Generation-1200x681.png" alt="Flutter code generator in Backendless Console"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Ready to start building your Flutter backend? &lt;a href="https://develop.backendless.com/registration" rel="noopener noreferrer"&gt;Start your free trial of Backendless today&lt;/a&gt; – we can’t wait to see what you’ll build!&lt;/p&gt;

&lt;p&gt;Happy Coding!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article first appeared on &lt;a href="https://backendless.com/best-backend-for-flutter-web/" rel="noopener noreferrer"&gt;backendless.com&lt;/a&gt; on November 30, 2021.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>webdev</category>
      <category>devops</category>
      <category>database</category>
    </item>
    <item>
      <title>Backend and Real-Time Database For React JS</title>
      <dc:creator>Backendless</dc:creator>
      <pubDate>Wed, 02 Mar 2022 20:41:33 +0000</pubDate>
      <link>https://dev.to/backendless/backend-and-real-time-database-for-react-js-3eko</link>
      <guid>https://dev.to/backendless/backend-and-real-time-database-for-react-js-3eko</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F02%2FBest-Backend-for-React-JS.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F02%2FBest-Backend-for-React-JS.png" alt="Best Backend for React JS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Backendless offers a simple way to connect frontend components to backend services through our SDKs. With the &lt;a href="https://backendless.com/developers/#javascript" rel="noopener noreferrer"&gt;SDK for JavaScript&lt;/a&gt;, developers can get all of the benefits of a Codeless backend and database for the &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;React.js&lt;/a&gt; websites and web apps.&lt;/p&gt;

&lt;p&gt;React JS is one of the most popular frontend frameworks for web developers around the world. In fact, &lt;a href="https://www.statista.com/statistics/1124699/worldwide-developer-survey-most-used-frameworks-web/" rel="noopener noreferrer"&gt;according to Statista&lt;/a&gt;, React is the #1 most used web framework among developers worldwide in 2021, with over 40% of the market share.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/02/most-popular-web-frameworks-among-developers-worldwide-2021.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F02%2Fmost-popular-web-frameworks-among-developers-worldwide-2021-520x600.png" alt="Most Popular Web Frameworks among developers worldwide 2021"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The framework can be connected to a backend for additional business logic, user management, and database integration to make websites more interactive and to personalize the user experience.&lt;/p&gt;

&lt;p&gt;While many React application developers have experience with the full development stack, many prefer frontend app development over backend development. That’s why a tool such as backend as a service can greatly speed up the development process.&lt;/p&gt;

&lt;p&gt;In this article, we talk a bit about what React is and how it works, then dive into backend frameworks that can support a React application by providing an API backend, database, and backend login.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is React.js?
&lt;/h2&gt;

&lt;p&gt;ReactJS is an open source library developed by Facebook in 2013. It was created as a replacement for the Flux pattern to help improve development speed and reduce bugs. React uses HTML and CSS to create reusable components and manage state. These components are then rendered on the screen or used to generate other content.&lt;/p&gt;

&lt;p&gt;The core concepts behind React JS include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Components – A component is a self-contained piece of functionality that can be reused across multiple pages.&lt;/li&gt;
&lt;li&gt;  State Management – React manages changes to data within a component’s view. This helps increase performance because it only updates what needs updating instead of refreshing the entire page.&lt;/li&gt;
&lt;li&gt;  Views – View refers to the visual representation of a component.&lt;/li&gt;
&lt;li&gt;  Props – Props are passed from parent components to child components. They allow child components to change the appearance of the parent component.&lt;/li&gt;
&lt;li&gt;  Events – Events are triggered when something happens. In React, events are handled by listeners attached to elements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Advantages of React
&lt;/h2&gt;

&lt;p&gt;React has a ton of positives that make it very popular for coders, especially those with relatively limited development experience. These advantages include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Easy to learn – React is easy to understand and use.&lt;/li&gt;
&lt;li&gt;  Fast – React has been proven to be faster than other similar technologies such as &lt;a href="https://angularjs.org/" rel="noopener noreferrer"&gt;AngularJS&lt;/a&gt; and &lt;a href="https://jquery.com/" rel="noopener noreferrer"&gt;jQuery&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  Flexible – React is flexible and customizable. Developers can choose how they want to structure their application.&lt;/li&gt;
&lt;li&gt;  Simple – React makes building complex interfaces easier.&lt;/li&gt;
&lt;li&gt;  Reusable – React components can be reused throughout your app.&lt;/li&gt;
&lt;li&gt;  Scalable – React is a scalable frontend, allowing you to easily add new features as needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitations of React
&lt;/h2&gt;

&lt;p&gt;While React has many advantages, there are some drawbacks as well. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Not supported everywhere – React isn’t supported on every browser. Some browsers don’t support the latest version of React. If this is the case, you will need to use older versions of React.&lt;/li&gt;
&lt;li&gt;  Occasional speed issues – React is not always the fastest solution. When developing large projects, it may take longer than expected to render views.&lt;/li&gt;
&lt;li&gt;  No default backend – Express JS is a common backend runtime environment used with React, but for frontend developers, having to write backend code can be a major added cost, both in terms of time and money.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why would a React app need a backend?
&lt;/h2&gt;

&lt;p&gt;A React JS app doesn’t have any backend unless you decide to implement one. However, if you do decide to go down that path, there are many benefits to doing so. Here are some reasons why you might consider adding a backend to your React app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Increase security – Many people prefer to keep their personal information private. By implementing a backend, you can ensure that no unauthorized users get access to sensitive information.&lt;/li&gt;
&lt;li&gt;  Manage data storage – You can store all the data associated with your website or mobile app on a server rather than storing it locally. This allows you to scale up your project without having to worry about running out of space.&lt;/li&gt;
&lt;li&gt;  Reduce load times – A backend can provide static files (images, videos, etc.) that can be cached. Caching these files reduces the amount of time it takes to load your site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Applications with backend support tend to be more stable and scalable than those without.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does Backendless work?
&lt;/h2&gt;

&lt;p&gt;Backendless includes a set of tools that make it easy to build an app with a robust and powerful backend. It also includes a variety of APIs that let you interact with your backend in a simple way. As a backend technology, Backendless can support anything from a single-page app to mobile applications.&lt;/p&gt;

&lt;p&gt;Backendless is a backend app that helps you build and manage your app backend.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/Backendless/JS-SDK" rel="noopener noreferrer"&gt;Backendless SDK for JavaScript&lt;/a&gt; gives you everything you need to create a backend for your React JS app. You can connect to a real-time database and manage user accounts. You can even send push notifications to your users.&lt;/p&gt;

&lt;p&gt;Connecting with a Backendless backend also gives you access to &lt;a href="https://backendless.com/features/backendless-core/cloud-code" rel="noopener noreferrer"&gt;Cloud Code&lt;/a&gt;, which is logic stored on the backend. This logic can be created using Java, JavaScript, or using Codeless programming blocks. Logic on the backend can be triggered via API, event handlers, or timers.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Codeless programming?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://backendless.com/learn-the-fundamentals-of-codeless-programming/" rel="noopener noreferrer"&gt;Codeless programming&lt;/a&gt; refers to visually creating logic that’s independent of the platform it runs on. With Codeless programming, you build the logic with blocks that are then converted to code automatically. The system transforms the logic to the appropriate code for the user’s platform.&lt;/p&gt;

&lt;p&gt;Additionally, with &lt;a href="https://backendless.com/features/backendless-core/codeless" rel="noopener noreferrer"&gt;Codeless&lt;/a&gt; you can create code that works across multiple platforms including iOS, Android, desktop browsers, and more.&lt;/p&gt;

&lt;p&gt;Developing with Codeless or low-code platforms can save up to 90% on the &lt;a href="https://backendless.com/how-much-does-app-development-cost-in-2022/" rel="noopener noreferrer"&gt;cost of app development&lt;/a&gt; by speeding up processes and reducing developer manhours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is Backendless the best option for React backend development?
&lt;/h2&gt;

&lt;p&gt;Backendless is well suited to be a backend for React JS web development. It offers built-in features such as a real-time database (RDBMS), user management system, Codeless logic and event handlers, API service management, and many other features.&lt;/p&gt;

&lt;p&gt;Backendless has been used by thousands of companies to build high-performance, scalable applications. The Backendless SDK for JavaScript is a fast and easy way to connect your React app to the cloud. It’s designed to work seamlessly with the React ecosystem for easy server-side development.&lt;/p&gt;

&lt;p&gt;From a core feature standpoint, Backendless provides everything a React backend needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/real-time-data" rel="noopener noreferrer"&gt;Real-time database&lt;/a&gt; – Keep your data up-to-date at all times during the development and testing process. Once you launch, your users will benefit from always seeing the latest data.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/user-management" rel="noopener noreferrer"&gt;User management&lt;/a&gt; – Easily implement user authentication, registration, and login for your React app. Plus, once you’ve launched, you can manage all users visually. Management includes setting and modifying user roles and permissions.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/user-engagement/push-notifications" rel="noopener noreferrer"&gt;Push notifications&lt;/a&gt; – Critical to user engagement, push notifications often used for key business practices. They can be invaluable, but they can also be a hassle to implement. Backendless provides a simple way to create and send custom &lt;a href="https://backendless.com/docs/js/push_overview.html" rel="noopener noreferrer"&gt;JavaScript push notifications&lt;/a&gt; to iOS and Android devices.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/codeless" rel="noopener noreferrer"&gt;Codeless logic&lt;/a&gt; – Moving logic to the backend – and building it without code – lets you speed up development even more. This will improve performance at the same time. By integrating a Backendless backend, you instantly get access to dozens of pre-built APIs. You also gain the ability to create logic quickly without code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of the above features, and many others, come standard with Backendless.&lt;/p&gt;

&lt;p&gt;Finally, Backendless offers an inexpensive and &lt;a href="https://backendless.com/what-is-app-scaling-and-why-it-matters/" rel="noopener noreferrer"&gt;highly scalable&lt;/a&gt; hosting solution (both &lt;a href="https://backendless.com/what-is-serverless-computing/" rel="noopener noreferrer"&gt;serverless&lt;/a&gt; and &lt;a href="https://backendless.com/pricing/backendless-pro/" rel="noopener noreferrer"&gt;on-premise&lt;/a&gt;) for React developers. With &lt;a href="https://backendless.com/pricing/backendless-cloud/" rel="noopener noreferrer"&gt;Backendless Cloud&lt;/a&gt;, you may choose to host in the U.S. or, &lt;a href="https://backendless.com/european-union-hosting-cluster/" rel="noopener noreferrer"&gt;for the GDPR-conscious, in the E.U.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get started with the Backendless SDK for JavaScript (for ReactJS)
&lt;/h2&gt;

&lt;p&gt;To start building applications with Backendless, you must first install the Backendless SDK. This will allow you to interact with our RESTful APIs from within your application. After installing the SDK, you must then configure it by creating a Backendless App. Once this is done, you can begin developing your app.&lt;/p&gt;

&lt;p&gt;We have a variety of resources for helping you get started building your React project with a Backendless backend.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/how-to-create-a-web-app-using-reactjs/" rel="noopener noreferrer"&gt;Demo: How to Build a Web App With ReactJS&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/real-time-database-quick-start-guide-for-javascript-developers/" rel="noopener noreferrer"&gt;Real-time Database Integration Quick Start Guide for JS&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/docs/js/quick_start_guide.html" rel="noopener noreferrer"&gt;Guide to Build a Basic JS App&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To test a specific Backendless feature, try out our demo apps using &lt;a href="https://backendless.com/features/build-faster/code-generation" rel="noopener noreferrer"&gt;Code Generation&lt;/a&gt; for JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2022/02/JavaScript-Code-Generation-in-Backendless.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2022%2F02%2FJavaScript-Code-Generation-in-Backendless.png" alt="JavaScript Code Generation in Backendless"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, be sure to check out all of our React Native resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://github.com/Backendless/React-Native-JS-SDK" rel="noopener noreferrer"&gt;React Native JS SDK on Github&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/setup-push-notifications-in-react-native-ios/" rel="noopener noreferrer"&gt;How to Setup Push Notifications for a React Native App (iOS)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/setup-push-notifications-in-react-native-android/" rel="noopener noreferrer"&gt;How to Setup Push Notifications for a React Native App (Android)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/flutter-vs-react-native-which-is-better-in-2022/" rel="noopener noreferrer"&gt;React Native vs Flutter – Complete Breakdown&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If you’re looking to build a website or app with React JS, Backendless can greatly speed up your application development. Backendess provides valuable resources to make your app run more smoothly and more secure.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://backendless.com/" rel="noopener noreferrer"&gt;try Backendless free to 30 days&lt;/a&gt; to learn all of its benefits and see if it’s a good fit for your React project.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was first published on &lt;a href="https://backendless.com/backend-and-real-time-database-for-react-js/" rel="noopener noreferrer"&gt;backendless.com&lt;/a&gt; on February 22, 2022.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>beginners</category>
      <category>javascript</category>
      <category>devops</category>
    </item>
    <item>
      <title>Create Impeccable Docs With API Documentation Tools</title>
      <dc:creator>Backendless</dc:creator>
      <pubDate>Wed, 16 Feb 2022 20:57:43 +0000</pubDate>
      <link>https://dev.to/backendless/create-impeccable-docs-with-api-documentation-tools-1m0j</link>
      <guid>https://dev.to/backendless/create-impeccable-docs-with-api-documentation-tools-1m0j</guid>
      <description>&lt;p&gt;API documentation is an important part of any &lt;a href="https://backendless.com/what-is-api-as-a-service/#what-is-api"&gt;API service&lt;/a&gt;. It can be the difference between a successful API and one that languishes in obscurity. Good API documentation can help developers understand how to use your API, while bad API documentation can lead to frustration and confusion.&lt;/p&gt;

&lt;p&gt;Fortunately, there are a number of tools out there that can help you create beautiful, user-friendly API documentation. In this article, we’ll take a look at some of the best ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contents&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1. What is API documentation?&lt;/p&gt;

&lt;p&gt;1.1 What are API methods and parameters?&lt;/p&gt;

&lt;p&gt;1.2 What are API definitions?&lt;/p&gt;

&lt;p&gt;2. Why API documentation matters&lt;/p&gt;

&lt;p&gt;2.1 Great community engagement&lt;/p&gt;

&lt;p&gt;2.2 Better search rankings&lt;/p&gt;

&lt;p&gt;2.3 Fewer support requests&lt;/p&gt;

&lt;p&gt;3. What are API documentation tools?&lt;/p&gt;

&lt;p&gt;4. 7 Best API Documentation Tools&lt;/p&gt;

&lt;p&gt;4.1 Backendless&lt;/p&gt;

&lt;p&gt;4.2 Stoplight&lt;/p&gt;

&lt;p&gt;4.3 ReDoc&lt;/p&gt;

&lt;p&gt;4.4 Postman&lt;/p&gt;

&lt;p&gt;4.5 OpenAPI Generator&lt;/p&gt;

&lt;p&gt;4.6 DapperDox&lt;/p&gt;

&lt;p&gt;4.7 Swagger UI&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="what-is-api-documentation"&gt;&lt;/a&gt;What is API documentation?
&lt;/h2&gt;

&lt;p&gt;API documentation is a set of instructions that explain how to use, or program against an API. In other words, it’s the reference manual for your API.&lt;/p&gt;

&lt;p&gt;In many ways, API documentation is similar to an ordinary user manual. So if you’re familiar with how manuals for a consumer product like a washing machine is written, you’ll be able to effectively create API documentation too.&lt;/p&gt;

&lt;p&gt;Good API documentation should contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  An introduction explaining what the API does and why you should use it&lt;/li&gt;
&lt;li&gt;  A summary of all the methods exposed by the API along with examples of input and output for each method&lt;/li&gt;
&lt;li&gt;  Detailed technical information about each method such as parameters and return values&lt;/li&gt;
&lt;li&gt;  Usage guides that show how to call each method in code snippets written in as many programming languages as possible&lt;/li&gt;
&lt;li&gt;  A changelog that documents any changes to the API and the date of those changes&lt;/li&gt;
&lt;li&gt;  Version information such as the current version of the API&lt;/li&gt;
&lt;li&gt;  Getting started guides that show developers how to install, setup and use your API&lt;/li&gt;
&lt;li&gt;  A troubleshooting guide that lists common problems and how to solve them&lt;/li&gt;
&lt;li&gt;  A list of related resources, such as user forums or documentation created by other developers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a id="methods-and-parameters"&gt;&lt;/a&gt;What are API methods and parameters?
&lt;/h3&gt;

&lt;p&gt;For &lt;a href="https://backendless.com/nocode-vs-low-code-vs-full-code-app-development-strategies/#no-code"&gt;no-coders&lt;/a&gt; and those new to APIs and API calls, some of these terms – methods, parameters, etc. – may be foreign to you. We’ll break them down so you can understand how they work.&lt;/p&gt;

&lt;p&gt;Methods are the different actions an API can perform, such as updating a database record or sending an email. They are usually exposed through HTTP requests. For instance, if you need to update the status of a ticket in your helpdesk system then you would send a PUT request to the API containing the ticket number and new status code.&lt;/p&gt;

&lt;p&gt;Parameters are pieces of data that you provide to an API method to tell it how you want it to be performed. They are added as URL query string values or POST body parameters. For example, if you’re sending a PUT request then your website will need to contain one or more of the following parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;ticket_number&lt;/code&gt; – The ID of the ticket you’re updating&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;status&lt;/code&gt; – The new status code of the ticket&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;from_address&lt;/code&gt; – Who the ticket is coming from. This can be either an email address or a user ID&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;to_address&lt;/code&gt; – Who the message should be sent to. This can also be either an email address or a user ID.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The primary methods for an API are GET, PUT, POST, and DELETE. Generally speaking, the usage of these methods are pretty straightforward.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  GET – Retrieves data from a database&lt;/li&gt;
&lt;li&gt;  PUT – Updates data in a database&lt;/li&gt;
&lt;li&gt;  POST – Creates new data (also called “resources”)&lt;/li&gt;
&lt;li&gt;  DELETE – Deletes resources from a database. Check to make sure you really want to delete the resource before sending this request!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For GET and DELETE requests, parameters are passed as query string or cookie values. For PUT and POST requests, they are passed as either URL query string or POST body parameters.&lt;/p&gt;

&lt;p&gt;There are other less common methods too, such as head, trace, options and connect. There are also secondary HTTP request types like OPTIONS. Those are more advanced than we will cover here.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a id="api-definitions"&gt;&lt;/a&gt;What are API definitions?
&lt;/h3&gt;

&lt;p&gt;An API definition is a set of instructions that allow software to understand and interact with your programmatic interface. The most commonly used API definition format for defining an API is the OpenAPI Specification (formerly called Swagger) along with its JSON and YAML variants such as RAML (RESTful API Modeling Language).&lt;/p&gt;

&lt;p&gt;Each object in an OpenAPI specification describes a resource, which represents a piece of data found in your programmatic interface such as a ticket, user profile, etc. Each resource has one or more methods like GET and POST that can be used to interact with it.&lt;/p&gt;

&lt;p&gt;You can give resources and the API as a whole metadata tags like name and version if you want to. When you generate human-readable documentation for your API, this metadata is used to give your API a title, description and version number.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="why-api-docs-matter"&gt;&lt;/a&gt;Why API documentation matters
&lt;/h2&gt;

&lt;p&gt;Building a great API is important. However, it’s not enough to just build it and put it out there.&lt;/p&gt;

&lt;p&gt;To enjoy the benefits of an active developer community around your API, you need to create amazing API docs to go with it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2019/04/excellent-for-prototyping-min-e1561053589559.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--csaR-zf4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2019/04/excellent-for-prototyping-min-600x341.png" alt="Excellent for Prototyping" width="600" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A successful API can make developers’ lives easier by enabling them to use cool new technologies in their projects. By providing clear instructions for how to use your API, you are practically guaranteeing that API consumers will be able to do this quickly and easily.&lt;/p&gt;

&lt;p&gt;We discuss some more reasons why good documentation matters next.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a id="engagement"&gt;&lt;/a&gt;Great community engagement
&lt;/h3&gt;

&lt;p&gt;APIs only thrive when there’s a thriving developer community behind them. Good documentation helps developers get up and running with your API quickly, leading to better engagement with the platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a id="rankings"&gt;&lt;/a&gt;Better search rankings
&lt;/h3&gt;

&lt;p&gt;If a developer is searching for a solution to a problem on Google, and your documentation appears first in the search results, chances are they’ll read more of your docs. If you have clear, helpful documentation that gives them what they’re looking for quickly, it’s more likely that you will get their business.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a id="support"&gt;&lt;/a&gt;Fewer support requests
&lt;/h3&gt;

&lt;p&gt;Your products might be great but if people can’t figure out how to use them effectively because there’s no proper documentation, developers will reach out for help. Providing good API docs means fewer questions from frustrated developers who just want to do their jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="what-are-api-documentation-tools"&gt;&lt;/a&gt;What are API documentation tools?
&lt;/h2&gt;

&lt;p&gt;An API documentation tool is an application that you can use to build, manage and host your API documentation.&lt;/p&gt;

&lt;p&gt;There are several types of API documentation generators – some focus on generating beautiful human-readable output for developers who want to browse your documentation online. Others focus on automatically producing machine-comprehensible code snippets in a range of programming languages which developers can use in their apps.&lt;/p&gt;

&lt;p&gt;So which type should you choose? Most API Documentation tools are hybrids, so you can probably find something that suits your needs. However, here are some things to think about when selecting one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Which programming languages do you want to support?&lt;/li&gt;
&lt;li&gt;  What features do you need? For example, if you want to automatically produce code samples for your documentation, you’ll need a tool that supports this feature.&lt;/li&gt;
&lt;li&gt;  Do you want it hosted as part of an existing product? Or do you want to download and install it yourself? This is especially relevant if you’re looking at Open Source options – if don’t have many resources available, or you just want to start fast, it might be more convenient to deploy an existing product.&lt;/li&gt;
&lt;li&gt;  How much do you want to spend? Most API Documentation tools are either Open Source or offer a free option. Be sure to check the costs before selecting an option – some require payment plans for certain features, while others offer tiered pricing based on usage limits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a id="best-api-documentation-tools"&gt;&lt;/a&gt;7 Best API Documentation Tools
&lt;/h2&gt;

&lt;p&gt;Now that you understand what API Documentation tools are, and the types of features that they offer, let’s take a look at some of your options for generating documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a id="backendless"&gt;&lt;/a&gt;Backendless
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://backendless.com/"&gt;Backendless&lt;/a&gt; allows you to &lt;a href="https://backendless.com/features/api-services/generate-api-docs"&gt;generate API documentation&lt;/a&gt; for your API Services in a matter of minutes. Docs are accessible through a URL or as a downloadable file, and Backendless supports several doc types including Swagger and OpenAPI 3.0. Your API documents can be utilized to automate the client-server connection process by streamlining it with external management tools for your Backendless-managed APIs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2019/04/multiple-docs-formats-min.jpg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EcySSXp2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2019/04/multiple-docs-formats-min-1200x611.jpg" alt="Multiple Doc Formats" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;External service management&lt;/strong&gt; – Backendless generates API documentation that other external service management tools and API providers can read, making your APIs discoverable.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Multiple doc formats&lt;/strong&gt; – Backendless creates API documentation in seven different formats for every API Service. Whether you’re using Swagger, OpenAPI 3.0, or API Blueprints, integrating with your API services is a breeze.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;No-Code app builder API integration&lt;/strong&gt; – Backendless allows you to integrate with your No-Code app builder through the API. Easily add rich APIs and documentation to your applications without any need for technical coding skills.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a id="stoplight"&gt;&lt;/a&gt;Stoplight
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://stoplight.io/"&gt;Stoplight&lt;/a&gt; is a complete API documentation tool that allows you to create, organize and share your APIs. Stoplight automatically generates SDKs for any language in minutes – there’s no need to write code or deal with complex build tools.&lt;/p&gt;

&lt;p&gt;Features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;API design guides&lt;/strong&gt; – Stoplight provides a simple way to manage all of your API designs from a single place. You can quickly change parameters, add error handling and parameter samples, then generate the new specification into an OpenAPI 3.0 model where it can be used for mock testing and generating SDKs in multiple languages.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Crowd tested integrations&lt;/strong&gt; – Stoplight ensures that your APIs work with more than 1,200 libraries so developers don’t have to manually test them themselves. It also includes API design guidelines for 30+ popular services to help you achieve the best coverage.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Mock server&lt;/strong&gt; – Stoplight allows you to create a mock server in minutes using an OpenAPI 3.0 specification (or Swagger definition). You can then share it with other team members or automate testing by publishing the URL so that your CI/CD tools can connect with it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a id="redoc"&gt;&lt;/a&gt;ReDoc
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://redoc.ly/"&gt;ReDoc&lt;/a&gt; is an Open Source API documentation tool. It produces beautiful, human-readable docs in seconds, with support for both HTML and Markdown formats. You can host them wherever you like or download ReDoc’s official web app to view your documentation on the go.&lt;/p&gt;

&lt;p&gt;Features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Markdown support&lt;/strong&gt; – ReDoc lets you write your docs in Markdown format, making it simple to create elegant looking pages using a regular text editor. The tool also includes Markdown syntax highlighting and code block rendering (with language specific font selection).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Server side rendering&lt;/strong&gt; – ReDoc renders the client side website locally on your development machine before deploying it, so it works even if there are no internet connections available when you’re building apps that need to work offline.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Offline support&lt;/strong&gt; – By using service workers, ReDoc is able to keep working offline once it’s been downloaded for the first time, including after updates have been applied.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Dynamic data&lt;/strong&gt; – You can use ReDoc to create extensive documentation with dynamic data. This allows you to alter your docs based on environment variables or other conditions so that developers can test different data sets without having to rebuild their docs each time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a id="postman"&gt;&lt;/a&gt;Postman
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.postman.com/"&gt;Postman&lt;/a&gt; is a complete API development environment that allows you to manage APIs and build requests. You can share collections privately with other members of your team, add comments to requests, and use shared environments to test how changes will affect existing code without breaking it.&lt;/p&gt;

&lt;p&gt;Features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Environment management&lt;/strong&gt; – Postman supports multiple environments so you can easily create different versions of the same API service and switch between them. This helps you define different test procedures and production data sets within the same collection, making it easy to ensure everything is working as expected before deploying updates.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Documentation &amp;amp; sharing&lt;/strong&gt; – Postman stores all of your documentation in a single place where you can access it from any device or location that has an internet connection. You can also publish collections anonymously so that your friends and colleagues can try out new features without having to sign up, or share them privately with an unlimited number of users.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;API mocking&lt;/strong&gt; – You can test your APIs throughout the development process by creating mock servers for them using Postman’s mock server tool. This lets you check how they’re working before deploying updates onto your production server, which makes it ideal for testing against different data sets and scenarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a id="openapi-generator"&gt;&lt;/a&gt;OpenAPI Generator
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://openapi-generator.tech/"&gt;OpenAPI Generator&lt;/a&gt; is an Open Source code generation tool that helps you create APIs from a Swagger/OpenAPI 2.0 or 3.0 definition and automatically update them as needed so you can keep all of your documentation and code in sync at all times.&lt;/p&gt;

&lt;p&gt;Features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Code generator&lt;/strong&gt; – OpenAPI Generator makes it simple to generate server stubs using the code generator, which you can then compile into your preferred language or framework. You can also use it to dynamically generate documentation based on your definitions for services that support OAuth2 and more complex authentication methods like tokens.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Generator templates&lt;/strong&gt; – There are currently over 100 generator templates available for languages such as C# (.Net Core), Java (for Spring Boot &amp;amp; Dropwizard), PHP (Lumen, Slim, Symfony), Python (Flask), and Ruby (Rails) that make it easy to create common API services.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;OpenAPI 3 support&lt;/strong&gt; – OpenAPI Generator is fully compatible with all version 3 features like security schemes, response objects, input/output object, and more.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a id="dapperdox"&gt;&lt;/a&gt;DapperDox
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://dapperdox.io/"&gt;DapperDox&lt;/a&gt; is a free documentation generator for .Net Core and ASP.NET Core applications that helps you create clean API reference docs from Swagger or RAML files, including OpenAPI Specification (OAS) files.&lt;/p&gt;

&lt;p&gt;Features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;RAML support&lt;/strong&gt; – DapperDox supports the open source library for easily generating API documentation from RAML definitions which can be hosted on GitHub pages. Once installed, it allows you to save your Swagger/OAS file as an HTML webpage complete with hyperlinks so users can navigate throughout your API using their browser.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Markdown options&lt;/strong&gt; – In addition to creating API documentation websites, DapperDox also provides a number of other formatting options that make it easy to generate Markdown (.md) files that can be used as a foundation for other documentation. This lets you quickly create API reference documents without having to install any additional tools on your computer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a id="swagger-ui"&gt;&lt;/a&gt;Swagger UI
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://swagger.io/"&gt;Swagger UI&lt;/a&gt; is an interactive API documentation generator that renders your Swagger/OAS files in human- and machine-readable formats so your users can explore them without having to install any special software.&lt;/p&gt;

&lt;p&gt;Features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Mobile support&lt;/strong&gt; – Swagger UI provides a number of options for customizing the user interface, making it easy to view your APIs on devices with small screens that require different formatting. It also supports apps like NativeScript that allow you to create mobile applications using JavaScript, which makes it ideal for creating cross-platform documentation.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Authentication &amp;amp; CORS&lt;/strong&gt; – Swagger UI allows you to control both authentication and Cross Origin Resource Sharing (CORS) settings directly from the website interface, which means you don’t have to make changes to your code or create new pages to implement them.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Templates &amp;amp; localization&lt;/strong&gt; – There are several pre-configured templates included with Swagger UI that can easily be imported into an existing project, and it also supports localization so you can display all of the documentation in different languages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;API documentation tools can help you quickly create, manage, and distribute your APIs so they are easier to use. While some have limited capabilities, there are many open source options available that will work with any application or framework.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was first published on &lt;a href="https://backendless.com/create-impeccable-docs-with-api-documentation-tools/"&gt;backendless.com&lt;/a&gt; on February 4th, 2022.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
    <item>
      <title>Workflow Automation With Zapier and Backendless (Part 2)</title>
      <dc:creator>Backendless</dc:creator>
      <pubDate>Thu, 10 Feb 2022 21:16:15 +0000</pubDate>
      <link>https://dev.to/backendless/workflow-automation-with-zapier-and-backendless-part-2-2ofn</link>
      <guid>https://dev.to/backendless/workflow-automation-with-zapier-and-backendless-part-2-2ofn</guid>
      <description>&lt;p&gt;Zapier lets you automate workflows by using trigger events to initiate actions. In this demo, we show you how to automate sending an email in response to an object being created in your Backendless database.&lt;/p&gt;

&lt;p&gt;To make this demonstration easier to consume, we have broken it into two parts. &lt;a href="https://backendless.com/workflow-automation-with-backendless-and-zapier/" rel="noopener noreferrer"&gt;In the main part, you will see how to take a form created in Backendless and automate, using Zapier, two potential outcomes when that form is submitted.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To view a live example of the completed form, &lt;a href="https://classyvest.backendless.app/index.html" rel="noopener noreferrer"&gt;click here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this part, we take a detailed walk through the building of the form itself. We will get into the weeds of all components and logic included in this form so that you can easily follow along and recreate the form itself in its entirety.&lt;/p&gt;

&lt;p&gt;We will also go through the setup of the approval page. When we’re done, you will have all of the setup in place to complete the automation using the other article.&lt;/p&gt;

&lt;p&gt;To start, let’s revisit the workflow scenario that this demo will be working through.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow scenario
&lt;/h2&gt;

&lt;p&gt;We will consider automating the workflow of ordering office supplies.&lt;/p&gt;

&lt;p&gt;In this scenario, if it is necessary to order office supplies, an employee fills out an order form and sends it for approval. If the order value is less than or equal to the specified limit (in our example 200), then the order is approved automatically.&lt;/p&gt;

&lt;p&gt;However, if the order value exceeds the specified limit, then an email is automatically sent to the manager. The email will contain a link to a web page where the manager can see all the details of the order and then approve or reject it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/Process-Workflow.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2FProcess-Workflow.png" alt="Process Workflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The decision made by the manager is displayed for the employee who made the order, and can also be displayed for other interested employees (for example, employees of the purchasing department).&lt;/p&gt;

&lt;h2&gt;
  
  
  Backendless Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Database tables
&lt;/h3&gt;

&lt;p&gt;Our app has two tables. The first table &lt;code&gt;PurchaseRequest&lt;/code&gt; stores information about the purchase request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F01-Purchase-Request-table-in-Backendless-Database.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F01-Purchase-Request-table-in-Backendless-Database.jpg" alt="Purchase Request table in Backendless Database"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;request&lt;/code&gt; column stores information about the purchase request and is an array of &lt;a href="https://backendless.com/how-to-add-json-objects-in-backendless-database/" rel="noopener noreferrer"&gt;objects in JSON format&lt;/a&gt;. This column does not have to be JSON, however. In our opinion, in a proper data model for an app of this type, this column would include a relation to a separate table referencing ordered supplies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F02-JSON-type-Request-column-in-Backendless-Database.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F02-JSON-type-Request-column-in-Backendless-Database.jpg" alt="JSON-type Request column in Backendless Database"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Column &lt;code&gt;isApproved&lt;/code&gt; will contain &lt;code&gt;true&lt;/code&gt; if the order is approved and &lt;code&gt;false&lt;/code&gt; if the order is rejected.&lt;/p&gt;

&lt;p&gt;The column &lt;code&gt;manager&lt;/code&gt; contains a relation to the second table &lt;code&gt;Employees&lt;/code&gt;. The &lt;code&gt;Employees&lt;/code&gt; table contains information about managers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/03-Employees-table-in-Backendless-Database.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F03-Employees-table-in-Backendless-Database.jpg" alt="Employees table in Backendless Database"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the &lt;code&gt;email&lt;/code&gt; column, we will take the email address for submitting the purchase request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Order Page
&lt;/h3&gt;

&lt;p&gt;The user interface is shown below. We will be creating this interface using &lt;a href="https://backendless.com/developers/#ui-builder" rel="noopener noreferrer"&gt;UI Builder in Backendless&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To see a live example, &lt;a href="https://classyvest.backendless.app/index.html" rel="noopener noreferrer"&gt;click here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What the employee making a purchase request sees:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/04-Work-order-page-in-Backendless-UI-Builder.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F04-Work-order-page-in-Backendless-UI-Builder.jpg" alt="Work order page in Backendless UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What you see in UI Builder:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/37-Purchase-order-form-in-UI-Builder.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F37-Purchase-order-form-in-UI-Builder.jpg" alt="Purchase order form in UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The user interface consists of a purchase order form in which the user can add, remove and select the required items as well as their quantity. The total price is calculated automatically.&lt;/p&gt;

&lt;p&gt;The user interface includes a “form container” Block, which is a dynamic list. This dynamic list contains the following elements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;checkbox&lt;/strong&gt; – this element allows you to select the items you want to delete. The logic is implemented so that when selecting items to delete, the last remaining item cannot be selected.
The “Checked State Logic” property of this element has the following data binding:
&lt;a href="https://backendless.com/wp-content/uploads/2021/11/38-Checkbox-checked-state-logic.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F38-Checkbox-checked-state-logic.jpg" alt="Checkbox checked state logic"&gt;&lt;/a&gt;
(&lt;a href="https://backendless.com/how-to-build-a-no-code-app-with-ui-builder/#data-binding" rel="noopener noreferrer"&gt;Learn more about data binding here.&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;select&lt;/strong&gt; (“Select item”) – this element allows you to select the desired item. To set the items in a select dropdown, click on the &lt;code&gt;CHANGE&lt;/code&gt; button under options:&lt;a href="https://backendless.com/wp-content/uploads/2021/11/Change-select-item-options.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2FChange-select-item-options-220x600.png" alt="Change select item options"&gt;&lt;/a&gt;
&lt;a href="https://backendless.com/wp-content/uploads/2021/11/39-Select-component-item-list.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F39-Select-component-item-list-600x536.jpg" alt="Select component item list"&gt;&lt;/a&gt;The “Value Logic” property of this element has the following data binding:
&lt;a href="https://backendless.com/wp-content/uploads/2021/11/40-Select-component-value-logic-data-binding.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F40-Select-component-value-logic-data-binding.jpg" alt="Select component value logic data binding"&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;select&lt;/strong&gt; (“Select quantity”) – this element allows you to select the desired number of items (in this example, 15 items are available for simplicity).
&lt;a href="https://backendless.com/wp-content/uploads/2021/11/41-Select-component-quantity-item-list.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F41-Select-component-quantity-item-list-600x453.jpg" alt="Select component quantity item list"&gt;&lt;/a&gt;The “Value Logic” property of this element has the following data binding:
&lt;a href="https://backendless.com/wp-content/uploads/2021/11/42-Select-component-quantity-value-data-binding.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F42-Select-component-quantity-value-data-binding.jpg" alt="Select component quantity value data binding"&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;textarea&lt;/strong&gt; (“Enter a description”) – this element allows you to add a justification for the purchase.
The “Value Logic” property of this element has the following data binding:
&lt;a href="https://backendless.com/wp-content/uploads/2021/11/43a-Text-area-description-value-data-binding.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F43a-Text-area-description-value-data-binding.jpg" alt="Text area description value data binding"&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;button&lt;/strong&gt; (“Add Item”) – this element allows you to add an item to a purchase order.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The user interface also contains the following text elements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  “Total price” – which displays the total price of the order and has the following data binding:
&lt;a href="https://backendless.com/wp-content/uploads/2021/11/44-Total-cost-item-value-data-binding.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F44-Total-cost-item-value-data-binding.jpg" alt="Total cost item value data binding"&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  “Status value” – which displays the current status of the order sending and has the following data binding:
&lt;a href="https://backendless.com/wp-content/uploads/2021/11/45-Order-status-content-data-binding.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F45-Order-status-content-data-binding.jpg" alt="Order status content data binding"&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also the user interface contains two buttons: “Delete all selected items” and “Submit Purchase Request”. We will go over those buttons’ logic later.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://backendless.com/features/backendless-core/codeless" rel="noopener noreferrer"&gt;Codeless logic&lt;/a&gt; that is triggered when entering the page is shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/46-Purchase-order-page-on-page-enter-logic-in-UI-Builder.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F46-Purchase-order-page-on-page-enter-logic-in-UI-Builder.jpg" alt="Purchase order page on page enter logic in UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this logic, we initialize an object (“Set Property “&lt;code&gt;prices&lt;/code&gt;” in Page Data) with the values representing the prices for each item type. We then set the initial values for the elements “Total price” (&lt;code&gt;0&lt;/code&gt;) and “Status” (&lt;code&gt;Not saved&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Then we create a list with the initial object to the dynamic list. The only item in this list is a “None” item with &lt;code&gt;price&lt;/code&gt; of &lt;code&gt;0&lt;/code&gt; and quantity of &lt;code&gt;1&lt;/code&gt;; this item will excluded in the logic for submitting the order. This initial object includes the same properties (Value Logic and Check State Logic described above) of the elements in the dynamic list.&lt;/p&gt;

&lt;p&gt;At the end of this block of logic, we load from the table “manager” the data of the manager who will approve the order (in this example, For simplicity, the first record from the table is loaded).&lt;/p&gt;

&lt;p&gt;Let’s consider how the logic of individual elements of the UI works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;“Add Item” button&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The logic “on Click Event” of the button is shown below. This button is used to add an item to the purchase list. This demo does &lt;strong&gt;not&lt;/strong&gt; include logic that would prevent a user from adding the same item type more than once.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/47-Add-item-on-click-event-logic.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F47-Add-item-on-click-event-logic.jpg" alt="Purchase order page on page enter logic in UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you click on this button, a new item is added to the dynamic list (by creating a data object) and the “Status value” is changed to “Not saved”. Adding a new object to the dynamic list leads to corresponding changes in the UI.&lt;/p&gt;

&lt;p&gt;The “Visibility Logic” logic for this button is shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/48-Add-item-button-component-visibility-logic.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F48-Add-item-button-component-visibility-logic.jpg" alt="Add item button component visibility logic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This logic hides the “Add Item” button on all items in the list except for the first (&lt;code&gt;None&lt;/code&gt;) item. This will prevent the user from accidentally double-adding an item that they already added to the list.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;“Delete all selected items” button&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The logic “on Click Event” of the button is shown below. The purpose of this button is to remove all items from the purchase order list that the user has selected using the checkboxes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/49a-Delete-all-selected-items-button-on-click-event-logic.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F49a-Delete-all-selected-items-button-on-click-event-logic.jpg" alt="Delete all selected items button on click event logic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A filter is used to delete items. From all objects of the existing dynamic list, the filter returns only those objects for which the value &lt;code&gt;checkboxState&lt;/code&gt; = &lt;code&gt;false&lt;/code&gt; (checkboxes without ticks).&lt;/p&gt;

&lt;p&gt;Then, using the Map element, we create an array of new objects (clones) and assign it to the dynamic list.&lt;/p&gt;

&lt;p&gt;Also in this block of logic, the “Status value” is changed to “Not saved” and the “Total price” is recalculated.&lt;/p&gt;

&lt;p&gt;To recalculate the “Total price” function &lt;code&gt;getTotalPrice&lt;/code&gt; is used, the logic of which is shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/50-Function-to-calculate-total-price-of-all-added-items.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F50-Function-to-calculate-total-price-of-all-added-items.jpg" alt="Function to calculate total price of all added items"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;“Checkbox”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The “Disabled State Logic” of the checkbox is shown below. This logic is designed to prevent the user from completely deleting all items.&lt;/p&gt;

&lt;p&gt;It is arranged in such a way that if only one unchecked checkbox remains, then the &lt;code&gt;disabled&lt;/code&gt; property of this checkbox is assigned the value &lt;code&gt;true&lt;/code&gt; and the user cannot select this item for deletion.&lt;/p&gt;

&lt;p&gt;To do this, in this block of logic, for each checkbox with the property &lt;code&gt;checkboxState&lt;/code&gt; = &lt;code&gt;false&lt;/code&gt;, we check whether it is a single checkbox with &lt;code&gt;checkboxState&lt;/code&gt; = &lt;code&gt;false&lt;/code&gt;. If so, then we make it disabled.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/51-Disabled-state-logic-for-checkboxs.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F51-Disabled-state-logic-for-checkboxs.jpg" alt="Disabled state logic for checkboxs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;“Select item”&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The “On Change Event Logic” of the select item &lt;strong&gt;select&lt;/strong&gt; component is shown below. The purpose of this logic is to temporarily store in page data the item name, price, and total cost based on the quantity already selected. This temporary data can then be added to the item list when the “Add Item” button is clicked.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/52-Select-component-on-change-event-logic.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F52-Select-component-on-change-event-logic.jpg" alt="Select component on change event logic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This logic writes the &lt;code&gt;itemPrice&lt;/code&gt; property (the price of one item) to a dynamic list, depending on which item the user has selected. For this, the “prices” property from the “Page Data” is used, which is created when entering the page (in a real application, this data could be loaded from a separate database table). For the logic to work correctly, the names of the properties of the “prices” object and the values of the “Select item” are the same.&lt;/p&gt;

&lt;p&gt;Also in this block of logic, the “Status value” is changed to “Not saved” and the “Total price” is recalculated.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;“Select quantity”&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The “On Change Event Logic” of the select quantity &lt;strong&gt;select&lt;/strong&gt; component is shown below. This logic changes the “Status” value to “Not saved” and recalculates the “Total price”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/53-Select-quantity-on-change-event-logic.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F53-Select-quantity-on-change-event-logic.jpg" alt="Select quantity on change event logic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;“Enter a description” (Text area)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The “On Change Event Logic” of the text area is shown below. This logic only changes the “Status value” to “Not saved” when text is entered in the text area.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/54-Description-text-area-on-change-event-logic.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F54-Description-text-area-on-change-event-logic.jpg" alt="Description text area on change event logic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;“Submit Purchase Request ” button&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When the user clicks the “Submit Purchase Request” button, the &lt;code&gt;Submit&lt;/code&gt; event handler is launched. This logic checks that all required fields are filled, then submits the purchase request (stores it in the database). It will also inform the employee if the purchase order is automatically accepted.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/05-On-Submit-Codeless-logic-in-UI-Builder-for-purchase-request-submission.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F05-On-Submit-Codeless-logic-in-UI-Builder-for-purchase-request-submission.jpg" alt="On Submit Codeless logic in UI Builder for purchase request submission"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Submit&lt;/code&gt; event handler logic consists of three main blocks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1) Validation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/06-Purchase-order-validation-Codeless-logic.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F06-Purchase-order-validation-Codeless-logic.jpg" alt="Purchase order validation Codeless logic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This block of logic checks that the user has selected an item and filled in the &lt;code&gt;Description&lt;/code&gt; field. If the user has not filled in all these fields, then the message “Please fill in all fields” will be displayed in the &lt;code&gt;Status&lt;/code&gt; and the logic will not be executed further.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) Saving a purchase request to a database table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/07b-Saving-a-purchase-request-in-Backendless-database.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F07b-Saving-a-purchase-request-in-Backendless-database.jpg" alt="Saving a purchase request in Backendless database"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this block of logic, we disable the “Submit Purchase Request” button, and then we take the data from the form and save it in the &lt;code&gt;PurchaseRequest&lt;/code&gt; table. The creation of a new object in the &lt;code&gt;PurchaseRequest&lt;/code&gt; table will be a signal (trigger) that will start the operation of Zapier.&lt;/p&gt;

&lt;p&gt;After saving the data to the &lt;code&gt;PurchaseRequest&lt;/code&gt; table, the server will return the ID of the saved object. We use this ID to establish a relation to the “Employee” table.&lt;/p&gt;

&lt;p&gt;And at the end of this block of logic, we change the message in &lt;code&gt;Status&lt;/code&gt; to “Your request has been submitted”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) Using logic in “RT Date Update Listener”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After a decision on the purchase order is made (automatically or by a manager), the &lt;code&gt;isApproved&lt;/code&gt; field of the &lt;code&gt;PurchaseRequest&lt;/code&gt; table will be changed to &lt;code&gt;true&lt;/code&gt; (if approved) or &lt;code&gt;false&lt;/code&gt; (if rejected). Updating the object in the table triggers the logic in the “RT Data Update Listener”.&lt;/p&gt;

&lt;p&gt;The “RT Data Update Listener” logic will output to &lt;code&gt;Status&lt;/code&gt; “Request has been approved” if &lt;code&gt;isApproved&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt; or “Request has been rejected” if &lt;code&gt;isApproved&lt;/code&gt; is &lt;code&gt;false&lt;/code&gt;. The logic then unlocks the “Submit Purchase Request” button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/10-Real-time-RT-Codeless-Data-Update-Listener.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F10-Real-time-RT-Codeless-Data-Update-Listener.jpg" alt="Real-time (RT) Codeless Data Update Listener"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Approval Page
&lt;/h3&gt;

&lt;p&gt;The user interface is shown below.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What the manager sees:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/11-Approval-form-user-interface-in-UI-Builder.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F11-Approval-form-user-interface-in-UI-Builder.jpg" alt="Approval form user interface in UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What you see in UI Builder:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/55-Order-approval-page-structure-in-UI-Builder.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F55-Order-approval-page-structure-in-UI-Builder.jpg" alt="Order approval page structure in UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The user interface includes a “container” Block, which is a dynamic list. This list will automatically be populated with the items added to the purchase order (see the On Page Enter logic below).&lt;/p&gt;

&lt;p&gt;A dynamic list contains text elements that output information from the database table to the UI.&lt;/p&gt;

&lt;p&gt;First, let’s look at the data binding for each of the text elements. This is done with “Content Logic” as follows:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Text element displaying “Item name”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/56-Item-name-text-block-content-data-binding.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F56-Item-name-text-block-content-data-binding.jpg" alt="Item name text block content data binding"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Text element displaying “Item price”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/57-Item-price-text-block-content-data-binding.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F57-Item-price-text-block-content-data-binding.jpg" alt="Item price text block content data binding"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Text element displaying “Quantity”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/58-Quantity-text-block-content-data-binding.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F58-Quantity-text-block-content-data-binding.jpg" alt="Quantity text block content data binding"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Text element displaying “Description”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/59a-Description-text-block-content-data-binding.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F59a-Description-text-block-content-data-binding.jpg" alt="Description text block content data binding"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, the user interface contains a text element that displays the “Total price”:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/60-Total-price-block-content-data-binding.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F60-Total-price-block-content-data-binding.jpg" alt="Total price block content data binding"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let’s look at what happens when the user enters the page. When you enter the page, the data of the purchase request is loaded from the table using the ID obtained through the URL parameters. Then this data is output to the UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/12-Approval-page-on-page-enter-Codeless-logic-loading-purchase-request-data.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F12-Approval-page-on-page-enter-Codeless-logic-loading-purchase-request-data.jpg" alt="Approval page on page enter Codeless logic loading purchase request data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you click on the “Approve” button, the &lt;code&gt;isApproved&lt;/code&gt; property of the object is saved to the &lt;code&gt;PurchaseRequest&lt;/code&gt; table with the value &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then the message “The purchase request was approved!” is displayed in the UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/13-Purchase-order-approved-Codeless-logic.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F13-Purchase-order-approved-Codeless-logic.jpg" alt="Purchase order approved Codeless logic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The “Reject” button works the same as the “Approve” button, except that the value &lt;code&gt;false&lt;/code&gt; is stored in the table and the message “The purchase request was rejected!” is displayed in the user interface.&lt;/p&gt;




&lt;h3&gt;
  
  
  To Be Continued… With Zapier Integration
&lt;/h3&gt;

&lt;p&gt;From this point, we will jump into the details of the automation itself, starting with setting up an &lt;a href="https://backendless.com/how-to-use-email-templates/" rel="noopener noreferrer"&gt;email template&lt;/a&gt; in Backendless. &lt;a href="https://backendless.com/workflow-automation-with-backendless-and-zapier/#email-template" rel="noopener noreferrer"&gt;To continue on with this workflow, head over to the main article.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Be sure to check out our other Zapier demo articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/create-language-translator-with-zapier/" rel="noopener noreferrer"&gt;Creating a language translator using Zapier&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/sending-automated-sms-when-registering-a-new-user/" rel="noopener noreferrer"&gt;Send An Automated SMS Message When Registering A New User&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading, and as always, Happy Codeless Coding!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on &lt;a href="https://backendless.com/workflow-automation-with-zapier-detailed-ui-builder-form-setup/" rel="noopener noreferrer"&gt;backendless.com&lt;/a&gt; on February 1st, 2022.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Workflow Automation With Zapier and Backendless (Part 1)</title>
      <dc:creator>Backendless</dc:creator>
      <pubDate>Thu, 10 Feb 2022 21:15:57 +0000</pubDate>
      <link>https://dev.to/backendless/workflow-automation-with-zapier-and-backendless-part-1-18i2</link>
      <guid>https://dev.to/backendless/workflow-automation-with-zapier-and-backendless-part-1-18i2</guid>
      <description>&lt;p&gt;Zapier lets you automate workflows by using trigger events to initiate actions. In this article, we show you how to automate sending an email in response to an object being created in your Backendless database.&lt;/p&gt;

&lt;p&gt;Backendless gives you the ability to create incredibly complex software, such as your own CRM system. With the help of &lt;a href="https://zapier.com/?utm_source=backendless" rel="noopener noreferrer"&gt;Zapier&lt;/a&gt;, you can easily automate that system to initiate specific actions based on activities performed in your application.&lt;/p&gt;

&lt;p&gt;Zapier can connect you with a variety of automation tools. These tools make it easy to automate time-consuming and time sensitive processes. In this article, we will create a workflow that has multiple outcomes based on the value of the items included.&lt;/p&gt;

&lt;p&gt;The focus of this article is the &lt;a href="https://backendless.com/integrate-backendless-with-3000-web-apps-using-zapier/" rel="noopener noreferrer"&gt;automation using Zapier&lt;/a&gt; and &lt;a href="https://backendless.com/how-to-use-email-templates/" rel="noopener noreferrer"&gt;Backendless Email Templates&lt;/a&gt;. We will only lightly touch on the construction of the form itself.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://backendless.com/workflow-automation-with-zapier-detailed-backendless-setup/" rel="noopener noreferrer"&gt;We have created a separate article that walks you through the building of the form in Backendless in full detail.&lt;/a&gt; If you are new to Backendless or app development in general, we suggest you start there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before we get into the process, let’s define the scenario that this workflow will be automating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow scenario
&lt;/h2&gt;

&lt;p&gt;We will consider automating the workflow of ordering office supplies.&lt;/p&gt;

&lt;p&gt;In this scenario, if it is necessary to order office supplies, an employee fills out an order form and sends it for approval. If the order value is less than or equal to the specified limit (in our example, 200), then the order is approved automatically.&lt;/p&gt;

&lt;p&gt;However, if the order value exceeds the specified limit, then an email is automatically sent to the manager. The email will contain a link to a web page where the manager can see all the details of the order and then approve or reject it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/Process-Workflow.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2FProcess-Workflow.png" alt="Process Workflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The decision made by the manager is displayed for the employee who made the order, and can also be displayed for other interested employees (for example, employees of the purchasing department).&lt;/p&gt;

&lt;h2&gt;
  
  
  Backendless Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Database tables
&lt;/h3&gt;

&lt;p&gt;Our app has two tables. The first table, &lt;code&gt;PurchaseRequest&lt;/code&gt;, stores information about the purchase request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/01-Purchase-Request-table-in-Backendless-Database.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F01-Purchase-Request-table-in-Backendless-Database.jpg" alt="Purchase Request table in Backendless Database"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;request&lt;/code&gt; column stores information about the purchase request and is an array of &lt;a href="https://backendless.com/how-to-add-json-objects-in-backendless-database/" rel="noopener noreferrer"&gt;objects in JSON format&lt;/a&gt;. This column does not have to be JSON, however. In our opinion, in a proper data model for an app of this type, this column would include a relation to a separate table referencing ordered supplies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/02-JSON-type-Request-column-in-Backendless-Database.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F02-JSON-type-Request-column-in-Backendless-Database.jpg" alt="JSON-type Request column in Backendless Database"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Column &lt;code&gt;isApproved&lt;/code&gt; will contain &lt;code&gt;true&lt;/code&gt; if the order is approved and &lt;code&gt;false&lt;/code&gt; if the order is rejected.&lt;/p&gt;

&lt;p&gt;The column &lt;code&gt;manager&lt;/code&gt; contains a relation to the second table &lt;code&gt;Employees&lt;/code&gt;. The &lt;code&gt;Employees&lt;/code&gt; table contains information about managers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/03-Employees-table-in-Backendless-Database.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F03-Employees-table-in-Backendless-Database.jpg" alt="Employees table in Backendless Database"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the &lt;code&gt;email&lt;/code&gt; column, we will take the email address for submitting the purchase request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Order Page
&lt;/h3&gt;

&lt;p&gt;The user interface is shown below. We will be creating this interface using &lt;a href="https://backendless.com/developers/#ui-builder" rel="noopener noreferrer"&gt;UI Builder in Backendless&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To see a live example, &lt;a href="https://classyvest.backendless.app/index.html" rel="noopener noreferrer"&gt;click here&lt;/a&gt;. &lt;a href="https://backendless.com/workflow-automation-with-zapier-detailed-ui-builder-form-setup/" rel="noopener noreferrer"&gt;To go through a detailed walkthrough of building this page, click here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/04a-Work-order-page-in-Backendless-UI-Builder.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F04a-Work-order-page-in-Backendless-UI-Builder.jpg" alt="Work order page in Backendless UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The order form will have the following items available for request with the associated prices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Pencils = 1&lt;/li&gt;
&lt;li&gt;  Pens = 2&lt;/li&gt;
&lt;li&gt;  Paper = 10&lt;/li&gt;
&lt;li&gt;  Staplers = 20&lt;/li&gt;
&lt;li&gt;  Monitor = 500&lt;/li&gt;
&lt;li&gt;  Computer = 1000&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://backendless.com/features/backendless-core/codeless" rel="noopener noreferrer"&gt;Codeless logic&lt;/a&gt; that is triggered when entering the page is shown below. This logic establishes the items available, their prices, and creates an empty purchase request object that will be populated by the employee’s selections using the form.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/46-Purchase-order-page-on-page-enter-logic-in-UI-Builder.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F46-Purchase-order-page-on-page-enter-logic-in-UI-Builder.jpg" alt="Purchase order page on page enter logic in UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this logic, we initialize an object (Set Property “&lt;code&gt;prices&lt;/code&gt;” in Page Data) with the values representing the prices for each item type. We then set the initial values for the elements “Total price” (&lt;code&gt;0&lt;/code&gt;) and “Status” (&lt;code&gt;Not saved&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Then we create a list with the initial object to the dynamic list. The only item in this list is a “None” item with &lt;code&gt;price&lt;/code&gt; of &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;quantity&lt;/code&gt; of &lt;code&gt;1&lt;/code&gt;; this item will be excluded in the logic for submitting the order. This initial object includes the properties that make up the purchase request JSON object we discusses previously.&lt;/p&gt;

&lt;p&gt;At the end of this block of logic, we load from the table “manager” the data of the manager who will approve the order (in this example, for simplicity, the first record from the table is loaded).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;“Submit Purchase Request ” Logic&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When the employee clicks the “Submit Purchase Request” button, the &lt;code&gt;Submit&lt;/code&gt; event handler is launched. This logic checks that all required fields are filled, then submits the purchase request (stores it in the database). It will also inform the employee if the purchase order is automatically accepted.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/05-On-Submit-Codeless-logic-in-UI-Builder-for-purchase-request-submission.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F05-On-Submit-Codeless-logic-in-UI-Builder-for-purchase-request-submission.jpg" alt="On Submit Codeless logic in UI Builder for purchase request submission"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Submit&lt;/code&gt; event handler logic consists of three main blocks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1) Validation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/06-Purchase-order-validation-Codeless-logic.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F06-Purchase-order-validation-Codeless-logic.jpg" alt="Purchase order validation Codeless logic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This block of logic checks that the user has selected an item and filled in the &lt;code&gt;Description&lt;/code&gt; field. If the user has not filled in all these fields, then the message “Please fill in all fields” will be displayed in the &lt;code&gt;Status&lt;/code&gt; and the logic will not be executed further.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) Saving a purchase request to a database table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/07b-Saving-a-purchase-request-in-Backendless-database.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F07b-Saving-a-purchase-request-in-Backendless-database.jpg" alt="Saving a purchase request in Backendless database"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this block of logic, we disable the “Submit Purchase Request” button, and then we take the data from the form and save it in the &lt;code&gt;PurchaseRequest&lt;/code&gt; table. The creation of a new object in the &lt;code&gt;PurchaseRequest&lt;/code&gt; table will be a signal (trigger) that will start the operation of Zapier.&lt;/p&gt;

&lt;p&gt;After saving the data to the &lt;code&gt;PurchaseRequest&lt;/code&gt; table, the server will return the ID of the saved object. We use this ID to establish a relation to the “Employee” table.&lt;/p&gt;

&lt;p&gt;And at the end of this block of logic, we change the message in &lt;code&gt;Status&lt;/code&gt; to “Your request has been submitted”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) Using logic in “RT Date Update Listener”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After a decision on the purchase order is made (automatically or by a manager), the &lt;code&gt;isApproved&lt;/code&gt; field of the &lt;code&gt;PurchaseRequest&lt;/code&gt; table will be changed to &lt;code&gt;true&lt;/code&gt; (if approved) or &lt;code&gt;false&lt;/code&gt; (if rejected). Updating the object in the table triggers the logic in the “RT Data Update Listener”.&lt;/p&gt;

&lt;p&gt;The “RT Data Update Listener” logic will output to &lt;code&gt;Status&lt;/code&gt; “Request has been approved” if &lt;code&gt;isApproved&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt; or “Request has been rejected” if &lt;code&gt;isApproved&lt;/code&gt; is &lt;code&gt;false&lt;/code&gt;. The logic then unlocks the “Submit Purchase Request” button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/10-Real-time-RT-Codeless-Data-Update-Listener.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F10-Real-time-RT-Codeless-Data-Update-Listener.jpg" alt="Real-time (RT) Codeless Data Update Listener"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Approval Page
&lt;/h3&gt;

&lt;p&gt;The user interface that the manage will see is shown below. &lt;a href="https://backendless.com/workflow-automation-with-zapier-detailed-ui-builder-form-setup/" rel="noopener noreferrer"&gt;For a more detailed walkthrough of building this page, click here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/11-Approval-form-user-interface-in-UI-Builder.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F11-Approval-form-user-interface-in-UI-Builder.jpg" alt="Approval form user interface in UI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s look at what happens when the manager enters the page. When you enter the page, the data of the purchase request is loaded from the table using the ID obtained through the URL parameters. Then this data is output to the UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/12-Approval-page-on-page-enter-Codeless-logic-loading-purchase-request-data.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F12-Approval-page-on-page-enter-Codeless-logic-loading-purchase-request-data.jpg" alt="Approval page on page enter Codeless logic loading purchase request data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the manager clicks on the “Approve” button, the &lt;code&gt;isApproved&lt;/code&gt; property of the object is saved to the &lt;code&gt;PurchaseRequest&lt;/code&gt; table with the value &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then the message “The purchase request was approved!” is displayed in the UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/13-Purchase-order-approved-Codeless-logic.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F13-Purchase-order-approved-Codeless-logic.jpg" alt="Purchase order approved Codeless logic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The “Reject” button works the same as the “Approve” button, except that the value &lt;code&gt;false&lt;/code&gt; is stored in the table and the message “The purchase request was rejected!” is displayed in the user interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Email template
&lt;/h3&gt;

&lt;p&gt;Now that we have the UI ready, we also need to &lt;a href="https://backendless.com/how-to-use-email-templates/" rel="noopener noreferrer"&gt;prepare an email template&lt;/a&gt; that will be sent to the manager for approval.&lt;/p&gt;

&lt;p&gt;To do this, go to the &lt;strong&gt;Messaging&lt;/strong&gt; tab in the Backend section of Backendless Console. Select the &lt;strong&gt;Emails&lt;/strong&gt; tab. Create a new template as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/14-Purchase-request-email-template-in-Backendless-Messaging.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F14-Purchase-request-email-template-in-Backendless-Messaging.jpg" alt="Purchase request email template in Backendless Messaging"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The email template must contain a link to the approval page. In the parameters of this link, you should specify the ID of the saved object with the purchase request data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/15-Customize-link-parameters-in-purchase-request-email-template.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F15-Customize-link-parameters-in-purchase-request-email-template.jpg" alt="Customize link parameters in purchase request email template"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;objectId&lt;/code&gt; will be assigned to the prepared template &lt;code&gt;{id}&lt;/code&gt; in “Zapier”. This &lt;code&gt;objectId&lt;/code&gt; will be needed to load the order data on the approval page.&lt;/p&gt;

&lt;p&gt;Also, before using the automatic email sending feature, you need to configure the email settings: &lt;strong&gt;Backend –&amp;gt; Manage –&amp;gt; Email&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/16-Configure-email-settings-in-Backendless-Console.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F16-Configure-email-settings-in-Backendless-Console-600x487.jpg" alt="Configure email settings in Backendless Console"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find out more about setting up email here:&lt;/p&gt;

&lt;h2&gt;
  
  
  Zapier Workflow Setup
&lt;/h2&gt;

&lt;p&gt;Now let’s move to the Zapier side. If you don’t have an account with &lt;a href="https://zapier.com/?utm_source=backendless" rel="noopener noreferrer"&gt;Zapier&lt;/a&gt;, you will first need to register and log into your Zapier account. A free account is all you will need for this demo.&lt;/p&gt;

&lt;p&gt;Creating automation with Zapier will consist of three steps. Let’s jump right in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 – Define a trigger
&lt;/h3&gt;

&lt;p&gt;The first thing we need to do is to define a Trigger. Triggers are actions Zapier uses to start performing an action. In our case, saving the purchase request (data object) to the database will act as a trigger.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/17-Define-a-trigger-in-Zapier.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F17-Define-a-trigger-in-Zapier-600x180.jpg" alt="Define a trigger in Zapier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the “App Event” field, select Backendless.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/18-Create-Zapier-App-Event-for-Backendless.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F18-Create-Zapier-App-Event-for-Backendless-1200x562.jpg" alt="Create Zapier App Event for Backendless"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the “Trigger Event” drop-down list, select “Object Created” and click the “Continue” button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/19-Selected-Object-Created-Event-Type-in-Zapier.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F19-Selected-Object-Created-Event-Type-in-Zapier-1200x600.jpg" alt="Selected Object Created Event Type in Zapier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, you will need to enter your credentials with which you log into Backendless Console and click the continue button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/07-Add-Backendless-credentials-in-Zapier-1.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F07-Add-Backendless-credentials-in-Zapier-1-600x549.jpg" alt="Add Backendless credentials in Zapier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you used a social account to register with Backendless, you will need to add a password for your account. To add a password, visit your developer profile here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/07a-Add-Password-in-Backendless.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F07a-Add-Password-in-Backendless-1200x598.png" alt="Add Password in Backendless"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the trigger settings, you need to select the name of your Backendless app and the name of the table into which the object is saved, then click the continue button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/20-Select-Backendless-app-and-table-in-Zapier.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F20-Select-Backendless-app-and-table-in-Zapier.jpg" alt="Select Backendless app and table in Zapier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then we need to test our trigger.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/21-Test-trigger-in-Zapier.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F21-Test-trigger-in-Zapier.jpg" alt="Test trigger in Zapier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the test is successful, the purchase request (data object) that was saved to the table will be displayed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/22-Result-of-successful-trigger-test-in-Zapier.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F22-Result-of-successful-trigger-test-in-Zapier.jpg" alt="Result of successful trigger test in Zapier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 – Set up a workflow trigger action
&lt;/h3&gt;

&lt;p&gt;Now that we have Zapier set up to recognize the trigger, we need to define what action will be taken when the trigger occurs. In this case, we will need to identify the appropriate manager to contact.&lt;/p&gt;

&lt;p&gt;If you look at the purchase request data that loaded during testing at the first step, you can see that there is no &lt;code&gt;manager&lt;/code&gt; column there. This column contains a relation to the &lt;code&gt;Employee&lt;/code&gt; table, from which we need to get the manager’s email. We will get this data in the second step.&lt;/p&gt;

&lt;p&gt;Select the “Backendless” application from the drop-down list and select “Find Object” from the “Action Event” list. Click the continue button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/23-Select-Backendless-and-Find-Object-from-the-Zapier-Action-Event-list.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F23-Select-Backendless-and-Find-Object-from-the-Zapier-Action-Event-list.jpg" alt="Select Backendless and Find Object from the Zapier Action Event list"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then select your Backendless account and fill in the fields as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/24-Set-up-action-in-Zapier.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F24-Set-up-action-in-Zapier.jpg" alt="Set up workflow action in Zapier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please note that when filling in the “Where Clause” field, you must use &lt;strong&gt;single quotes&lt;/strong&gt; &lt;code&gt;'&lt;/code&gt; as shown in the figure. Click the continue button.&lt;/p&gt;

&lt;p&gt;Perform testing. If the test is successful, then we will receive an object with a purchase request along with information about the manager.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/25-Action-test-result-with-manager-data-from-related-table.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F25-Action-test-result-with-manager-data-from-related-table.jpg" alt="Action test result with manager data from related table"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 – Defining a conditional action
&lt;/h3&gt;

&lt;p&gt;Finally, we need to determine whether the new purchase order requires a manager’s approval or not, using our $200 limit. If the request does not require manager approval, we will update it as approved in the database. If it does require approval, we will set up an automation to send the manager an email with a link to the approval page.&lt;/p&gt;

&lt;p&gt;This third step will have two branches. The first branch will be executed when the order value is equal to or less than &lt;code&gt;200&lt;/code&gt; (in this case, the approval of the purchase order will be performed automatically). The second branch will be executed if the order value exceeds &lt;code&gt;200&lt;/code&gt; (in this case, an email will be sent to the manager for approval).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;First Branch&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let’s set the name “Price &amp;lt;= 200” and the rule for the first branch:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/26-Automation-branch-for-orders-less-than-200-dollars.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F26-Automation-branch-for-orders-less-than-200-dollars.jpg" alt="Automation branch for orders less than 200 dollars"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; At time of publication, Zapier does not provide the “less or equal” option; therefore, in order for the logic to work correctly, we set the value &lt;code&gt;200.01&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/27-Zapier-does-not-offer-a-less-than-or-equal-to-option.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F27-Zapier-does-not-offer-a-less-than-or-equal-to-option.jpg" alt="Zapier does not offer a less than or equal to option"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, you need to set the action that will be performed for this condition. In our case, it will be “Object update”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/28-Perform-Update-Object-in-Backendless-action.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F28-Perform-Update-Object-in-Backendless-action.jpg" alt="Perform Update Object in Backendless action"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the “Сontinue” button and then select the Backendless account.&lt;/p&gt;

&lt;p&gt;Set up the action as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/29-Configure-workflow-action-to-update-isApproved-field.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F29-Configure-workflow-action-to-update-isApproved-field.jpg" alt="Configure workflow action to update isApproved field"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here we save in the &lt;code&gt;isApproved&lt;/code&gt; field of the &lt;code&gt;PurchaseRequest&lt;/code&gt; table the value &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Perform testing. If the test is successful, the &lt;code&gt;true&lt;/code&gt; value will be saved in the &lt;code&gt;isApproved&lt;/code&gt; field (during testing, the “Price &amp;lt;= 200” condition is not checked).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/30-Test-200-dollars-or-less-action-in-Zapier.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F30-Test-200-dollars-or-less-action-in-Zapier.jpg" alt="Test 200 dollars or less action in Zapier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Second Branch&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now you need to configure the second branch of the workflow that will be executed on the “Price &amp;gt; 200” condition.&lt;/p&gt;

&lt;p&gt;In order to proceed to editing the second branch, you can use the menu at the top left.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/31-Create-200-dollars-or-greater-workflow-branch.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F31-Create-200-dollars-or-greater-workflow-branch.jpg" alt="Create 200 dollars or greater workflow branch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s set the name “Price&amp;gt;200” and the rule for the second branch:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/32-Name-and-set-up-rules-for-pirce-greater-than-200-workflow-branch.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F32-Name-and-set-up-rules-for-pirce-greater-than-200-workflow-branch.jpg" alt="Name and set up rules for price greater than 200 workflow branch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, you need to set the action that will be performed for this condition. In this case, the action is sending an email to the manager. We will use Backendless to send email.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/33-Configure-send-email-from-Backendless-action-in-Zapier.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F33-Configure-send-email-from-Backendless-action-in-Zapier.jpg" alt="Configure send email from Backendless action in Zapier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the “Сontinue” button and then select the Backendless account.&lt;/p&gt;

&lt;p&gt;Set up the action as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/34-Set-up-send-email-from-Backendless-action-in-Zapier.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F34-Set-up-send-email-from-Backendless-action-in-Zapier.jpg" alt="Set up send email from Backendless workflow action in Zapier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that here we select the template that was previously created in Section 2 of this article, &lt;a href="https://backendless.com/workflow-automation-with-backendless-and-zapier/#email-template" rel="noopener noreferrer"&gt;“Email template”&lt;/a&gt;. Also, in the &lt;code&gt;id&lt;/code&gt; template created in that section, we pass the value &lt;code&gt;ObjectId&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Perform testing. If testing is successful, an email will be sent with a link to the approval page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/35-Test-email-action.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F35-Test-email-action.jpg" alt="Test email action"&gt;&lt;/a&gt;&lt;a href="https://backendless.com/wp-content/uploads/2021/11/36-Successful-test-email-result.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbackendless.com%2Fwp-content%2Fuploads%2F2021%2F11%2F36-Successful-test-email-result.jpg" alt="Successful test email result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now all settings in “Zapier” are done. Click the “Turn on Zap” button and you’re ready to go! Your Zapier workflow is now up and running.&lt;/p&gt;

&lt;p&gt;View the finished product: &lt;a href="https://classyvest.backendless.app/index.html" rel="noopener noreferrer"&gt;Live demo&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Be sure to check out our other Zapier demo articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/create-language-translator-with-zapier/" rel="noopener noreferrer"&gt;Creating a language translator using Zapier&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/sending-automated-sms-when-registering-a-new-user/" rel="noopener noreferrer"&gt;Send An Automated SMS Message When Registering A New User&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading, and as always, Happy Codeless Coding!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was first published on &lt;a href="https://backendless.com/workflow-automation-with-backendless-and-zapier/" rel="noopener noreferrer"&gt;backendless.com&lt;/a&gt; on February 1, 2022.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Flutter vs. React Native: Which is Better in 2022</title>
      <dc:creator>Backendless</dc:creator>
      <pubDate>Wed, 02 Feb 2022 20:44:44 +0000</pubDate>
      <link>https://dev.to/backendless/flutter-vs-react-native-which-is-better-in-2022-261p</link>
      <guid>https://dev.to/backendless/flutter-vs-react-native-which-is-better-in-2022-261p</guid>
      <description>&lt;p&gt;As mobile app development continues to grow in popularity, businesses are looking for ways to create cross-platform apps that can be used on a variety of devices.&lt;/p&gt;

&lt;p&gt;When we say cross-platform, we of course refer to Android and iOS. Per &lt;a href="https://www.statista.com/statistics/272698/global-market-share-held-by-mobile-operating-systems-since-2009/"&gt;Statista&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Android maintained its position as the leading mobile operating system worldwide in June 2021, controlling the mobile OS market with a close to 73 percent share. Google’s Android and Apple’s iOS jointly possess over 99 percent of the global market share.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this article, we will compare two popular frameworks for cross-platform development: Flutter and &lt;a href="https://reactnative.dev/"&gt;React Native&lt;/a&gt;. We will look at the pros and cons of each framework and discuss which one is better suited for use in 2022.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contents&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1. Why is mobile app development so popular?&lt;/p&gt;

&lt;p&gt;2. What is cross-platform app development?&lt;/p&gt;

&lt;p&gt;3. The history of Flutter and React Native&lt;/p&gt;

&lt;p&gt;4. How Flutter and React Native compare&lt;/p&gt;

&lt;p&gt;5. How cross-platform development frameworks work&lt;/p&gt;

&lt;p&gt;6. Building mobile apps is fun again&lt;/p&gt;

&lt;p&gt;7. Pros and cons of Flutter and React Native Apps&lt;/p&gt;

&lt;p&gt;8. Is Flutter or React Native easier to learn?&lt;/p&gt;

&lt;p&gt;9. The Best Backend for Flutter&lt;/p&gt;

&lt;p&gt;10. The Best Backend for React Native&lt;/p&gt;

&lt;p&gt;11. Flutter vs. React Native in 2022&lt;/p&gt;

&lt;p&gt;12. Closing&lt;/p&gt;

&lt;p&gt;13. FAQs&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="mobile-app-development"&gt;&lt;/a&gt;Why is mobile app development so popular?
&lt;/h2&gt;

&lt;p&gt;Developing mobile applications is a steadily growing business niche. Virtually all people on the planet have mobile phones, which means a nearly unlimited number of potential users. Consequently, there are apps for almost everything nowadays.&lt;/p&gt;

&lt;p&gt;You can choose many ways to design and build an app. You can either use native methods, e.g. Swift and Objective-C for creating iOS apps and Java for Android apps. These are the official Apple / Google software programming languages, respectively, which provides support and frequently updated features.&lt;/p&gt;

&lt;p&gt;Alternately, you may use cross-platform frameworks such as Flutter or React Native.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="what-is-cross-platform"&gt;&lt;/a&gt;What is cross-platform app development?
&lt;/h2&gt;

&lt;p&gt;Before we begin, let’s define the term “cross-platform app development” and divide it into two categories: Hybrid Development and Native Development.&lt;/p&gt;

&lt;p&gt;Cross-platform apps are apps that can be developed using a single codebase and function virtually identically on both iOS and Android operating systems. (In this article, we are focusing on mobile app development; &lt;a href="https://backendless.com/everything-you-need-to-know-about-web-app-development/"&gt;we talk more about web and desktop apps here&lt;/a&gt;.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Hybrid Development
&lt;/h3&gt;

&lt;p&gt;Hybrid apps are developed with a combination of web technologies such as HTML5, CSS and JavaScript. This means that hybrid apps share some code across platforms (e.g. the HTML/CSS/JS code) and this shared code runs in a webview on the target platform.&lt;/p&gt;

&lt;p&gt;WebView apps are hybrid apps that use embedded webviews to render their user interface, within which you can use HTML5, CSS and JavaScript for customization.&lt;/p&gt;

&lt;p&gt;WebView apps will have some limitations in accessing the device API out of the box, requiring additional effort to achieve some of the same functionality as native apps. The trade-off is that these apps are cross-platform out of the box, which can be a significant time saver.&lt;/p&gt;

&lt;p&gt;Hybrid apps may look the same on both platforms but behave differently, depending on platform-specific APIs available to them. E.g. a weather app would check the API of the current location’s weather service on both platforms and return different data according to what is available on each platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Native Development
&lt;/h3&gt;

&lt;p&gt;Native apps are developed with the native SDKs of their target platforms (e.g. Android or iOS). This means that they do not share any code across platforms and this shared code is written only for the targeted platform, whereas the UI is implemented using platform-specific widgets and libraries.&lt;/p&gt;

&lt;p&gt;Native apps provide a better user experience than Hybrid apps and also look more native on each platform, but they cost more to develop and take longer to release new features due to the time needed for developers to learn the APIs of the target platforms.&lt;/p&gt;

&lt;p&gt;In general, it is ideal to develop your app using the native development tool of their target platforms (e.g. Android Studio or Xcode).&lt;/p&gt;

&lt;h3&gt;
  
  
  Flutter and React Native: Cross-Platform Frameworks
&lt;/h3&gt;

&lt;p&gt;Both Flutter and React Native are among the best cross-platform development frameworks available today. They both use native widgets to deliver a highly customizable, responsive UI while sharing code across different platforms.&lt;/p&gt;

&lt;p&gt;The Flutter framework is developed by Google while the React Native framework is developed by Facebook, so these tech giants have very large teams dealing with everything from the platform’s SDKs to its documentation, support, etc.&lt;/p&gt;

&lt;p&gt;While Flutter and React Native apps are both native, they are advantageous over traditional native app development because they can share a significant proportion of their codebase across platforms.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://engineering.instagram.com/react-native-at-instagram-dd828a9a90c7#.8wdmfmhep"&gt;According to Instagram&lt;/a&gt;, the amount of code shared between iOS and Android via their React Native features was over 90%.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="history"&gt;&lt;/a&gt;The history of Flutter and React Native
&lt;/h2&gt;

&lt;p&gt;Flutter was announced at the Dart Developer Summit in October of 2016. The main idea behind this cross-platform mobile app development framework is to give developers tools to build native apps for iOS and Android using one single codebase written in Google’s own Dart programming language.&lt;/p&gt;

&lt;p&gt;The first stable release (1.0) of Flutter came out on February 16, 2018.&lt;/p&gt;

&lt;p&gt;React Native started a little bit earlier than Flutter, having its &lt;a href="https://engineering.fb.com/2015/03/26/android/react-native-bringing-modern-web-techniques-to-mobile/"&gt;first beta version released on March 2015&lt;/a&gt;, however it didn’t manage to leave the beta phase until March 2017. On September 5, 2017 React Native reached version 1.0 with huge support from tech giant Facebook.&lt;/p&gt;

&lt;p&gt;As you can see both technologies are relatively new, but don’t let that fool you. React Native is already used by big players like Facebook, Instagram, Airbnb and Uber.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/us/app/facebook/id284882215"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8-ZcAfTK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/01/Facebook-on-Apple-App-Store.jpg" alt="Facebook on Apple App Store" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flutter doesn’t boast the same big names, but has &lt;a href="https://flutter.dev/showcase"&gt;already been embraced&lt;/a&gt; by BMW, Toyota, eBay and, of course, Google’s own Google Pay.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="flutter-vs-react-native"&gt;&lt;/a&gt;How Flutter and React Native compare
&lt;/h2&gt;

&lt;p&gt;The main difference between Flutter and React Native is that React Native does not compile into a native mobile language (Java, Swift, Objective-C), but rather &lt;a href="https://reactnative.dev/docs/javascript-environment"&gt;simply runs its JavaScript code&lt;/a&gt;. Flutter, on the other hand, compiles its Dart language into native, which can impact performance (discussed later).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OHm9as8Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/01/Javascript-vs-Dart-600x280.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OHm9as8Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/01/Javascript-vs-Dart-600x280.png" alt="Javascript vs Dart" width="600" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another big difference is that vanilla JavaScript (besides JSX) is used for writing components on React Native. Facebook developers recommend using Flow or TypeScript when with React due to its dynamic nature. For Flutter, Google recommends using Dart for writing code as well because of its static typing system.&lt;/p&gt;

&lt;p&gt;In our opinion, the decision on which of these 2 technologies to choose should be based more on your preferences rather than on their actual features and capabilities.&lt;/p&gt;

&lt;p&gt;Of course it’s good to know all programming paradigms so you can easily pick up new languages and frameworks even if they’re not written in a language you’re familiar with.&lt;/p&gt;

&lt;p&gt;Programmers who are already familiar with JavaScript (ES2015+) or TypeScript/Flow will find it much easier to start working with React Native. This is particularly true of developers that have used React for the web, as there is a great deal of overlap between React and React Native.&lt;/p&gt;

&lt;p&gt;JavaScript still has a significant market share in the mobile development space, and because both React Native and Flutter allow you to choose your favorite programming language, it’s hard to say which one will be more popular in 2022.&lt;/p&gt;

&lt;p&gt;There are also other important factors that might influence this decision, such as:&lt;/p&gt;

&lt;p&gt;– Companies’ preference toward a specific technology stack&lt;/p&gt;

&lt;p&gt;– Developer’s familiarity with a given language/framework&lt;/p&gt;

&lt;p&gt;– Availability of developers with skills necessary for using a specific technology&lt;/p&gt;

&lt;p&gt;As we have already pointed out, React Native and Flutter are both going to be significant players in 2022, so it’s up to you to choose which is the best option for your long term goals.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="how-cross-platform-frameworks-work"&gt;&lt;/a&gt;How cross-platform development frameworks work
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GERxCWve--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/01/Cross-platform-apps-600x303.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GERxCWve--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/01/Cross-platform-apps-600x303.png" alt="Cross-platform apps" width="600" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although cross-platform mobile development frameworks share many concepts and features, they’re each created with different goals in mind.&lt;/p&gt;

&lt;p&gt;React Native was designed to provide native code performance combined with the ease of development that React web brings into the table. The idea is not to use a single set of shared components between iOS and Android but instead to have completely separate UI’s wrapped into a single JavaScript bundle, allowing you to ship almost half of the app’s code in a single place.&lt;/p&gt;

&lt;p&gt;Flutter was created mainly to fulfill Google’s needs for… Google. In other words, another attempt at marrying fast development cycles with native code performance and building reusable UI components that can be shared between iOS and Android apps. This is why Google’s Flutter is so much faster than React Native.&lt;/p&gt;

&lt;p&gt;Flutter was also designed with the idea of making app development easier and more accessible because it allows writing code using Dart, a language that can be learned in a weekend and mastered in days or even hours depending on the developer’s skillset.&lt;/p&gt;

&lt;p&gt;This is why we believe that Flutter will be the mobile development framework of choice for companies that need to create lots of native mobile apps very quickly without sacrificing performance or features.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="building-apps-is-fun"&gt;&lt;/a&gt;Building mobile apps is fun again
&lt;/h2&gt;

&lt;p&gt;When Google announced Flutter, developers were stunned by how well it performs in practice compared to other technologies developed specifically for the purpose of building cross-platform mobile applications.&lt;/p&gt;

&lt;p&gt;React Native’s philosophy of sharing UI code between iOS and Android was a great initiative, but due to React Native’s inherent limitations, the resulting apps cannot perform as well as native ones.&lt;/p&gt;

&lt;p&gt;Flutter comes with a lot of goodies that you will not find in any other tool today. Dart is an impressive language that has been built from the ground up for the purpose of creating mobile apps.&lt;/p&gt;

&lt;p&gt;Dart is currently the fastest language available for building Android and iOS apps, makes it easier to build performant UI components, has great IDE (integrated development environment) support with powerful autocompletion features, allows doing live coding prototyping without losing app state, and finally embraces object-oriented programming by making it mandatory.&lt;/p&gt;

&lt;p&gt;Having an &lt;a href="https://hackernoon.com/opinionated-or-not-choosing-the-right-framework-for-the-job-6x1u2ga0#:~:text=What%20are%20%E2%80%9COpinionated%E2%80%9D%20Frameworks%3F,%2C%20best%20practices%2C%20and%20conventions.&amp;amp;text=This%20means%20the%20framework%20designers,as%20they%20follow%20specific%20assumptions."&gt;opinionated framework&lt;/a&gt; means that Google will be able to make many important decisions for you, allowing the community to focus on what’s truly important – building apps.&lt;/p&gt;

&lt;p&gt;Flutter came with a complete toolchain and a beautiful Material Design-like set of widgets that developers can reuse in their apps. Google has also created a number of integrations with 3rd party libraries such as image-processing libraries for handling images in an efficient way, &lt;a href="https://backendless.com/sql-vs-nosql-database-a-complete-comparison/"&gt;SQL databases&lt;/a&gt; (made accessible through abstractions), and text editors.&lt;/p&gt;

&lt;p&gt;All of this is presented to developers as a cohesive package that has been designed with speed, ease of use, productivity, and performance in mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="pros-and-cons"&gt;&lt;/a&gt;Pros and cons of Flutter and React Native Apps
&lt;/h2&gt;

&lt;p&gt;Apps created with Flutter are indistinguishable from native ones. They come with the same performance and the same look &amp;amp; feel (apart from some platform-specific stylistic aspects).&lt;/p&gt;

&lt;p&gt;The main issues that people usually complain about when building apps using React Native are related to its runtime environment, which is heavier than managing separate processes for each architecture. This means that you will not be able to pull off a pure native app performance using React Native, although you can get close.&lt;/p&gt;

&lt;p&gt;Flutter does not come with the same benefits as React Native in terms of supporting existing JavaScript codebases and allowing reuse of some components shared between apps for iOS and Android.&lt;/p&gt;

&lt;p&gt;Now, let’s dive a little deeper into the technical pros and cons of these two frameworks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wXQ4D43v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/01/Flutter-and-React-Native-Pros-and-Cons.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wXQ4D43v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2022/01/Flutter-and-React-Native-Pros-and-Cons.png" alt="Flutter and React Native Pros and Cons" width="600" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros and cons in terms of native performance
&lt;/h3&gt;

&lt;p&gt;React Native comes with an improved JavaScript virtual machine that is faster than V8 thanks to its JIT compiler. It also benefits from being an ahead-of-time compiled framework, which means that you are free to ship whatever codebase you need because it will be compiled into a native executable.&lt;/p&gt;

&lt;p&gt;In practice, React Native is as fast as pure native apps because it can achieve the same performance of an iOS app without requiring any changes to the iOS build settings.&lt;/p&gt;

&lt;p&gt;Flutter comes with its own Ahead-of-time compiler that will emit optimized code for both iOS and Android once you have built your project. You get native performance without having to ship the whole codebase in your application binary just like with React Native.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros and cons in terms of app size
&lt;/h3&gt;

&lt;p&gt;React Native apps usually come with a JavaScript runtime that weighs about 300kb gzipped, although it is possible to reduce this number by tweaking some options such as Bypass filling (which will force React Native to skip a process of filling its virtual DOM with the result of diffing it against the native UI) as well as by setting useDeveloperMode to true (which will resize images in memory and reduce their quality).&lt;/p&gt;

&lt;p&gt;Flutter comes with an ahead-of-time compiler that allows developers to ship only the codebase needed for the app they are building without having to bundle anything with it.&lt;/p&gt;

&lt;p&gt;It is possible to run Flutter inside an existing JavaScript VM if you want to, which will allow you to save on the space needed for your app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros and cons in terms of minimal required SDK version
&lt;/h3&gt;

&lt;p&gt;React Native can usually be built against any iOS 9+ or Android 5.0+ SDK without any problem, but it goes without saying that to achieve the best performance you should target the latest SDK versions available at the time of your release.&lt;/p&gt;

&lt;p&gt;In practice, React Native apps can be built against older iOS and Android SDKs with a limited set of features being available at runtime, although to get all the features you should still target the latest SDK versions available.&lt;/p&gt;

&lt;p&gt;Flutter apps can be built against Android version 21 (Lollipop) and newer, although it is recommended to build against the latest SDK versions available for best performance.&lt;/p&gt;

&lt;p&gt;Flutter can be run on iOS 8 or newer but calling some APIs may result in runtime crashes given that Apple has deprecated most of the APIs that Flutter uses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros and cons in terms of UI development
&lt;/h3&gt;

&lt;p&gt;Flutter comes with its own set of widgets for rendering the UI, which means that you can reuse existing iOS or Android code when building Flutter apps.&lt;/p&gt;

&lt;p&gt;Some third party libraries are available for making it easier to reuse existing native components, although this is still a work in progress as it is not easy to map Flutter widgets to existing iOS and Android UI components.&lt;/p&gt;

&lt;p&gt;React Native comes with a bridge that allows you to reuse existing iOS and Android code as JavaScript modules as well as exposing some APIs for manually creating the bridge between your native UI components and the JavaScript code that will handle rendering them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros and cons in terms of debugging
&lt;/h3&gt;

&lt;p&gt;React Native comes with its own debugger that can be attached to your running app on iOS and Android, which provides developers with a preview of the current state of the JavaScript virtual machine along with various tools for inspecting memory usage or tweaking some options on the fly.&lt;/p&gt;

&lt;p&gt;Flutter comes with its own debugger as well, which can be attached to your running app on iOS and Android providing developers with a preview of the current state of the rendering engine as well as various tools for inspecting memory usage or tweaking some options on the fly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros and cons in terms of code reuse between mobile platforms
&lt;/h3&gt;

&lt;p&gt;React Native comes with its own set of APIs that can be used when developing both iOS and Android. Although most companies using React Native will develop their apps on one platform first (usually iOS) before porting them to the other platform, it is also possible to write shared components between your iOS and Android applications if you so wish.&lt;/p&gt;

&lt;p&gt;Flutter apps are built with code that is platform specific, so it is not possible to share any code between your iOS and Android application. However, third party libraries are available for making it easier to reuse existing native components.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="easier-to-learn"&gt;&lt;/a&gt;Is Flutter or React Native easier to learn?
&lt;/h2&gt;

&lt;p&gt;Both React Native and Flutter are equally easy to learn (in terms of APIs), although this will depend on the expertise of the developer. Both have a large and engaged developer community that can help new developers and is consistently creating new tools and components.&lt;/p&gt;

&lt;p&gt;For a brand new developer with little or no coding experience, we would probably recommend starting with React Native as it comes with a set of predefined components that can be used to build iOS and Android apps, which means that you can learn one thing at a time without having to worry about learning all the APIs used for rendering views.&lt;/p&gt;

&lt;p&gt;However, we would probably recommend to choose Flutter over React Native for a developer with some coding experience, as the APIs offered by Flutter are closer to what you can find in both iOS and Android.&lt;/p&gt;

&lt;p&gt;In addition, the team behind Flutter is focusing greatly on ensuring that the development experience offered by Flutter can compete with the development experience offered by the other SDKs out there (including React Native).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="backend-for-flutter"&gt;&lt;/a&gt;The Best Backend for Flutter
&lt;/h2&gt;

&lt;p&gt;It may seem that a &lt;a href="https://backendless.com/what-is-mobile-backend-as-a-service-mbaas/"&gt;Backend as a Service (BaaS)&lt;/a&gt; like &lt;a href="https://backendless.com/backendless-vs-firebase/"&gt;Google’s own Firebase&lt;/a&gt; would be the best choice for supporting a Flutter app, but the reality is quite different.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backendless.com/best-backend-for-flutter-web/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dtFjovaj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://backendless.com/wp-content/uploads/2020/07/Best-Backend-for-Flutter-Web-Feature-600x387.png" alt="Best Backend for Flutter Web" width="600" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Backendless provides a much more complete and affordable &lt;a href="https://backendless.com/best-backend-for-flutter-web/"&gt;backend solution for Flutter apps&lt;/a&gt;. The &lt;a href="https://backendless.com/developers/#flutter"&gt;Backendless Flutter SDK&lt;/a&gt; enables you to interact not only with Flutter mobile apps, but also with Flutter Web, designed for web and desktop apps.&lt;/p&gt;

&lt;p&gt;Backendless includes all of the elements necessary for a complete and scalable backend. These features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/backendless-database"&gt;Secure real-time database&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/user-management/"&gt;User authentication and user management&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/cloud-code"&gt;Server-side business logic (Cloud Code) including timers and event handlers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/backendless-core/pub-sub-messaging"&gt;Pub-sub messaging capabilities&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://backendless.com/features/user-engagement/push-notifications"&gt;Push notifications for both Android and iOS&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a id="backend-for-react-native"&gt;&lt;/a&gt;The Best Backend for React Native
&lt;/h2&gt;

&lt;p&gt;Unlink Flutter, there is no “on brand” backend for React Native. Similar to Flutter, however, React Native apps integrate very effectively with BaaS platforms like Backendless.&lt;/p&gt;

&lt;p&gt;The same features Backendless provides for Flutter developers are available for React Native developers to include as well. For a React Native developer looking to maximize their development efficiency, BaaS solutions can take a large portion of backend development tasks off of your hands, allowing you to focus on producing the best UI and UX possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="flutter-vs-react-native"&gt;&lt;/a&gt;Flutter vs. React Native in 2022
&lt;/h2&gt;

&lt;p&gt;React Native came out in 2015 and since then it has been used by many companies. The JavaScript world changes very fast so React Native has also evolved over time to include new features thanks to the contributions of the open source community.&lt;/p&gt;

&lt;p&gt;Flutter is a much newer technology that can feel quite alien if you are coming from the Android or iOS world. Google has put a lot of effort on making it extremely easy to learn, so most people that are familiar with iOS or Android development should be able to pick it up in no time.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a id="closing"&gt;&lt;/a&gt;Closing
&lt;/h2&gt;

&lt;p&gt;Flutter and React Native are both excellent choices for cross-platform application development. While they share some similarities, there are also some key differences that you should be aware of before deciding which one to use.&lt;/p&gt;

&lt;p&gt;Choosing the right cross-platform framework for your business application or startup app idea depends largely on your development experience, development team, and which native elements your project needs to access.&lt;/p&gt;

&lt;p&gt;We hope this article will help you make an informed decision about which framework is right for your next project.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a id="faqs"&gt;&lt;/a&gt;Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is the difference between web development and mobile development?
&lt;/h3&gt;

&lt;p&gt;Web development and mobile development both create online and offline applications, but they do it in different ways. Mobile apps require a mobile operating system such as iOS or Android to run whereas web apps can run on any device with a web browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Flutter?
&lt;/h3&gt;

&lt;p&gt;Flutter is an open source mobile application development framework created by Google. It allows developers to build native mobile apps for Android and iOS from a single codebase.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is React Native?
&lt;/h3&gt;

&lt;p&gt;React Native is an open source mobile app development framework created by Facebook. It allows developers to build native mobile apps for Android and iOS from a single codebase.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can React Native be used to develop apps for the web?
&lt;/h3&gt;

&lt;p&gt;No, React Native is a framework for creating native mobile apps &lt;br&gt;
only. However, React Native is the mobile equivalent of ReactJs, which is a popular framework for creating web applications. &lt;a href="https://upstack.co/knowledge/what-is-the-difference-between-reactjs-and-reactnative"&gt;This article&lt;/a&gt; compares the two in detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Flutter be used to develop apps for the web?
&lt;/h3&gt;

&lt;p&gt;Yes. Flutter supports the use of standards-based web technologies such as HTML, CSS, and JavaScript to generate web content. With the web support, you may compile existing Flutter code written in Dart into a browser client experience that is hosted on any website and deployed to any web server.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on &lt;a href="https://backendless.com/flutter-vs-react-native-which-is-better-in-2022/"&gt;backendless.com&lt;/a&gt; on January 25, 2022.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>flutter</category>
      <category>mobile</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
