Skip to main content
RapidDev - Software Development Agency
flutterflow-tutorials

How to Set Up an Online Art Gallery with Auctions in FlutterFlow

Create an art gallery app using a masonry grid Custom Widget with flutter_staggered_grid_view to display artworks at their original aspect ratios. Add artist profile pages, a fullscreen InteractiveViewer for zooming into artwork details, and live auction bidding powered by Firestore transactions and real-time listeners. Countdown timers on each auction show remaining time and Cloud Functions handle bid validation and auction settlement.

What you'll learn

  • How to build a masonry grid layout that preserves artwork aspect ratios
  • How to implement fullscreen artwork viewing with pinch-to-zoom
  • How to set up live auction bidding with real-time Firestore updates
  • How to create artist profile pages with portfolio galleries
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner8 min read35-45 minFlutterFlow Free+March 2026RapidDev Engineering Team
TL;DR

Create an art gallery app using a masonry grid Custom Widget with flutter_staggered_grid_view to display artworks at their original aspect ratios. Add artist profile pages, a fullscreen InteractiveViewer for zooming into artwork details, and live auction bidding powered by Firestore transactions and real-time listeners. Countdown timers on each auction show remaining time and Cloud Functions handle bid validation and auction settlement.

Building an Online Art Gallery with Live Auctions in FlutterFlow

An online art gallery needs to showcase artwork beautifully while supporting commercial features like auctions. This tutorial covers building a masonry grid that respects each artwork's unique proportions, artist profiles with portfolios, fullscreen zoom viewing, and a live bidding system with real-time updates and countdown timers.

Prerequisites

  • A FlutterFlow project with Firestore and authentication configured
  • Firebase Cloud Functions enabled for bid validation
  • Sample artwork images uploaded to Firebase Storage
  • Basic familiarity with Custom Widgets in FlutterFlow

Step-by-step guide

1

Create the Firestore data model for artworks and artists

Create an artworks collection with fields: title (String), artistName (String), artistId (String), medium (String), dimensions (String), imageUrls (String Array), description (String), startingPrice (Double), currentBid (Double), currentBidderId (String), auctionEndTime (Timestamp), status (String: forSale, auction, or sold), tags (String Array). Create an artists collection with fields: userId (String), displayName (String), bio (String), avatarUrl (String), portfolioImageUrls (String Array), totalSales (Integer). Under artworks, create a bids subcollection with fields: userId (String), amount (Double), timestamp (Timestamp).

Expected result: Firestore has artworks and artists collections with a bids subcollection under each artwork.

2

Build the masonry grid gallery with staggered layout

Create a GalleryPage. Add a Custom Widget using the flutter_staggered_grid_view package. The widget takes a list of artwork documents as a parameter and renders them in a StaggeredGrid with 2 columns. Each artwork card is a Container with the artwork image set to BoxFit.cover, preserving the original aspect ratio by calculating the crossAxisCellCount based on the image dimensions. Below the image, add a small overlay with the title and artist name in white text on a dark gradient. Tap action on each card navigates to an ArtworkDetailPage passing the artwork document reference. Add ChoiceChips above the grid for filtering by tags such as Painting, Sculpture, Photography, and Digital.

masonry_art_grid.dart
1// Custom Widget: MasonryArtGrid
2import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
3
4class MasonryArtGrid extends StatelessWidget {
5 final List<Map<String, dynamic>> artworks;
6 final Function(String) onTap;
7
8 const MasonryArtGrid({required this.artworks, required this.onTap});
9
10 @override
11 Widget build(BuildContext context) {
12 return MasonryGridView.count(
13 crossAxisCount: 2,
14 mainAxisSpacing: 8,
15 crossAxisSpacing: 8,
16 itemCount: artworks.length,
17 itemBuilder: (context, index) {
18 final art = artworks[index];
19 return GestureDetector(
20 onTap: () => onTap(art['id']),
21 child: ClipRRect(
22 borderRadius: BorderRadius.circular(8),
23 child: Image.network(art['imageUrls'][0], fit: BoxFit.cover),
24 ),
25 );
26 },
27 );
28 }
29}

Expected result: Artworks display in a Pinterest-style masonry grid where each piece retains its original aspect ratio.

3

Build the artwork detail page with fullscreen zoom

Create an ArtworkDetailPage with Route Parameter artworkRef. Display the artwork images in a PageView at the top half of the screen for swiping through multiple images. Wrap each image in an InteractiveViewer widget (Custom Widget) to enable pinch-to-zoom. Below the images, add the artwork title, artist name (tappable to navigate to artist profile), medium, dimensions, and description. If the artwork status is 'auction', show the current bid, a countdown timer, and a Place Bid button. If status is 'forSale', show the price and a Buy Now button. Add a provenance section Container with the artwork's history and a certificate of authenticity indicator.

Expected result: A detail page with swipeable images, pinch-to-zoom, artwork metadata, and context-appropriate purchase or bid options.

4

Implement live auction bidding with real-time updates

On the artwork detail page for auction items, add a TextField for the bid amount and a Place Bid button. The bid action calls a Cloud Function that validates the bid: check that the bid amount is greater than currentBid plus a minimum increment, the auction has not ended (auctionEndTime is in the future), and the bidder is not the current highest bidder. The Cloud Function uses a Firestore transaction to atomically read the current bid, verify the new bid is still higher, update currentBid and currentBidderId on the artwork document, and create a bid document in the bids subcollection. Enable real-time listening on the artwork document by disabling Single Time Query so the current bid and bidder update live for all viewers. Add a countdown timer using a Custom Function that calculates the remaining time from auctionEndTime.

Expected result: Users can place bids that are validated server-side, and all viewers see bid updates in real-time with a live countdown timer.

5

Create artist profile pages with portfolio gallery

Create an ArtistProfilePage with Route Parameter artistId. Query the artists collection for the matching document. Display the artist avatar as a CircleImage, display name, and bio at the top. Below, add a TabBar with two tabs: Portfolio and For Sale. The Portfolio tab shows a GridView of all artworks by this artist. The For Sale tab filters to artworks where status is forSale or auction. Each artwork card shows the image, title, and price or current bid. Add a Follow Artist button that creates a following document under the current user for receiving notifications about new artworks from this artist.

Expected result: Artist profiles showcase their bio, avatar, and complete portfolio with the ability to filter by available works.

6

Handle auction settlement and notifications

Create a scheduled Cloud Function that runs every minute, querying artworks where status is 'auction' and auctionEndTime is in the past. For each ended auction, the function sets status to 'sold', records the winning bid details, and sends a push notification to the winning bidder and the artist. Create a notification for outbid events too: when a new bid is placed, the Cloud Function sends a notification to the previously highest bidder saying they have been outbid. On the GalleryPage, add a 'Won Auctions' section for the current user showing artworks they have won.

Expected result: Auctions automatically settle when they end, winners are notified, and outbid users receive alerts to place higher bids.

Complete working example

FlutterFlow Art Gallery Setup
1FIRESTORE DATA MODEL:
2 artworks/{artworkId}
3 title: String
4 artistName: String
5 artistId: String
6 medium: String
7 dimensions: String
8 imageUrls: [String]
9 description: String
10 startingPrice: Double
11 currentBid: Double
12 currentBidderId: String
13 auctionEndTime: Timestamp
14 status: "forSale" | "auction" | "sold"
15 tags: [String]
16 bids/{bidId}
17 userId: String
18 amount: Double
19 timestamp: Timestamp
20
21 artists/{artistId}
22 userId: String
23 displayName: String
24 bio: String
25 avatarUrl: String
26 portfolioImageUrls: [String]
27 totalSales: Integer
28
29PAGE: GalleryPage
30WIDGET TREE:
31 Column
32 ChoiceChips (Painting, Sculpture, Photography, Digital)
33 Custom Widget: MasonryArtGrid
34 Data: artworks query filtered by tag
35 On Tap: Navigate to ArtworkDetailPage
36
37PAGE: ArtworkDetailPage
38WIDGET TREE:
39 Column
40 PageView (artwork images)
41 InteractiveViewer (pinch-to-zoom per image)
42 Text (title, large)
43 GestureDetector Text (artistName, tappable)
44 Row (medium + dimensions)
45 Text (description)
46 Container (provenance + certificate)
47 Conditional Builder
48 Auction: currentBid + countdown + TextField + Place Bid
49 ForSale: price + Buy Now button
50
51PAGE: ArtistProfilePage
52WIDGET TREE:
53 Column
54 CircleImage (avatar)
55 Text (displayName + bio)
56 Button (Follow Artist)
57 TabBar
58 Portfolio: GridView of all artworks
59 For Sale: filtered artworks (forSale + auction)

Common mistakes

Why it's a problem: Using a uniform GridView for artworks that crops all images to the same aspect ratio

How to avoid: Use a staggered or masonry grid with flutter_staggered_grid_view that preserves each artwork's original aspect ratio.

Why it's a problem: Updating currentBid without a Firestore transaction

How to avoid: Always use a Firestore transaction in the Cloud Function: read currentBid, verify the new bid is higher, then write atomically.

Why it's a problem: Not validating bids server-side in a Cloud Function

How to avoid: Run all bid validation logic in a Cloud Function that checks bid amount, auction end time, and minimum increment before writing to Firestore.

Why it's a problem: Loading all artwork images at full resolution in the gallery grid

How to avoid: Use thumbnail-sized images for the gallery grid and load full-resolution images only on the detail page. Firebase Storage image resize extension can generate thumbnails automatically.

Best practices

  • Use masonry grid layout to respect each artwork's unique proportions
  • Enable InteractiveViewer for pinch-to-zoom on artwork detail images
  • Validate all bids in Cloud Functions with Firestore transactions for atomicity
  • Use real-time listeners on auction documents so all viewers see live bid updates
  • Display countdown timers on active auctions to create urgency
  • Generate thumbnail images for gallery views and full-resolution for detail pages
  • Add a provenance section for art authenticity and collector confidence
  • Send push notifications for outbid alerts and auction settlement

Still stuck?

Copy one of these prompts to get a personalized, step-by-step explanation.

ChatGPT Prompt

I want to build an online art gallery with live auctions in FlutterFlow. Show me how to create a masonry grid for artworks, artist profile pages, fullscreen image viewing with zoom, and a real-time bidding system with Firestore transactions and countdown timers.

FlutterFlow Prompt

Create an art gallery page with a Pinterest-style masonry grid of artwork images. Each card should show the artwork image with the title and artist name at the bottom on a dark gradient overlay.

Frequently asked questions

Can I add a favorites or wishlist feature for artworks?

Yes. Create a favorites subcollection under each user document. Add a heart IconButton on artwork cards that creates or deletes a favorite document. Display a Favorites page with a Backend Query filtered to the user's favorited artwork IDs.

How do I handle auction sniping where users bid at the last second?

Implement an anti-sniping rule in the bid Cloud Function: if a bid is placed within the last 2 minutes, extend auctionEndTime by 2 minutes. This gives other bidders a chance to respond.

Can I add a reserve price that must be met for an auction to close?

Yes. Add a reservePrice field to artworks. In the settlement Cloud Function, check if the winning bid meets the reserve. If not, set status to 'unsold' instead of 'sold' and notify the artist.

How do I display art with very different aspect ratios effectively?

The masonry grid from flutter_staggered_grid_view automatically handles varying aspect ratios. Store image width and height metadata in Firestore and pass it to the grid widget for accurate sizing before the image loads.

Can I add AR preview to see artwork on a wall?

Yes. Add a Custom Widget using the ar_flutter_plugin package. Store the artwork's real dimensions in Firestore. The AR view places the artwork image on a detected wall surface at real-world scale for a try-before-you-buy experience.

Can RapidDev help build a complete art marketplace?

Yes. RapidDev can implement a full art platform with artist onboarding, auction management, payment processing with escrow, shipping integration, certificate of authenticity generation, and AR preview features.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.