Learn FLUTTERFLOW with Real Code Examples
Updated Nov 23, 2025
Code Sample Descriptions
FlutterFlow Simple Todo App
// Dart code example generated by FlutterFlow
import 'package:flutter/material.dart';
class TodoApp extends StatefulWidget {
@override
_TodoAppState createState() => _TodoAppState();
}
class _TodoAppState extends State<TodoApp> {
final List<String> todos = [];
final TextEditingController controller = TextEditingController();
void addTodo() {
if(controller.text.trim().isNotEmpty) {
setState(() { todos.add(controller.text.trim()); });
controller.clear();
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Todo App')),
body: Column(
children: [
TextField(controller: controller, decoration: InputDecoration(hintText: 'New Todo')),
ElevatedButton(onPressed: addTodo, child: Text('Add')),
Expanded(
child: ListView.builder(
itemCount: todos.length,
itemBuilder: (context, index) => ListTile(title: Text(todos[index])),
),
),
],
),
);
}
}
Demonstrates a simple FlutterFlow app with a Todo list, adding tasks, and displaying them using visual components with optional custom Dart logic.
FlutterFlow Expense Tracker
import 'package:flutter/material.dart';
class ExpenseTracker extends StatefulWidget {
@override
_ExpenseTrackerState createState() => _ExpenseTrackerState();
}
class _ExpenseTrackerState extends State<ExpenseTracker> {
final List<Map<String, dynamic>> expenses = [];
final TextEditingController desc = TextEditingController();
final TextEditingController amount = TextEditingController();
double get total => expenses.fold(0, (sum, e) => sum + e['amount']);
void addExpense() {
if(desc.text.isNotEmpty && amount.text.isNotEmpty) {
setState(() {
expenses.add({'desc': desc.text, 'amount': double.parse(amount.text)});
desc.clear();
amount.clear();
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Expense Tracker')),
body: Column(
children: [
TextField(controller: desc, decoration: InputDecoration(hintText: 'Description')),
TextField(controller: amount, keyboardType: TextInputType.number, decoration: InputDecoration(hintText: 'Amount')),
ElevatedButton(onPressed: addExpense, child: Text('Add Expense')),
Text('Total: $' + total.toStringAsFixed(2)),
Expanded(
child: ListView.builder(
itemCount: expenses.length,
itemBuilder: (context, index) => ListTile(title: Text(expenses[index]['desc']), trailing: Text('$' + expenses[index]['amount'].toString())),
),
),
],
),
);
}
}
Tracks expenses with visual input fields and lists in FlutterFlow, enhanced with custom Dart code for managing total sums.
FlutterFlow Notes App
import 'package:flutter/material.dart';
class NotesApp extends StatefulWidget {
@override
_NotesAppState createState() => _NotesAppState();
}
class _NotesAppState extends State<NotesApp> {
final List<String> notes = [];
final controller = TextEditingController();
void addNote() {
if(controller.text.isNotEmpty){
setState(() => notes.add(controller.text));
controller.clear();
}
}
@override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(title: Text('Notes')),
body: Column(
children:[
TextField(controller: controller, decoration: InputDecoration(hintText: 'Write note')),
ElevatedButton(onPressed: addNote, child: Text('Add')),
Expanded(child: ListView(children: notes.map((n)=>ListTile(title: Text(n))).toList())),
]
)
);
}
}
A simple note-taking app using FlutterFlow's visual ListView and custom Dart state logic.
FlutterFlow Habit Tracker
import 'package:flutter/material.dart';
class HabitTracker extends StatefulWidget {
@override
_HabitTrackerState createState() => _HabitTrackerState();
}
class _HabitTrackerState extends State<HabitTracker> {
List<Map<String, dynamic>> habits = [
{'title': 'Drink Water', 'done': false},
{'title': 'Exercise', 'done': false}
];
void toggleHabit(int i){
setState(()=> habits[i]['done'] = !habits[i]['done']);
}
@override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(title: Text('Habit Tracker')),
body: ListView.builder(
itemCount: habits.length,
itemBuilder: (c,i)=>CheckboxListTile(
title: Text(habits[i]['title']),
value: habits[i]['done'],
onChanged: (_) => toggleHabit(i),
)
)
);
}
}
Tracks daily habits with checkboxes and FlutterFlow toggle widgets, combined with custom Dart logic.
FlutterFlow Weather App
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
class WeatherApp extends StatefulWidget {
@override
_WeatherAppState createState() => _WeatherAppState();
}
class _WeatherAppState extends State<WeatherApp> {
final controller = TextEditingController();
Map<String, dynamic>? weather;
Future<void> fetchWeather() async {
final res = await http.get(Uri.parse('https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=${controller.text}'));
setState(()=>weather=jsonDecode(res.body));
}
@override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(title: Text('Weather App')),
body: Column(children:[
TextField(controller: controller, decoration: InputDecoration(hintText:'Enter City')),
ElevatedButton(onPressed: fetchWeather, child: Text('Search')),
if(weather!=null) Text('Temp: '+weather!['current']['temp_c'].toString()+'°C')
])
);
}
}
Fetches weather data using an API and displays it using FlutterFlow visual widgets.
FlutterFlow Recipe App
import 'package:flutter/material.dart';
class RecipeApp extends StatefulWidget {
@override
_RecipeAppState createState() => _RecipeAppState();
}
class _RecipeAppState extends State<RecipeApp> {
final recipes = <String>[];
final controller = TextEditingController();
void addRecipe(){
if(controller.text.isNotEmpty){
setState(()=>recipes.add(controller.text));
controller.clear();
}
}
@override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(title: Text('Recipe App')),
body: Column(children:[
TextField(controller: controller, decoration: InputDecoration(hintText:'Recipe name')),
ElevatedButton(onPressed: addRecipe, child: Text('Add')),
Expanded(child: ListView(children: recipes.map((r)=>Card(child:ListTile(title:Text(r)))).toList())),
])
);
}
}
Manages a list of favorite recipes and displays them using FlutterFlow's ListView and Cards.
FlutterFlow Login Screen
import 'package:flutter/material.dart';
class LoginScreen extends StatefulWidget {
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final email = TextEditingController();
final pass = TextEditingController();
void login(){
if(email.text.isEmpty || pass.text.isEmpty){
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Fill all fields')));
}else{
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Login Success')));
}
}
@override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(title: Text('Login')),
body: Padding(
padding: EdgeInsets.all(16),
child: Column(children:[
TextField(controller: email, decoration: InputDecoration(labelText:'Email')),
TextField(controller: pass, obscureText: true, decoration: InputDecoration(labelText:'Password')),
ElevatedButton(onPressed: login, child: Text('Login')),
])
)
);
}
}
Demonstrates a simple login UI in FlutterFlow with custom Dart validation logic.
FlutterFlow Counter App
import 'package:flutter/material.dart';
class CounterApp extends StatefulWidget {
@override
_CounterAppState createState() => _CounterAppState();
}
class _CounterAppState extends State<CounterApp> {
int count = 0;
@override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(title: Text('Counter')),
body: Center(
child: Column(mainAxisAlignment: MainAxisAlignment.center, children:[
Text('Count: '+count.toString(), style: TextStyle(fontSize: 24)),
ElevatedButton(onPressed: ()=>setState(()=>count++), child: Text('Increment')),
ElevatedButton(onPressed: ()=>setState(()=>count--), child: Text('Decrement')),
])
)
);
}
}
A basic counter app example using FlutterFlow and custom Dart state logic.
FlutterFlow Chat Screen
import 'package:flutter/material.dart';
class ChatScreen extends StatefulWidget {
@override
_ChatScreenState createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
final List<String> messages = [];
final controller = TextEditingController();
void sendMessage(){
if(controller.text.isNotEmpty){
setState(()=>messages.add(controller.text));
controller.clear();
}
}
@override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(title: Text('Chat')),
body: Column(children:[
Expanded(child: ListView(children: messages.map((m)=>ListTile(title:Text(m))).toList())),
Row(children:[
Expanded(child: TextField(controller: controller, decoration: InputDecoration(hintText:'Message'))),
IconButton(icon: Icon(Icons.send), onPressed: sendMessage)
])
])
);
}
}
Simple chat UI showing how to send and display messages using FlutterFlow visual components.
FlutterFlow Shopping Cart
import 'package:flutter/material.dart';
class ShoppingCart extends StatefulWidget {
@override
_ShoppingCartState createState() => _ShoppingCartState();
}
class _ShoppingCartState extends State<ShoppingCart> {
final List<String> cart = [];
final TextEditingController controller = TextEditingController();
void addItem(){
if(controller.text.isNotEmpty){
setState(()=>cart.add(controller.text));
controller.clear();
}
}
void removeItem(int i){
setState(()=>cart.removeAt(i));
}
@override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(title: Text('Shopping Cart')),
body: Column(children:[
TextField(controller: controller, decoration: InputDecoration(hintText:'Add Item')),
ElevatedButton(onPressed: addItem, child: Text('Add')),
Expanded(child: ListView.builder(
itemCount: cart.length,
itemBuilder: (c,i)=>ListTile(title:Text(cart[i]), trailing: IconButton(icon:Icon(Icons.delete), onPressed:()=>removeItem(i)))
))
])
);
}
}
Demonstrates adding and removing items in a shopping cart using FlutterFlow visual elements and Dart state.