rapido 0.2.4

rapido #

Rapido brings Rapid Application Development principles to mobile development, currently available for Flutter.

Introduction #

Rapido makes it simple to build document centric applications by:

  1. Providing DocumentList and Document classes that makes it easy to manage user data, including persistence.
  2. Provides many of the UI elements that you need to work with DocumentList, including ListViews, Forms, Maps, and other widgets. They know how to work with DocumentList so provide a ton of functionality with almost no additional coding.
  3. The ability to easily customize the core widgets provided.

Show Me #

Create a DocumentList and defining labels for fields, and then create a DocumentListScaffold like this:

class _MyHomePageState extends State<MyHomePage> {
  DocumentList taskList = DocumentList("Tarea",
      labels: {"Date": "date", "Task": "task", "Priority": "pri count"});

  Widget build(BuildContext context) {
    return DocumentListScaffold(taskList);

The rapido widgets infer what kind data is in each field based on the field name. Basic CRUD functionality is automatically created: add button, forms, listview, edit and delete, sorting

Rapido also handles specialized data types: pickers, and maps

You can replace any widget with your own widget, or you can use built in customization hooks to quickly create your own look and feel.

Rapido Online #

A Closer Look #

Overview of Using DocumentList #

DocumentList lies at the core of the R.A.D. experience. By simply using a list, you get:

  1. Local persistence of objects.
  2. Default CRUD UI that your users can use for displaying, creating, editing, and deleting documents in the list.

Importing #

Everything you need is in rapido.dart:

import 'package:rapido/rapido.dart';

This import includes DocumentList itself, and all of the UI elements that work on it.

DocumentList #

To create a DocumentList, all that is required is to include a "documentType" string. This string is used by DocumentList to organize its documents. Then you can add documents to it by simply passing in maps of type Map<String, dynamic>.

DocumentList taskList = DocumentList("tasks");
taskList.add(Document(initialValues: {"name":"grocery shopping", "priority": 1, "done": false}));

Notice that the maps use a string of a key, but the values are dynamic. You can store anything you like in the DocumentList.

You can modify and delete documents using normal list functionality.

taskList[0]  = Document(initialValues: {"name":"grocery shopping", "priority": 1, "done": true});

You can delete them:


Note that all changes to the DocumentList are automatically persisted to the user's phone! The user can close the app, and when they reopen them, the data is still right there.

UI Elements #

After creating a DocumentList, you can use it in a variety of UI elements supplied by Rapido. By simply passing in a DocumentList, the widgets can figure out themselves what functionality to display to users.

For exampe, if you want to easily create an application that supports adding, removing, and editing documents, you can use the DocumentListScaffold class.

DocumentListScaffold(taskList, title:"Task List");

DocumentListView will create a ListView to display and edit the items in the list. It also offers several custimazation options, but the defautls "just work."


DocumentListMapView will display any documents with a field called "latlong" on a map:


DocumentForm allows easy creation of new documents, or editing of existing ones.

To create a new document:


To edit an existing one:

DocumentForm(taskList, index: 0);

Feedback Welcome #

Rapido is undergoing rapid development. Please visit our Github repo to log any issues or features requests. Of course, pull requests are most welcome.

[0.2.4] - 2020-02-16

  • Fix code formatting in library

[0.2.3] - 2020-02-16

  • Updated DateTimeFormFieldPicker depency to latest

[0.2.2] - 2020-02-16

  • Added SecretsPersistenceProvider to use device secrets store.
  • Added secrets input type, any field ending in "secret" will get a password form field for editing and display.
  • Moved project to Gitlab

[0.2.1] - 2020-01-25

  • Removed unused UserPage code

[0.2.0] - 2020-01-25

  • Removed package dependency warnings by explcitly declaring dependencies
  • Removed experimental code for Parse Server support

[0.1.9] - 2019-03-24

  • Fix depencencies

[0.1.8] - 2019-03-24

  • Added PersistenceProvider class to the API
  • Support Document and DocumentList without persistence by including a null PersistenceProvicder
  • Experimental support for Parse Server

[0.1.7] - 2019-02-17

  • Changed all FieldOptions constuctor arguments into name parameters.
  • Changed InputListFieldOptions to take a DocumentList rather than a string for documentType.
  • These are both breaking changes.

[0.1.6] - 2019-02-05

  • Cleaned up empty statement
  • Added missing API documentation

[0.1.5] - 2019-01-31

  • Added "amount" TypedInput field. Any field name ending in amount will be assumed to be a double.
  • Add a character white list to the defuault integer input field, which restricts characters other than digits being entered.

[0.1.4] - 2019-01-30

  • Changed fieldOptions to a dart class. This is a breaking change.
  • Added ListInput field options for optionally rendering an input field as a spinning picker list.

[0.1.3] - 2019-01-26

  • Add fieldOptions with support for customizing IntegerFields and Date and DateTime fields.
  • Removed dateFormat and dateTimeFormat properties from TypedInputFields because that is not supported by fieldOptions. This is a breaking change. If you were using those properties, you need to migrate your code to use fieldOptions instead.

[0.1.2] - 2019-01-21

  • Removed @required from DocumentListScaffold.titleKeys.

[0.1.1] - 2019-01-21

  • Added API documentation to TypedDisplayField

[0.1.0] - 2019-01-21

  • Added ChangeNotifier to Document and DocumentList classes. This is a breaking change. The onChanged property is no longer supported. Use addListener instead.
  • Added formDecoration, formFieldDecoration, documentPageDecoration, and documentFieldDecoration properties to DocumentListScaffold, DocumentList and related widgets to provide more easy of use use and depth in customizing the look and feel of an app.

[0.0.14] - 2019-01-06

  • Added an image formfield that will automatically provide an image picker that can allow choosing directly from the camera, from the gallery, or entering a link.
  • Added TypedDisplay fields, so that you can pass any field from a DocumentList and rapido will do its best to display it. Currently provides supprt for images (either form the device of a url), maps, and otherwise strings.
  • Enhanced DocumentForm so that the map picker and the image picker are embedded in the form rather than popping up separate dialogs.
  • Added 'text' to inferred types. Field names ending in 'text' will be rendered with a multi-line input field.
  • Added DocumentListPageView class for paging through DocumentViews.
  • Added scroll direction option to DocumentListView. If you set ScrollDirection = Axis.horizontal, you must pass in a customItemBuilder as well, or this property will be ignored.
  • Breaking change: remaned "map point" to "latlong." In order to add map functionality to your application, you need to change field names to end in "latlong."
  • Breaking change: renamed the library from "documents" to "rapido. So, you must change your imports to: import 'package:rapido/rapido.dart';

[0.0.13] - 2018-12-09

  • Changed DocumentListMapView to set it's starting camera based on the Documents in the list, unless the developer supplied explicit coordinates.
  • Use numbered keyboard with map points.
  • Fixed a bug with location form.

[0.0.12] - 2018-12-08

  • Changed DocumentListView so that a field named "subtitle" is automatically used as a subtitle.
  • Small updates to API documentation.
  • Wrote and posted tutorial documentation.

[0.0.11] - 2018-12-02

  • Added DocumentListMapView which displays a DocumentList on a map.
  • Added a DocumentPage which renders a readonly pageview of a Document.

[0.0.10] - 2018-11-24

  • Add a specific Document class that inherits from MapBase<String, dynamic>. Most code should not be effected by this, but this is a breaking change for many of the functions on DocumentList. For example, DocumentList.add and DocumentList.addAll must be updated to create a Docuent: documentList.add(Document(initialValues: {"field1":"value1})). This change is in preparation to improve the usability of working with Documents and DocumentLists.
  • Changed "document_list.dart" to just "documents.dart". this is a breaking change. You must now import 'package:rapido/documents.dart' instead of 'package:rapido/document_list.dart'.
  • Changed the interface for DocumentListView.customItemBuilder to include the document itself, and the build context.
  • Some small bug fixes

[0.0.9] - 2018-11-24

  • Added datetime field support in TypedInputField. Requires that the string be in a specific format ("EEE, MMM d, y H:mm:s"). This can be overridden by passing in a custom dateTimeFormat string when creating the TypedInputField. Date field now supports custom date formats as well. More work is required to enhance the usability of this part of the API, but the current API is

[0.0.8] - 2018-11-23

  • Updated README with a more clear explanation of the project
  • Add the ability to include a label with the add document fab

[0.0.7] - 2018-11-20

  • Removed required title parameter from DocumentListScaffold

[0.0.6] - 2018-11-19

  • Adding a sorting button widget

[0.0.5] - 2018-11-19

  • Added more examples to example/
  • added DocumentList.sortByField() to simplify sorting

[0.0.4] - 2018-11-17

[0.0.1] - 2018-11-14

  • Initial relese with DocumentList and related classes
  • Document persistence handled by writing json files as first implementation


import 'package:flutter/material.dart';
import 'package:rapido/rapido.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Rapido Demo',
      home: RapidoExample(title: 'Rapdio'),

class RapidoExample extends StatefulWidget {
  RapidoExample({Key key, this.title}) : super(key: key);
  final String title;

  _RapidoExampleState createState() => _RapidoExampleState();

class _RapidoExampleState extends State<RapidoExample> {
  // Create a Document with a documentType string of your choice.
  // Include a map of lables for the fields in the document type.
  final DocumentList documentList = DocumentList(
    "task list",
    labels: {
      "Complete": "done?",
      "Date": "date",
      "Title": "title",
      "Note": "subtitle",
      "Priorty": "pri count"

  // Build a DocumentListScaffold to provide the UI for users to
  // create, edit, and delete documents
  Widget build(BuildContext context) {
    return DocumentListScaffold(
      title: "Tasks",

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:

  rapido: ^0.2.4

2. Install it

You can install packages from the command line:

with Flutter:

$ flutter pub get

Alternatively, your editor might support flutter pub get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:

import 'package:rapido/rapido.dart';
Describes how popular the package is relative to other packages. [more]
Code health derived from static analysis. [more]
Reflects how tidy and up-to-date the package is. [more]
Weighted score of the above. [more]
Learn more about scoring.

We analyzed this package on Feb 21, 2020, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.7.1
  • pana: 0.13.5
  • Flutter: 1.12.13+hotfix.7

Health suggestions

Fix lib/src/persistence.dart. (-1.99 points)

Analysis of lib/src/persistence.dart reported 4 hints:

line 51 col 56: The member 'notifyListeners' can only be used within instance members of subclasses of 'package:flutter/src/foundation/change_notifier.dart'.

line 51 col 56: The member 'notifyListeners' can only be used within 'package:flutter/src/foundation/change_notifier.dart' or a test.

line 137 col 46: The member 'notifyListeners' can only be used within instance members of subclasses of 'package:flutter/src/foundation/change_notifier.dart'.

line 137 col 46: The member 'notifyListeners' can only be used within 'package:flutter/src/foundation/change_notifier.dart' or a test.


Package Constraint Resolved Available
Direct dependencies
Dart SDK >=2.0.0-dev.68.0 <3.0.0
datetime_picker_formfield ^1.0.0 1.0.0
flutter 0.0.0
flutter_secure_storage ^3.3.1+1 3.3.1+1
google_maps_flutter ^0.5.21+15 0.5.24+1
image_picker ^0.6.2+3 0.6.3+4
intl >=0.15.0 <1.0.0 0.16.1
location ^2.3.5 2.4.0
numberpicker ^1.1.0 1.1.0
parse_server_sdk ^1.0.24 1.0.25
passwordfield ^0.0.5 0.0.5
path ^1.6.4 1.6.4
path_provider ^1.5.1 1.6.1
validators ^2.0.0 2.0.0+1
Transitive dependencies
async 2.4.0
charcode 1.1.3
collection 1.14.11 1.14.12
connectivity 0.4.8+1
connectivity_macos 0.1.0+1
connectivity_platform_interface 1.0.3
convert 2.1.1
crypto 2.1.4
devicelocale 0.2.1
flutter_plugin_android_lifecycle 1.0.6
flutter_web_plugins 0.0.0
http 0.12.0+4
http_parser 3.1.3
infinite_listview 1.0.1+1
meta 1.1.8
package_info 0.4.0+14
pedantic 1.9.0
platform 2.2.1
plugin_platform_interface 1.0.2
sembast 2.2.0
shared_preferences 0.5.6+2
shared_preferences_macos 0.0.1+6
shared_preferences_platform_interface 1.0.3
shared_preferences_web 0.1.2+4
sky_engine 0.0.99
source_span 1.6.0
stream_channel 2.0.0
string_scanner 1.0.5
synchronized 2.2.0
term_glyph 1.1.0
typed_data 1.1.6
uuid 2.0.4
vector_math 2.0.8
web_socket_channel 1.1.0
xxtea 2.0.2
Dev dependencies
test ^1.5.1