Skip to main content
RapidDev - Software Development Agency

Looker

Connect FlutterFlow to Looker by embedding signed SSO dashboard URLs in a Custom Widget WebView. A Firebase Cloud Function generates the signed URL using your Looker embed secret, and a separate API 4.0 flow lets you pull raw query rows into native FlutterFlow widgets. Neither the embed secret nor the API client secret ever lives in Dart code.

What you'll learn

  • Why Looker has two separate secrets (embed secret vs API 4.0 client_secret) and how to use each correctly
  • How to write a Firebase Cloud Function that generates a signed SSO embed URL
  • How to build a FlutterFlow Custom Widget that loads a Looker dashboard in a WebView
  • How to pull Looker query results into native FlutterFlow widgets using API 4.0
  • How to pass FlutterFlow user attributes as Looker embed filters for per-user data scoping
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Advanced17 min read60 minutesAnalyticsLast updated July 2026RapidDev Engineering Team
TL;DR

Connect FlutterFlow to Looker by embedding signed SSO dashboard URLs in a Custom Widget WebView. A Firebase Cloud Function generates the signed URL using your Looker embed secret, and a separate API 4.0 flow lets you pull raw query rows into native FlutterFlow widgets. Neither the embed secret nor the API client secret ever lives in Dart code.

Quick facts about this guide
FactValue
ToolLooker
CategoryAnalytics
MethodCustom Widget
DifficultyAdvanced
Time required60 minutes
Last updatedJuly 2026

Embed Looker Dashboards in Your FlutterFlow App

Looker (now part of Google Cloud) is an enterprise BI platform powered by the LookML semantic model. Unlike event trackers that you call with an API, Looker is a full dashboard environment — you embed it rather than rebuild it. The integration centers on Looker's SSO embed feature, which lets you generate a cryptographically signed URL that opens a specific dashboard for a specific user, with row-level data scoping applied automatically. That signed URL is only valid for one session and must be regenerated each time the user opens the screen.

FlutterFlow compiles to a Flutter app running on the user's device, which means any secret placed in your app ships inside the compiled binary. Looker has two distinct secrets, and conflating them is the single most common mistake: the embed secret is used only to sign SSO embed URLs, while the API 4.0 client_secret is used to obtain a Bearer access token for programmatic queries. Both are server-only credentials and must live exclusively in your Firebase Cloud Function — never in FlutterFlow's API Call headers or Custom Action Dart code.

Looker is an enterprise product priced per user and data volume; embedding dashboards requires the Looker platform tier with embedding enabled by your instance administrator. Check current pricing with your Google Cloud account team. The good news is that once the Cloud Function infrastructure is in place, adding new embedded dashboards is as simple as changing a dashboard ID — no code changes required.

Integration method

Custom Widget

Looker dashboards are embedded into FlutterFlow using a Custom Widget that wraps the flutter_inappwebview package and loads a signed SSO embed URL. Because generating that URL requires your Looker embed secret (a server-only credential), a Firebase Cloud Function acts as the secure middleman: it signs the embed URL and returns it to FlutterFlow, which then passes it into the WebView widget. For teams that also need raw query data in native FlutterFlow charts, a second Cloud Function handles the Looker API 4.0 login flow and exposes results via a FlutterFlow API Call.

Prerequisites

  • A Looker instance with embedding enabled by your Looker admin (Settings → Embed → Enable embedding)
  • A Looker embed secret and separate API 4.0 client_id / client_secret (found in Looker Admin → API Keys)
  • A Firebase project with Cloud Functions enabled (Blaze pay-as-you-go plan required for outbound network calls)
  • A FlutterFlow project on any paid plan (Custom Code is available on all paid tiers)
  • Basic familiarity with the FlutterFlow Custom Code panel and Firebase Console

Step-by-step guide

1

Enable Looker embedding and collect your credentials

Before writing any code, confirm that your Looker instance has embedding enabled and gather the two credentials you will need. Log in to your Looker instance as an admin and navigate to Admin → Platform → Embed. Turn on 'Enable Embedding' and copy the embed secret that appears — this is a separate value from your API credentials and is used only for signing SSO embed URLs. Do not share this secret anywhere except your Cloud Function environment. Next, navigate to Admin → Users → Your User → Edit API Keys to create an API 4.0 key pair. Copy both the client_id (semi-public identifier) and the client_secret (treat like a password). You now have three values: the embed secret for signing dashboard URLs, and the client_id/client_secret pair for Looker API 4.0 programmatic access. Keep them in a secure note — you will place them only in your Firebase Cloud Function environment variables, never in FlutterFlow. Also note the base URL of your Looker instance, for example https://yourcompany.looker.com, and the numeric ID of the dashboard you want to embed (shown in the Looker URL when you open it: /dashboards/42).

Pro tip: The embed secret and the API client_secret are completely different values with different purposes. Using the API client_secret to sign an embed URL (or vice versa) will result in an authentication error. Looker's admin panel keeps them in separate sections for this reason.

Expected result: You have three values ready: LOOKER_EMBED_SECRET, LOOKER_API_CLIENT_ID, and LOOKER_API_CLIENT_SECRET, plus your Looker instance base URL and a dashboard ID.

2

Write a Firebase Cloud Function that generates a signed SSO embed URL

The signed SSO embed URL must be generated server-side because it requires your embed secret. Open your Firebase project in the Firebase Console and navigate to Functions. In FlutterFlow you can author Cloud Functions directly from Custom Code → Cloud Functions, or you can write the function in the Firebase Console emulator. The function receives the FlutterFlow user's ID and any filter values, constructs the Looker SSO embed URL payload (including the user email, group IDs, dashboard path, permissions, and session length), signs it using HMAC-SHA1 with your embed secret, and returns the complete signed URL string. The signing algorithm is precise — Looker's embed secret documentation at developers.looker.com shows the exact field order required. Store your secrets in Firebase Functions config: run firebase functions:config:set looker.embed_secret=VALUE and looker.api_client_id=VALUE. The function should also accept an optional filters parameter so FlutterFlow can pass the authenticated user's attributes (like their organization ID) to scope the Looker dashboard per user. SSO embed URLs are single-use and time-limited — do not cache the returned URL; regenerate it every time the Flutter screen opens.

index.js
1// Firebase Cloud Function (Node.js 20) — index.js
2const functions = require('firebase-functions');
3const crypto = require('crypto');
4
5exports.getLookerEmbedUrl = functions.https.onCall(async (data, context) => {
6 // Auth check — only signed-in users
7 if (!context.auth) {
8 throw new functions.https.HttpsError('unauthenticated', 'Must be authenticated');
9 }
10
11 const embedSecret = functions.config().looker.embed_secret;
12 const lookerHost = functions.config().looker.host; // e.g. yourcompany.looker.com
13 const dashboardId = data.dashboardId || '42';
14 const userFilters = data.filters || {};
15
16 // Build the SSO embed URL payload
17 const nonce = Math.random().toString(36).substring(2, 15);
18 const time = Math.floor(Date.now() / 1000);
19 const sessionLength = 3600; // 1 hour
20
21 const embedUser = {
22 external_user_id: context.auth.uid,
23 first_name: data.firstName || 'User',
24 last_name: data.lastName || '',
25 permissions: ['access_data', 'see_lookml_dashboards', 'see_user_dashboards'],
26 models: ['all'],
27 group_ids: [],
28 external_group_id: data.orgId || '',
29 user_attributes: userFilters,
30 access_filters: {}
31 };
32
33 const embedPath = `/embed/dashboards/${dashboardId}`;
34 const params = new URLSearchParams({ nonce, time, session_length: sessionLength });
35
36 // Sign with HMAC-SHA1 using the embed secret
37 const stringToSign = [
38 lookerHost, embedPath, nonce, time, sessionLength,
39 JSON.stringify(embedUser.permissions),
40 JSON.stringify(embedUser.models),
41 JSON.stringify(embedUser.group_ids),
42 embedUser.external_group_id,
43 JSON.stringify(embedUser.user_attributes),
44 JSON.stringify(embedUser.access_filters),
45 embedUser.external_user_id,
46 embedUser.first_name,
47 embedUser.last_name,
48 ''
49 ].join('\n');
50
51 const signature = crypto
52 .createHmac('sha1', embedSecret)
53 .update(stringToSign)
54 .digest('base64');
55
56 const embedUrl = `https://${lookerHost}/login/embed/${encodeURIComponent(embedPath)}?` +
57 `nonce=${encodeURIComponent(nonce)}&time=${time}&session_length=${sessionLength}` +
58 `&external_user_id=${encodeURIComponent(context.auth.uid)}` +
59 `&permissions=${encodeURIComponent(JSON.stringify(embedUser.permissions))}` +
60 `&models=${encodeURIComponent(JSON.stringify(embedUser.models))}` +
61 `&signature=${encodeURIComponent(signature)}`;
62
63 return { embedUrl, expiresAt: time + sessionLength };
64});

Pro tip: The string-to-sign field order is strict. If you get a Looker 'embedding not permitted' or signature error, double-check the field order against the official Looker SSO embed documentation — even a trailing newline difference causes the signature to fail.

Expected result: Your Cloud Function is deployed and callable. Calling it with a dashboard ID returns a signed embedUrl string and an expiresAt timestamp.

3

Create a FlutterFlow API Call that calls your Cloud Function

Now wire the Cloud Function into FlutterFlow so the app can request a fresh embed URL. In FlutterFlow, open the left nav and click API Calls → + Add → Create API Group. Name it 'Looker' and set the base URL to your Firebase Cloud Function's deployed HTTPS URL (visible in the Firebase Console under Functions → Dashboard, something like https://us-central1-your-project.cloudfunctions.net). Add a single API Call inside this group named 'Get Embed URL'. Set the method to POST. Switch to the Body tab and add a JSON body with variables for dashboardId, orgId, and any filter values you want to pass. In the Headers tab, set Content-Type to application/json. Because this is a Firebase callable function, the actual invocation is slightly different — Firebase Callable Functions expect a specific JSON envelope: the body should be wrapped as {"data": {"dashboardId": "{{dashboardId}}", "orgId": "{{orgId}}"}}. Switch to the Variables tab and add dashboardId (String, required) and orgId (String, optional). After saving, click Response & Test, paste a sample response like {"result": {"embedUrl": "https://yourcompany.looker.com/login/embed/...", "expiresAt": 1720000000}}, and click Generate JSON Paths. The JSON path $.result.embedUrl will let you bind the returned URL to your Custom Widget parameter.

api_call_config.json
1{
2 "method": "POST",
3 "endpoint": "/getLookerEmbedUrl",
4 "headers": {
5 "Content-Type": "application/json"
6 },
7 "body": {
8 "data": {
9 "dashboardId": "{{dashboardId}}",
10 "orgId": "{{orgId}}"
11 }
12 },
13 "response_json_paths": {
14 "embedUrl": "$.result.embedUrl",
15 "expiresAt": "$.result.expiresAt"
16 }
17}

Pro tip: Firebase Callable Functions require the body to be wrapped in a 'data' key. If you call the function without this wrapper you will get a 'Bad Request' error, even if your function code looks correct.

Expected result: The API Call appears in FlutterFlow with JSON paths for embedUrl and expiresAt. The Test button returns a valid signed URL when run with a real dashboard ID.

4

Build a Custom Widget WebView that renders the Looker dashboard

To display the Looker dashboard inside your FlutterFlow app, you need a Custom Widget that wraps the flutter_inappwebview package — FlutterFlow's built-in WebView widget does not support the auth cookie handling and header injection that Looker's SSO embed requires for reliable operation across platforms. In the left nav, click Custom Code → + Add → Widget. Name it 'LookerDashboard'. In the Pubspec Dependencies field, add flutter_inappwebview with the version specifier ^6.0.0 (or check pub.dev for the latest stable version compatible with your Flutter SDK). Define two parameters: embedUrl (String, required) and height (double, defaults to 600.0). Paste the Dart code below. Once saved, add the widget to a page: drag it from the Component palette onto your canvas. In the widget's Properties panel, set the embedUrl parameter to the output of the 'Get Embed URL' API Call you created (bind it via the backend query result). Set height to match your screen layout. Because a Custom Widget cannot render in the FlutterFlow browser preview, you will see a placeholder box in the canvas — that is expected. Test the actual rendering using Local Run or by downloading the project and running it on a device. The WebView will authenticate the user against Looker automatically using the signed URL and display the dashboard.

looker_dashboard_widget.dart
1import 'package:flutter/material.dart';
2import 'package:flutter_inappwebview/flutter_inappwebview.dart';
3
4class LookerDashboard extends StatefulWidget {
5 const LookerDashboard({
6 super.key,
7 required this.embedUrl,
8 this.height = 600.0,
9 });
10
11 final String embedUrl;
12 final double height;
13
14 @override
15 State<LookerDashboard> createState() => _LookerDashboardState();
16}
17
18class _LookerDashboardState extends State<LookerDashboard> {
19 InAppWebViewController? _webViewController;
20
21 @override
22 Widget build(BuildContext context) {
23 if (widget.embedUrl.isEmpty) {
24 return SizedBox(
25 height: widget.height,
26 child: const Center(child: CircularProgressIndicator()),
27 );
28 }
29 return SizedBox(
30 height: widget.height,
31 child: InAppWebView(
32 initialUrlRequest: URLRequest(
33 url: WebUri(widget.embedUrl),
34 ),
35 initialSettings: InAppWebViewSettings(
36 javaScriptEnabled: true,
37 domStorageEnabled: true,
38 allowsInlineMediaPlayback: true,
39 mediaPlaybackRequiresUserGesture: false,
40 ),
41 onWebViewCreated: (controller) {
42 _webViewController = controller;
43 },
44 onLoadError: (controller, url, code, message) {
45 debugPrint('Looker WebView error $code: $message');
46 },
47 ),
48 );
49 }
50}

Pro tip: Custom Widgets using flutter_inappwebview do not render in FlutterFlow's browser-based preview. Always use Local Run (FlutterFlow → Test → Local Run) or deploy to a device to verify the Looker embed is working correctly.

Expected result: The LookerDashboard widget appears on your canvas as a placeholder box with the correct dimensions. When run on a device, it loads the signed Looker dashboard and the user sees their scoped data.

5

Pass FlutterFlow user attributes as Looker embed filters

One of the most powerful features of Looker SSO embedding is per-user data scoping: you can pass the FlutterFlow authenticated user's attributes (such as their organization ID, region, or plan tier) as user_attributes into the embed URL, and Looker applies them as automatic row-level filters. To implement this, update your API Call's request body to include the current user's data from FlutterFlow's App State. In the Action Flow that triggers when the Looker screen loads (Widget Lifecycle → On Page Load), add a Backend/API Call action pointing to your 'Get Embed URL' API Call. Expand the variable bindings and set orgId to the value of currentUserDocument.orgId (or whatever field holds the user's organization in your Firestore/Supabase data). Pass this value through the Cloud Function as the external_group_id and as user_attributes entries in the signed payload. On the Looker side, you would have configured LookML user_attribute filters that match these keys — when the user opens the dashboard, Looker automatically restricts rows to match the passed attribute values. For multi-tenant SaaS apps this means each user sees only their organization's data with zero extra LookML work per customer. Finally, store the returned expiresAt timestamp in FlutterFlow App State so you can check it before each subsequent request and proactively refresh the embed URL before the 60-minute SSO session expires.

Pro tip: SSO embed URLs are single-use and session-bound. If your user navigates away and returns to the Looker screen, always call the Cloud Function to generate a fresh URL rather than reusing the previous one — expired or reused URLs show a Looker error page.

Expected result: The Looker dashboard loads pre-filtered to the current user's data. Other users logging into the same app see only their own data because the Cloud Function scopes the embed URL to each user's attributes.

6

(Optional) Pull raw Looker query results into native FlutterFlow widgets

If you want to display Looker data in native FlutterFlow charts or list widgets instead of the embedded dashboard iframe, you can use Looker API 4.0 via a second Cloud Function. This function handles the full auth handshake: it POSTs your API 4.0 client_id and client_secret to https://yourcompany.looker.com/api/4.0/login, receives a Bearer access token, then calls /api/4.0/queries/{query_id}/run/json (or /run_look/{look_id}/json for saved Looks) and returns the row data. In FlutterFlow, add a new API Call in the Looker group named 'Run Query'. Set the method to POST and the endpoint to your second Cloud Function's URL. The function returns an array of row objects; use a JSON Path like $.rows[*].revenue to extract individual columns. Bind the results to FlutterFlow chart widgets via a Backend Query on the page. This approach gives you a fully native UI while Looker remains the single source of truth for your data logic. Note that API 4.0 access tokens are also time-limited — your Cloud Function should handle token refresh internally rather than caching across requests. If you'd rather skip building the dual-function infrastructure, RapidDev's team sets up FlutterFlow + Looker integrations like this regularly — book a free scoping call at rapidevelopers.com/contact.

index.js
1// Second Cloud Function for API 4.0 query results — index.js (add to same file)
2exports.runLookerQuery = functions.https.onCall(async (data, context) => {
3 if (!context.auth) {
4 throw new functions.https.HttpsError('unauthenticated', 'Must be authenticated');
5 }
6
7 const clientId = functions.config().looker.api_client_id;
8 const clientSecret = functions.config().looker.api_client_secret;
9 const lookerHost = functions.config().looker.host;
10 const queryId = data.queryId;
11
12 // Step 1: Get an API 4.0 access token
13 const loginRes = await fetch(`https://${lookerHost}/api/4.0/login`, {
14 method: 'POST',
15 headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
16 body: `client_id=${encodeURIComponent(clientId)}&client_secret=${encodeURIComponent(clientSecret)}`
17 });
18 const { access_token } = await loginRes.json();
19
20 // Step 2: Run the query and return rows
21 const queryRes = await fetch(
22 `https://${lookerHost}/api/4.0/queries/${queryId}/run/json`,
23 { headers: { Authorization: `token ${access_token}` } }
24 );
25 const rows = await queryRes.json();
26 return { rows };
27});

Pro tip: Never hardcode client_id or client_secret in your Dart code or FlutterFlow API Call headers. These are the keys to your entire Looker instance. Always route them through a Cloud Function.

Expected result: The Run Query Cloud Function returns structured row data. A FlutterFlow Backend Query on a chart page binds to the returned rows, rendering Looker data as a native Flutter chart.

Common use cases

Customer-facing analytics portal in a SaaS app

A SaaS platform builds a FlutterFlow app that shows each customer their own usage data from Looker. The Cloud Function generates a signed SSO embed URL scoped to the customer's account ID, so every user sees only their own data. The embedded Looker dashboard renders in a full-screen WebView within the app.

FlutterFlow Prompt

Show an embedded Looker dashboard on the Analytics screen that automatically filters to the currently logged-in user's account data

Copy this prompt to try it in FlutterFlow

Executive dashboard app with live BI metrics

A FlutterFlow mobile app for company executives pulls key metrics (revenue, churn, pipeline) from Looker dashboards. Sensitive API credentials stay in the Cloud Function; the app only receives an embed URL and displays it. Executives can tap through Looker's native drill-down without any additional FlutterFlow development.

FlutterFlow Prompt

Build an executive dashboard screen that loads a Looker dashboard embed and refreshes the session URL each time the screen is opened

Copy this prompt to try it in FlutterFlow

Native chart screen pulling Looker query results

For a lighter-weight experience without the full dashboard iframe, a FlutterFlow screen calls a Cloud Function that authenticates with Looker API 4.0 and runs a saved query. The returned JSON rows are bound to a FlutterFlow chart widget, giving the app a fully native look while Looker remains the source of truth for the data.

FlutterFlow Prompt

Fetch the last 30 days of sales data from a Looker saved query and display it as a bar chart on the Reports screen using native FlutterFlow chart widgets

Copy this prompt to try it in FlutterFlow

Troubleshooting

The Custom Widget WebView shows a 'Embedding not enabled' or blank Looker page

Cause: Looker's embedding feature is disabled on the instance, or the embed domain (your app's domain or the Flutter WebView origin) is not on the allow-list in Looker admin settings.

Solution: Log in to your Looker instance as an admin, navigate to Admin → Platform → Embed, confirm 'Enable Embedding' is toggled on, and add your deployment domain to the allowed embed domains list. For mobile apps using flutter_inappwebview there may not be a fixed origin, so you may need to allow all origins in development (and restrict in production).

Cloud Function returns a signed URL but Looker responds with a 401 or signature error when the WebView loads it

Cause: The embed secret used to sign the URL does not match the embed secret configured in your Looker instance, or the field order in the string-to-sign is incorrect.

Solution: Double-check that functions.config().looker.embed_secret returns the same value shown in Looker Admin → Platform → Embed → Embed Secret. Regenerating the embed secret in Looker immediately invalidates all previously signed URLs. Also verify the signing string field order against the official Looker embed documentation at developers.looker.com/embed.

Using the API 4.0 client_secret to generate embed URLs (or vice versa) causes an auth failure

Cause: The embed secret and the API 4.0 client_secret are two completely separate credentials in Looker with different formats and purposes. They cannot be used interchangeably.

Solution: The embed secret is found under Looker Admin → Platform → Embed. The API 4.0 client_id and client_secret are found under Admin → Users → API Keys. Use the embed secret only for signing SSO embed URLs; use client_id/client_secret only for /api/4.0/login.

The Looker dashboard goes blank after about an hour

Cause: The SSO embed session has expired. Looker SSO sessions are time-limited (typically 3600 seconds / 1 hour) and the signed URL becomes invalid after the session ends.

Solution: Store the expiresAt timestamp returned by your Cloud Function in FlutterFlow App State. On the Looker screen's On Page Load action and on any navigation back to the screen, check if the current time exceeds expiresAt minus a 5-minute buffer. If so, call the Cloud Function again to regenerate the embed URL before loading the WebView.

Best practices

  • Never store the Looker embed secret or API 4.0 client_secret anywhere in FlutterFlow — they must live exclusively in Firebase Cloud Function environment config (firebase functions:config:set).
  • Always regenerate the signed SSO embed URL on each page load rather than caching it. Embed URLs are single-use and session-bound; reusing them after expiry produces a Looker error page.
  • Store the expiresAt timestamp from the Cloud Function response in App State and proactively refresh the embed URL 5 minutes before the session expires to avoid visible mid-session blank dashboards.
  • Use flutter_inappwebview for the Looker Custom Widget rather than FlutterFlow's built-in WebView — it supports cookie handling, JavaScript injection, and the load error callbacks you need for reliable embedding.
  • Pass the FlutterFlow authenticated user's organization ID or other scoping attributes through the Cloud Function as Looker user_attributes, so the embedded dashboard is automatically filtered to each user's data without any extra work per customer.
  • Test the Custom Widget on a physical device or via Local Run — flutter_inappwebview does not render in FlutterFlow's browser-based canvas preview or Run mode.
  • Keep the embed secret separate from the API 4.0 credentials and label them clearly in your Cloud Function config to prevent the most common Looker integration mistake: using the wrong secret for the wrong operation.
  • For the API 4.0 query route, request a fresh access token inside each Cloud Function invocation rather than caching tokens across requests — Looker tokens are short-lived and caching adds complexity with minimal performance benefit for this use case.

Alternatives

Frequently asked questions

Can I embed a Looker dashboard without a Firebase Cloud Function?

Not securely. The SSO embed URL must be signed with your Looker embed secret, and embedding that secret in client-side Dart code would expose your entire Looker instance to anyone who reverse-engineers the APK. A server-side function (Firebase Cloud Function or Supabase Edge Function) is the only safe place to hold the embed secret and perform the signing.

Does the Looker embed work on iOS and Android, or only on web?

The flutter_inappwebview Custom Widget renders the embedded Looker dashboard in a native WebView on both iOS and Android, so mobile works well. For FlutterFlow's web builds you should also test carefully, as web-based WebViews may encounter CORS or cookie restrictions depending on your Looker instance's CORS configuration. Mobile builds do not have CORS restrictions.

What is the difference between Looker's embed secret and the API 4.0 client_secret?

They are two completely different credentials. The embed secret is used exclusively to sign SSO embed URLs — it is a shared symmetric secret that Looker uses to verify the URL was generated by a trusted server. The API 4.0 client_id and client_secret are OAuth-style credentials used to authenticate programmatic API calls (like running queries or fetching dashboard metadata). Using the wrong one for the wrong operation will always result in an authentication error.

How do I update the Looker dashboard shown to a user without changing code?

Pass the dashboard ID as a parameter to the Cloud Function call from FlutterFlow. Store the desired dashboard ID in Firestore or Supabase alongside the user's record, and read it in the On Page Load action before calling the Cloud Function. This lets you change which dashboard a user or user group sees by updating a database value — no code changes or redeployment required.

My FlutterFlow canvas shows a blank box where the Looker widget should be. Is that normal?

Yes, that is expected. Custom Widgets using flutter_inappwebview cannot render in FlutterFlow's browser-based canvas or Run mode preview. You will see a placeholder box with the widget's dimensions. To see the actual Looker embed, use FlutterFlow's Local Run feature (Test → Local Run) or download the project and run it on a device or simulator.

RapidDev

Talk to an Expert

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

Book a free consultation

Integrations are where projects stall

We wire FlutterFlow integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

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.