Build a property listing app with a toggleable map and list view, advanced filters for property type, price range, and bedrooms, and a detail page with an image gallery PageView. Properties are stored in Firestore with geolocation data for map markers. Users can save favorites to a subcollection, and each listing links to an agent contact card with a Schedule Tour button that creates an appointment document.
Building a Real Estate Listing App in FlutterFlow
This tutorial guides you through building a property listing app with browsing, filtering, and bookmarking. Users can switch between a Google Maps view with property markers and a card-based list view. Filters let them narrow results by type, price, and bedrooms. Each property has a detail page with an image gallery, specs, and agent contact information. This is ideal for real estate agencies, property management companies, and rental platforms.
Prerequisites
- A FlutterFlow project with Firestore configured
- Google Maps API key added in FlutterFlow settings
- Basic understanding of Backend Queries and ListView in FlutterFlow
- Sample property documents in Firestore with lat/lng fields
Step-by-step guide
Create the Firestore data model for properties and saved listings
Create the Firestore data model for properties and saved listings
Create a properties collection with fields: title (String), price (double), propertyType (String: house, apartment, condo), bedrooms (int), bathrooms (int), sqft (int), address (String), lat (double), lng (double), images (String array of URLs), description (String), agentId (String), status (String: active, pending, sold), listedAt (Timestamp). Create a users/{uid}/saved_properties subcollection with fields: propertyId (String), savedAt (Timestamp). Add 8-10 sample property documents with varied types, prices, and locations for testing.
Expected result: Firestore contains a properties collection and a saved_properties subcollection structure ready for queries.
Build the search page with map and list toggle
Build the search page with map and list toggle
Create a SearchPage. Add Page State: viewMode (String, default 'list'). At the top, place a Row with filter icons and a toggle IconButton that switches viewMode between 'list' and 'map'. Use Conditional Visibility to show either a FlutterFlowGoogleMap or a ListView based on viewMode. For the map, bind markers to the properties Backend Query using lat and lng fields, with a snippet showing price. For the list, display property cards with the first image, title, price, bedrooms, and bathrooms in a compact Row layout.
Expected result: Users can toggle between a Google Maps marker view and a scrollable card list of properties.
Add property filters with ChoiceChips, Slider, and DropDown
Add property filters with ChoiceChips, Slider, and DropDown
Add a filter panel as a Bottom Sheet. Include: propertyType ChoiceChips (House, Apartment, Condo, All), a price range Slider with min and max handles, a bedrooms DropDown (Any, 1+, 2+, 3+, 4+), and a sort DropDown (Price Low to High, Price High to Low, Newest, Largest). Store selections in Page State activeFilters Map. On Apply, compose the Firestore query with chained where clauses: propertyType equals selected (or skip if All), price >= min, price <= max, bedrooms >= selected, ordered by the chosen sort field. Add a Reset button that clears all filter values.
Expected result: Users can filter properties by type, price range, and bedrooms, and sort results by price, date, or size.
Create the property detail page with image gallery and specs
Create the property detail page with image gallery and specs
Create a PropertyDetailPage with Route Parameter propertyId. Query the property document by ID. At the top, add a PageView bound to the images array, with dot indicators showing the current image index. Below, display a specs Row with icon-label pairs for bedrooms, bathrooms, and sqft. Show the full description in a Text widget. Add an agent card Container with the agent name, photo, phone, and email fetched from an agents collection using agentId. Include a Schedule Tour button that navigates to a booking form or creates an appointment document directly.
Expected result: A detail page shows a swipeable image gallery, property specs, description, and agent contact information.
Implement the save and bookmark feature
Implement the save and bookmark feature
On the property card and detail page, add a heart IconButton. On tap, check if a document exists in users/{uid}/saved_properties with the matching propertyId. If it does not exist, create one with propertyId and savedAt timestamp. If it already exists, delete it to unsave. Use Conditional Styling to fill the heart icon red when saved. Create a SavedPage that queries the saved_properties subcollection and joins each propertyId back to the properties collection to display the saved listing cards.
Expected result: Users can bookmark properties with a heart icon and view all saved listings on a dedicated page.
Complete working example
1FIRESTORE DATA MODEL:2 properties/{propertyId}3 title: String4 price: double5 propertyType: String (house / apartment / condo)6 bedrooms: int7 bathrooms: int8 sqft: int9 address: String10 lat: double11 lng: double12 images: [url1, url2, url3]13 description: String14 agentId: String15 status: String (active / pending / sold)16 listedAt: Timestamp1718 users/{uid}/saved_properties/{docId}19 propertyId: String20 savedAt: Timestamp2122PAGE: SearchPage23 Page State: viewMode (String, default 'list'), activeFilters (Map)2425 WIDGET TREE:26 Column27 ├── Row28 │ ├── IconButton (filter → open BottomSheet)29 │ └── IconButton (toggle map/list)30 ├── Conditional Visibility (viewMode == 'map')31 │ └── FlutterFlowGoogleMap32 │ markers: properties query33 │ lat: property.lat, lng: property.lng34 │ snippet: property.price formatted35 └── Conditional Visibility (viewMode == 'list')36 └── ListView37 └── PropertyCard Component38 Image (images[0])39 Text (title)40 Text (price formatted)41 Row (bed icon + bedrooms, bath icon + bathrooms)42 IconButton (heart bookmark)4344BOTTOM SHEET: FilterPanel45 ChoiceChips (propertyType: All / House / Apartment / Condo)46 Slider (price range: min - max)47 DropDown (bedrooms: Any / 1+ / 2+ / 3+ / 4+)48 DropDown (sort: Price Low-High / High-Low / Newest / Largest)49 Row: Reset Button + Apply Button5051PAGE: PropertyDetailPage52 Route Parameter: propertyId53 Backend Query: properties doc by ID5455 WIDGET TREE:56 SingleChildScrollView57 Column58 ├── PageView (images array, dot indicators)59 ├── Row (bed/bath/sqft icon-label pairs)60 ├── Text (description)61 ├── Container (Agent Card: photo, name, phone, email)62 └── Button (Schedule Tour)Common mistakes when designing a Real Estate Listing App in FlutterFlow
Why it's a problem: Showing sold and pending properties in default search results
How to avoid: Default the Firestore query to where status == 'active'. Add an optional Include Sold toggle for market research use cases.
Why it's a problem: Not adding a Google Maps API key before using FlutterFlowGoogleMap
How to avoid: Go to FlutterFlow Settings, add your Google Maps API key for both Android and iOS platforms, and enable the Maps SDK in Google Cloud Console.
Why it's a problem: Loading all property images at full resolution in the ListView
How to avoid: Use thumbnail-sized images for ListView cards and full-resolution images only on the detail page PageView. Store both sizes in Firebase Storage.
Best practices
- Default search results to active listings only to avoid confusion
- Use thumbnail images in list cards and full resolution only on the detail page
- Add dot indicators to the PageView image gallery so users know how many photos exist
- Show property price prominently on both map marker snippets and list cards
- Store lat and lng on property documents for efficient map marker rendering
- Pre-create Firestore composite indexes for common filter and sort combinations
- Include a Schedule Tour call-to-action on every property detail page
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I want to build a real estate listing app in FlutterFlow with a toggleable Google Maps and ListView, property filters for type, price range, and bedrooms, a detail page with an image gallery PageView, and a bookmark/save feature using Firestore. Give me the data model, widget tree, and filter query logic.
Create a search page with a map icon toggle at the top, a Google Maps view with property markers, and a list view of property cards showing an image, title, price, and bedroom count. Add a filter bottom sheet with property type chips, a price slider, and a sort dropdown.
Frequently asked questions
Can I connect to an external MLS data feed instead of Firestore?
Yes. Use a Cloud Function to fetch listings from an MLS API on a schedule, normalize the data, and write it to your Firestore properties collection. The FlutterFlow frontend stays the same.
How do I handle property images from different aspect ratios?
Set the PageView images to use BoxFit.cover so they fill the frame consistently. For list cards, use a fixed-height Container with the image set to cover mode to crop to a uniform size.
Can I add a mortgage calculator to the property detail page?
Yes. Create a Custom Function that takes price, down payment percentage, interest rate, and loan term, then calculates the monthly payment. Display the result below the price with input fields for the user to adjust parameters.
How do I make the map zoom to fit all visible markers?
Use the FlutterFlowGoogleMap's initialZoom and initialCenter properties. For dynamic fitting, calculate the bounding box of all marker coordinates in a Custom Function and set the camera bounds accordingly.
What if Firestore query limits prevent complex filters?
Firestore supports limited compound queries. For complex multi-field filters, pre-create composite indexes for common combinations. If you need full-text search, integrate Algolia or Typesense via a Cloud Function.
Can RapidDev help build a full real estate platform?
Yes. RapidDev can build complete real estate platforms with MLS integration, virtual tour embedding, lead management, agent dashboards, and automated listing syndication.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation