logo Flutter Markup Language

GitHub Release GitHub Stars GitHub Contributors Discord

Disclaimer

This is a commercial package. To use this package, you need comply with the FML fair source License

Why FML?

1. Faster Development → Prototype to Application

As software developers we know the importance of prototyping but the gap between a non-functional prototype, a functional prototype and an actual application is wide. Solutions either sacrificed capability or time, FML is specifically designed to be able to create a non-functional prototype skeleton which can be fleshed into a functional prototype by additional syntax/parameters. The simplicity of the language requires only modifications/tweaks to complete an application. One huge advantage of this is that pieces of the application can be at different prototyping stages depending on the development while still working as a whole application, this optimization offers a lot of flexibility for design, development and testing.

2. Lower Cost → Single Codebase

Write once, run everywhere, an age old ideal but we are confident in our no compromises approach. Quicker development, lower maintenance cost. FML has built in all the platform implementations and UI idiosyncrasies for the developer. This promotes a more uniform application relieving the developer from being an expert on each platform and removing code duplication. Furthermore everything can be modified from looks to functionality if you wish to override the default behavior.

3. Shorter Learning Curve → Simplicity without Sacrificing Power or Performance

The syntactic sugar FML provides for designing user interfaces with the functional power of data binding, logic interpretation and pre-defined events gives developers the best of both worlds. Run into a roadblock with something FML can't do? Let us know and we will make it possible. We don't believe FML should limit any application functionality, our goal is to make it faster and easier to achieve the same functionality as writing in a programming language.

Resources

1. Online

→ Visit fml.dev

→ Join the conversation on discord

→ Download and install the app

   

2. Documentation

For a full language overview of FML, check out our wiki.

3. Quick Start Guide

If you want to dive right in, have a look at our quick start guide.

4. Technical Briefs

Read published articles

5. Videos

Watch our videos

6. FML Pad (New!)

Try out FML for yourself by going to FmlPad

Installation

1. Create a new project with support for all platforms

from the commmand line, run:

$flutter create --org com.<your_domain_name> --platforms=android,ios,linux,macos,windows,web <your_app_name>
2. Open the project in your SDK (ex. Android Studio)
3. Download sample main.dart

Download and extract the sample main.dart file.

You can replace main.dart in your projects /lib folder with the main.dart from the .zip file.

4. Download supporting web files

Download the web support files and place them in your projects root level web folder. When asked to replace, choose "yes".

5. Download supporting assets

Create a new folder at the project root called "assets".

Download the supporting assets and place them in the newly created assets folder. If asked to replace, choose "yes".

6. Modify your pubspec.yaml file

Download and extract the sample pubspec.yaml file.

Modify your projects pubspec.yaml file.

a) Add the fml engine package:

fml: ^3.0.0

b) Add the assets reference

assets:
- assets/
- assets/images/
- assets/applications/

- assets/applications/example/
- assets/applications/example/images/
- assets/applications/example/templates/

- assets/applications/fmlpad/
- assets/applications/fmlpad/images/
- assets/applications/fmlpad/templates/
7. Try running your new app in the web browser

Ensure domain: example1 is set in the FmlEngine() constructor of your new main.dart file. Choose the web browser from the build options and compile and run. If all goes well, you should see the fml.dev web site running on your local host. In this example, the FML templates rendering on your local application are being servered from the fml.dev web server.

8. Try running your new app on the windows desktop (Single App Mode)

On your fml engine constructor in main.dart, change:

FmlEngine(
ApplicationType.single,
domain: example2,
...);

Choose "windows" from the build options and compile and run. If all does well, a desktop window will launch and the FML example application displayed. The templates for this application are located in your local /assets/appications/example folder. The config.xml file in this folder controls various aspects of the site and can be modified accordingly.

9. Try running your new app on the windows desktop (Multi App Mode)

On your fml engine constructor in main.dart, change:

FmlEngine(
ApplicationType.multi,
...);

Choose "windows" from the build options and compile and run. If all does well, a desktop window will launch and the store displayed with no application (empty container).

To add the same example we launched above in single app mode, click the "Add App" button, enter the url file://example and name The Example App at the appropriate prompts.

You can also add the FML PAD app by clicking the "Add App" button a second time and entering url file://fmlpad and name Fml Pad at the appropriate prompts.

Clicking on either of these buttons will lauch the application. You can use the mopsue to swipe back or add a back() btton to the template yourself.

10. Android Mobile Support

Your can download android support files

(a) Modify AndroidManifest.xml located in the /android/app/src/main folder of your application.

Add Permissions:

<uses-permission android:name="android.permission.INTERNET" android:required="true" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" />
<uses-permission android:name="android.permission.RECORD_AUDIO" android:required="true" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" android:required="true" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

Add Features:

<uses-feature android:name="android.hardware.nfc" android:required="true" />
<uses-feature android:name="android.hardware.camera" />

Add Query:

<queries>
    <intent>
    <action android:name="android.speech.RecognitionService" />
    </intent>
</queries>

Add Intent Filters:

<intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="*" />
</intent-filter>

<meta-data android:name="flutter_deeplinking_enabled" android:value="true" />
<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="fml" android:host="open" />
</intent-filter>

b) Modify your settings.gradle file (found in your projects /android root folder) plugin section to the following versions of android and kotlin

plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "7.3.0" apply false
id "org.jetbrains.kotlin.android" version "1.9.23" apply false
}

b) For ZEBRA device support, including barcode scanning and RFID, you will need to modify the projects MainActivity.kt file and add the Zebra.kt file.

Extract MainActivity.kt and Zebra.kt from the android support files package. Place these 2 files in your projects android/app/src/main/kotin/../.. subfolder where the MainActivity.kt file is currently located. When asked to replace, choose "yes".

Libraries

application/application_manager
application/application_model
application/application_view
config/config_model
connection/connection
connection/connection.mobile
connection/connection.web
crypto/crypto
data/data
data/dotnotation
datasources/base/model
datasources/beacon/beacon
datasources/beacon/beacon_model
datasources/camera/model
datasources/data/model
datasources/datasource_interface
datasources/datasource_listener_interface
datasources/detectors/barcode/barcode_detector
datasources/detectors/barcode/barcode_detector.mobile
datasources/detectors/barcode/barcode_detector.web
datasources/detectors/barcode/barcode_detector_model
datasources/detectors/biometrics/biometrics_detector
datasources/detectors/biometrics/biometrics_detector.mobile
datasources/detectors/biometrics/biometrics_detector.stub
datasources/detectors/biometrics/biometrics_detector.web
datasources/detectors/biometrics/biometrics_detector_model
datasources/detectors/detector_interface
datasources/detectors/detector_model
datasources/detectors/image/detectable_image.mobile
datasources/detectors/image/detectable_image.stub
datasources/detectors/image/detectable_image.web
datasources/detectors/text/text_detector
datasources/detectors/text/text_detector.mobile
datasources/detectors/text/text_detector.stub
datasources/detectors/text/text_detector.web
datasources/detectors/text/text_detector_model
datasources/file/file
datasources/file/file.base
datasources/file/file.mobile
datasources/file/file.web
datasources/file/model
datasources/gps/gps
datasources/gps/gps_listener_interface
datasources/gps/gps_model
datasources/gps/payload
datasources/http/delete/model
datasources/http/get/model
datasources/http/http
datasources/http/model
datasources/http/patch/model
datasources/http/post/model
datasources/http/put/model
datasources/log/log_model
datasources/mqtt/mqtt.mobile
datasources/mqtt/mqtt.web
datasources/mqtt/mqtt_interface
datasources/mqtt/mqtt_listener_interface
datasources/mqtt/mqtt_model
datasources/mqtt/payload
datasources/nfc/nfc
datasources/nfc/nfc_listener_interface
datasources/nfc/nfc_model
datasources/nfc/payload
datasources/socket/socket
datasources/socket/socket_listener_interface
datasources/socket/socket_model
datasources/sse/lib/src/channel
datasources/sse/lib/src/connect
datasources/sse/lib/src/connect.mobile
datasources/sse/lib/src/connect.web
datasources/sse/lib/src/transformer
datasources/sse/model
datasources/sse/sse.mobile
datasources/sse/sse.web
datasources/stash/stash_model
datasources/test/test_data_model
datasources/transforms/calc
datasources/transforms/crop
datasources/transforms/distinct
datasources/transforms/eval
datasources/transforms/filter
datasources/transforms/flip
datasources/transforms/format
datasources/transforms/grayscale
datasources/transforms/image_transform_model
datasources/transforms/pivot
datasources/transforms/resize
datasources/transforms/sort
datasources/transforms/subquery
datasources/transforms/transform_interface
datasources/transforms/transform_model
datasources/zebra/model
datasources/zebra/wedge
dialog/alert
dialog/manager
emoji
eval/eval
eval/evaluator
eval/expressions
eval/parser
eval/text_parser
event/event
event/handler
event/manager
fml
graphics
helpers/bit
helpers/color
helpers/helpers
helpers/image
helpers/json
helpers/map
helpers/mime
helpers/string
helpers/template
helpers/time
helpers/uri
helpers/xml
hive/data
hive/database
hive/form
hive/log
hive/post
hive/settings
hive/stash
hive/theme
hive/user
janitor/janitor
javascript/javascript
log/manager
mirror/asset
mirror/mirror
navigation/page
navigation/parser
observable/binding
observable/blob
observable/observable
observable/observable_barrel
observable/observables/boolean
observable/observables/color
observable/observables/double
observable/observables/icon
observable/observables/integer
observable/observables/list
observable/observables/numeric
observable/observables/string
observable/scope
observable/scope_manager
phrase
platform/platform.stub
platform/platform.vm
platform/platform.web
postmaster/postmaster
postmaster/postmaster_isolates
sound/sound
splash/splash
store/store_app_view
store/store_model
store/store_view
system
template/template
template/template_manager
test/view
theme/model
theme/theme
token/token
user/user_model
widgets/alarm/alarm_model
widgets/alignment/alignment
widgets/animation/animation_child/animation_child_model
widgets/animation/animation_child/fade/fade_transition_model
widgets/animation/animation_child/fade/fade_transition_view
widgets/animation/animation_child/flip/flip_card_model
widgets/animation/animation_child/flip/flip_card_view
widgets/animation/animation_child/rotate/rotate_transition_model
widgets/animation/animation_child/rotate/rotate_transition_view
widgets/animation/animation_child/scale/scale_transition_model
widgets/animation/animation_child/scale/scale_transition_view
widgets/animation/animation_child/size/size_transition_model
widgets/animation/animation_child/size/size_transition_view
widgets/animation/animation_child/slide/slide_transition_model
widgets/animation/animation_child/slide/slide_transition_view
widgets/animation/animation_child/transform/transform_model
widgets/animation/animation_child/transform/transform_view
widgets/animation/animation_child/tween/tween_model
widgets/animation/animation_child/tween/tween_view
widgets/animation/animation_helper
widgets/animation/animation_model
widgets/animation/animation_view
widgets/box/box_constraints
widgets/box/box_data
widgets/box/box_layout
widgets/box/box_mixin
widgets/box/box_model
widgets/box/box_view
widgets/box/decoration/decoration_clipper
widgets/box/decoration/labelled_box
widgets/box/flex/flex_object
widgets/box/flex/flex_renderer
widgets/box/stack/stack_object
widgets/box/stack/stack_renderer
widgets/box/wrap/wrap_object
widgets/box/wrap/wrap_renderer
widgets/busy/busy_model
widgets/busy/busy_view
widgets/button/button_model
widgets/button/button_view
widgets/camera/camera_model
widgets/camera/camera_view
widgets/camera/stream/stream
widgets/camera/stream/stream.mobile
widgets/camera/stream/stream.web
widgets/card/card_model
widgets/center/center_model
widgets/chart/axis/chart_axis_model
widgets/chart/chart_model
widgets/chart/chart_view
widgets/chart/label/chart_label_model
widgets/chart/series/chart_series_model
widgets/chart_painter/axis/chart_axis_model
widgets/chart_painter/bar/bar_chart_model
widgets/chart_painter/bar/bar_chart_view
widgets/chart_painter/bar/bar_series
widgets/chart_painter/chart_model
widgets/chart_painter/line/line_chart_model
widgets/chart_painter/line/line_chart_view
widgets/chart_painter/line/line_series
widgets/chart_painter/pie/pie_chart_model
widgets/chart_painter/pie/pie_chart_view
widgets/chart_painter/pie/pie_series
widgets/chart_painter/series/chart_series_extended
widgets/chart_painter/series/chart_series_model
widgets/chart_painter/zoom_chart
widgets/chart_syncfusion/axis/chart_axis_model
widgets/chart_syncfusion/chart_model
widgets/chart_syncfusion/chart_view
widgets/chart_syncfusion/excerpts/functions
widgets/chart_syncfusion/series/chart_series_model
widgets/checkbox/checkbox_model
widgets/checkbox/checkbox_view
widgets/colorpicker/colorpicker_model
widgets/colorpicker/colorpicker_view
widgets/column/column_model
widgets/datepicker/datepicker_model
widgets/datepicker/datepicker_view
widgets/dragdrop/drag_drop_interface
widgets/dragdrop/dragdrop
widgets/dragdrop/draggable_view
widgets/dragdrop/droppable_view
widgets/drawer/drawer_model
widgets/drawer/drawer_view
widgets/drawer/item/drawer_item_model
widgets/editor/editor_model
widgets/editor/editor_view
widgets/field/field_model
widgets/filepicker/filepicker_mobile_view
widgets/filepicker/filepicker_model
widgets/filepicker/filepicker_view
widgets/filepicker/filepicker_web_view
widgets/form/decorated_input_model
widgets/form/form_field_interface
widgets/form/form_field_model
widgets/form/form_interface
widgets/form/form_model
widgets/form/form_view
widgets/framework/framework_model
widgets/framework/framework_view
widgets/gesture/gesture_model
widgets/gesture/gesture_view
widgets/goback/goback
widgets/googlemap/location/map_location_model
widgets/googlemap/map_model
widgets/googlemap/map_view
widgets/grid/grid_model
widgets/grid/grid_view
widgets/grid/item/grid_item_model
widgets/grid/item/grid_item_view
widgets/header/header_model
widgets/icon/icon_model
widgets/icon/icon_view
widgets/iframe/inline_frame_mobile_view
widgets/iframe/inline_frame_model
widgets/iframe/inline_frame_view
widgets/iframe/inline_frame_web_view
widgets/image/image_model
widgets/image/image_view
widgets/input/input_formatters
widgets/input/input_model
widgets/input/input_view
widgets/list/item/list_item_model
widgets/list/item/list_item_view
widgets/list/list_model
widgets/list/list_view
widgets/map/map_model
widgets/map/map_view
widgets/map/marker/map_marker_model
widgets/measure/measure_view
widgets/option/option_model
widgets/option/tag_model
widgets/padding/padding_model
widgets/padding/padding_view
widgets/pager/page/page_model
widgets/pager/pager_model
widgets/pager/pager_view
widgets/popover/item/popover_item_model
widgets/popover/popover_model
widgets/popover/popover_view
widgets/positioned/positioned_model
widgets/prototype/prototype_model
widgets/radio/radio_model
widgets/radio/radio_view
widgets/row/row_model
widgets/scribble/scribble_model
widgets/scribble/scribble_view
widgets/scroller/scroller_behavior
widgets/scroller/scroller_interface
widgets/scroller/scroller_model
widgets/scroller/scroller_shadow_view
widgets/scroller/scroller_view
widgets/scrollshadow/scroll_shadow_model
widgets/scrollshadow/scroll_shadow_view
widgets/select/select_model
widgets/select/select_view
widgets/shortcut/shortcut_model
widgets/slider/slider_model
widgets/slider/slider_view
widgets/span/span_model
widgets/span/span_view
widgets/splitview/split_view_model
widgets/splitview/split_view_view
widgets/stack/stack_model
widgets/switch/switch_model
widgets/switch/switch_view
widgets/table/nodata_model
widgets/table/table_header_cell_model
widgets/table/table_header_group_model
widgets/table/table_header_model
widgets/table/table_model
widgets/table/table_row_cell_model
widgets/table/table_row_model
widgets/table/table_view
widgets/tabview/tab_model
widgets/tabview/tab_view
widgets/text/text_model
widgets/text/text_view
widgets/theme/theme_model
widgets/theme/theme_view
widgets/timer/timer_model
widgets/tooltip/v1/tooltip_model
widgets/tooltip/v1/tooltip_view
widgets/tooltip/v2/src/arrow
widgets/tooltip/v2/src/bubble
widgets/tooltip/v2/src/element_box
widgets/tooltip/v2/src/paint/corner
widgets/tooltip/v2/src/paint/triangle
widgets/tooltip/v2/src/position_manager
widgets/tooltip/v2/src/tooltip_elements_display
widgets/tooltip/v2/tooltip_model
widgets/tooltip/v2/tooltip_view
widgets/treeview/node/tree_node_model
widgets/treeview/node/tree_node_view
widgets/treeview/tree_model
widgets/treeview/tree_view
widgets/trigger/condition/trigger_condition_model
widgets/trigger/trigger_model
widgets/typeahead/typeahead_model
widgets/typeahead/typeahead_view
widgets/variable/variable_model
widgets/video/ivideo_player
widgets/video/video_model
widgets/video/video_view
widgets/viewable/viewable_widget_mixin
widgets/viewable/viewable_widget_model
widgets/widget/widget_model
widgets/widget/widget_model_interface
widgets/widget/widget_state
widgets/widget/widget_view_interface