[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"navigation":3,"url-settings":86,"blog-\u002Fblog\u002Fflutter-app-python-backend":671,"blog-author-\u002Fblog\u002Fflutter-app-python-backend":1121,"i-material-symbols:arrow-back-rounded":1133},{"id":4,"extension":5,"footer":6,"header":73,"meta":83,"stem":84,"__hash__":85},"navigation\u002Fdata\u002Fshared\u002Fnavigation.yml","yml",{"brand":7,"columns":13,"legal":63},{"name":8,"tagline":9,"downloadCta":10},"Pieces","The memory layer for modern work.",{"label":11,"href":12},"All downloads","\u002Fdownloads",[14,26,39,51],{"title":15,"links":16},"Product",[17,20,23],{"label":18,"href":19},"Pieces Desktop","\u002F",{"label":21,"href":22},"Pieces Enterprise","\u002Fenterprise",{"label":24,"href":25},"Pieces MCP","\u002Fmcp",{"title":27,"links":28},"Resources",[29,33,36],{"label":30,"href":31,"external":32},"Documentation","url:docs.home",true,{"label":34,"href":35},"Blog","\u002Fblog",{"label":37,"href":38,"external":32},"GitHub","url:github.org",{"title":40,"links":41},"Community",[42,45,48],{"label":43,"href":44,"external":32},"Discord","url:social.discord",{"label":46,"href":47,"external":32},"X \u002F Twitter","url:social.x",{"label":49,"href":50,"external":32},"LinkedIn","url:social.linkedin",{"title":52,"links":53},"Company",[54,57,60],{"label":55,"href":56},"About","\u002Fabout",{"label":58,"href":59},"Updates","\u002Fupdates",{"label":61,"href":62},"Contact","\u002Fcontact",[64,67,70],{"label":65,"href":66},"Privacy Policy","\u002Flegal\u002Fprivacy",{"label":68,"href":69},"Refund Policy","\u002Flegal\u002Frefund",{"label":71,"href":72},"Terms of Service","\u002Flegal\u002Fterms",{"links":74,"signIn":75,"contact":78,"cta":80},[],{"label":76,"href":77},"Manage account","url:portal.home",{"label":79,"href":62},"Get in touch",{"label":81,"href":82},"Download","url:routes.downloads",{},"data\u002Fshared\u002Fnavigation","XlSALC7vYCXHcmcXnjJViwIZKsqnQWF4bn4o9RrcSBE",{"id":87,"extension":5,"links":88,"meta":668,"stem":669,"__hash__":670},"urlSettings\u002Fdata\u002Fshared\u002Furls.yml",[89,93,97,101,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,169,173,177,181,185,189,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,303,307,311,314,318,322,326,330,334,338,342,346,350,354,358,362,366,370,374,378,382,386,390,394,398,402,406,410,414,418,422,426,430,434,438,442,446,450,454,458,461,465,469,473,477,481,485,488,491,494,497,501,505,508,512,516,520,524,528,532,536,540,544,548,552,556,559,563,567,571,575,579,582,585,588,592,595,599,603,607,611,614,618,622,625,628,631,635,639,643,646,649,652,656,660,664],{"key":90,"label":91,"href":92},"downloads.desktop","Desktop download page","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fdownload",{"key":94,"label":95,"href":96},"downloads.macOS.dmgArm64","macOS DMG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fdmg-arm64\u002Fdownload",{"key":98,"label":99,"href":100},"downloads.macOS.dmgIntel","macOS DMG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fdmg\u002Fdownload",{"key":102,"label":103,"href":104},"downloads.macOS.pkg","macOS PKG","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg\u002Fdownload",{"key":106,"label":107,"href":108},"downloads.macOS.universal","Desktop macOS Universal","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fmacos-universal\u002Fdownload",{"key":110,"label":111,"href":112},"downloads.macOS.pkgArm64","Desktop macOS PKG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pfd-arm64\u002Fdownload",{"key":114,"label":115,"href":116},"downloads.macOS.pkgIntel","Desktop macOS PKG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pfd\u002Fdownload",{"key":118,"label":119,"href":120},"downloads.windows.appinstaller","Windows App Installer","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fappinstaller\u002Fpieces_for_x.appinstaller",{"key":122,"label":123,"href":124},"downloads.windows.exe","Windows EXE","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fwindows-exe\u002Fdownload",{"key":126,"label":127,"href":128},"downloads.windows.msix","Windows MSIX","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fwindows-msix\u002Fdownload",{"key":130,"label":131,"href":132},"downloads.windows.suiteManager","Windows Suite Manager","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_suite_windows\u002Fappinstaller\u002Fdownload",{"key":134,"label":135,"href":136},"downloads.linux.flatpakRepo","Linux Flatpak repository","https:\u002F\u002Fbuilds.pieces.app\u002Fpieces-flatpak-repo\u002Fpieces-flatpak.flatpakrepo",{"key":138,"label":139,"href":140},"downloads.linux.snapDesktop","Linux Snap Desktop","https:\u002F\u002Fsnapcraft.io\u002Fpieces-for-developers",{"key":142,"label":143,"href":144},"downloads.linux.snapPiecesOS","Linux Snap PiecesOS","https:\u002F\u002Fsnapcraft.io\u002Fpieces-os",{"key":146,"label":147,"href":148},"downloads.linux.snap","Desktop Linux Snap package","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fsnap\u002Fdownload",{"key":150,"label":151,"href":152},"downloads.piecesOS.macOS.dmgArm64","PiecesOS macOS DMG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fdmg-arm64\u002Fdownload",{"key":154,"label":155,"href":156},"downloads.piecesOS.macOS.dmgIntel","PiecesOS macOS DMG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fdmg\u002Fdownload",{"key":158,"label":159,"href":160},"downloads.piecesOS.macOS.universal","PiecesOS macOS Universal","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fmacos-universal\u002Fdownload",{"key":162,"label":163,"href":164},"downloads.piecesOS.macOS.pkgArm64","PiecesOS macOS PKG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pos-launch-only-arm64\u002Fdownload",{"key":166,"label":167,"href":168},"downloads.piecesOS.macOS.pkgIntel","PiecesOS macOS PKG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pos-launch-only\u002Fdownload",{"key":170,"label":171,"href":172},"downloads.piecesOS.windows.appinstaller","PiecesOS Windows App Installer","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fappinstaller\u002Fos_server.appinstaller",{"key":174,"label":175,"href":176},"downloads.piecesOS.windows.exe","PiecesOS Windows EXE","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fwindows-exe\u002Fdownload",{"key":178,"label":179,"href":180},"downloads.piecesOS.windows.msix","PiecesOS Windows MSIX","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fwindows-msix\u002Fdownload",{"key":182,"label":183,"href":184},"downloads.piecesOS.linux.snap","PiecesOS Linux Snap package","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fsnap\u002Fdownload",{"key":186,"label":187,"href":188},"downloads.combined.macOS.appleSilicon","Combined macOS installer Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-arm64\u002Fdownload",{"key":190,"label":191,"href":104},"downloads.combined.macOS.intel","Combined macOS installer Intel",{"key":193,"label":194,"href":195},"downloads.guides.macOS","macOS installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Fmacos-installation-guide",{"key":197,"label":198,"href":199},"downloads.guides.windows","Windows installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Fwindows-installation-guide",{"key":201,"label":202,"href":203},"downloads.guides.linux","Linux installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Flinux-installation-guide",{"key":205,"label":206,"href":207},"downloads.guides.linuxFlatpak","Linux Flatpak installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Flinux-installation-guide\u002Fflatpak",{"key":209,"label":210,"href":211},"downloads.guides.linuxSnap","Linux Snap installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Flinux-installation-guide\u002Fsnap",{"key":213,"label":214,"href":215},"downloads.guides.piecesOS","PiecesOS manual installation","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Fmanual-installation",{"key":217,"label":218,"href":219},"extensions.chrome","Chrome extension","https:\u002F\u002Fchrome.google.com\u002Fwebstore\u002Fdetail\u002Fpieces-save-code-snippets\u002Figbgibhbfonhmjlechmeefimncpekepm",{"key":221,"label":222,"href":223},"extensions.firefox","Firefox add-on","https:\u002F\u002Faddons.mozilla.org\u002Fen-US\u002Ffirefox\u002Faddon\u002Fpieces-save-code-from-the-web\u002F",{"key":225,"label":226,"href":227},"extensions.edge","Edge add-on","https:\u002F\u002Fmicrosoftedge.microsoft.com\u002Faddons\u002Fdetail\u002Fpieces-save-code-snippet\u002Fhglfimcdgonaeeobjckfdabcldfidmim",{"key":229,"label":230,"href":231},"extensions.vscode","VS Code extension","https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=MeshIntelligentTechnologiesInc.pieces-vscode",{"key":233,"label":234,"href":235},"extensions.visualStudio","Visual Studio extension","https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=MeshIntelligentTechnologiesInc.PiecesVisualStudio",{"key":237,"label":238,"href":239},"extensions.jetbrains","JetBrains plugin","https:\u002F\u002Fplugins.jetbrains.com\u002Fplugin\u002F17328-pieces--save-search-share--reuse-code-snippets",{"key":241,"label":242,"href":243},"extensions.obsidian","Obsidian plugin","https:\u002F\u002Fobsidian.md\u002Fplugins?id=pieces-for-developers",{"key":245,"label":246,"href":247},"extensions.sublime","Sublime package","https:\u002F\u002Fpackagecontrol.io\u002Fpackages\u002FPieces",{"key":249,"label":250,"href":251},"extensions.neovim","Neovim plugin","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_neo_vim",{"key":253,"label":254,"href":255},"extensions.jupyterlab","JupyterLab plugin","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fjupyterlab-pieces",{"key":257,"label":258,"href":259},"extensions.cli","Pieces CLI","https:\u002F\u002Fpypi.org\u002Fproject\u002Fpieces-cli\u002F",{"key":261,"label":262,"href":263},"docs.home","Documentation home","https:\u002F\u002Fdocs.pieces.app",{"key":265,"label":266,"href":267},"docs.getStarted","Get started docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces",{"key":269,"label":270,"href":271},"docs.api","API docs","https:\u002F\u002Fdocs.pieces.app\u002Fapi",{"key":273,"label":274,"href":275},"docs.desktop.overview","Desktop overview","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop",{"key":277,"label":278,"href":279},"docs.desktop.onboarding","Desktop onboarding","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fonboarding",{"key":281,"label":282,"href":283},"docs.desktop.timeline","Desktop timeline docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Ftimeline",{"key":285,"label":286,"href":287},"docs.desktop.summaries","Desktop summaries docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fsingle-click-summaries",{"key":289,"label":290,"href":291},"docs.desktop.search","Desktop conversational search docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fconversational-search",{"key":293,"label":294,"href":295},"docs.desktop.drive","Desktop drive docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fdrive",{"key":297,"label":298,"href":299},"docs.desktop.account","Desktop account settings docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fconfiguration\u002Faccount",{"key":301,"label":302,"href":92},"docs.desktop.download","Desktop download docs",{"key":304,"label":305,"href":306},"docs.piecesOS.overview","PiecesOS overview docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies",{"key":308,"label":309,"href":310},"docs.piecesOS.details","PiecesOS details docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os",{"key":312,"label":313,"href":215},"docs.piecesOS.install","PiecesOS install docs",{"key":315,"label":316,"href":317},"docs.piecesOS.quickMenu","PiecesOS quick menu docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Fquick-menu",{"key":319,"label":320,"href":321},"docs.piecesOS.storage","On-device storage docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fon-device-storage",{"key":323,"label":324,"href":325},"docs.piecesOS.troubleshooting","PiecesOS troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Ftroubleshooting",{"key":327,"label":328,"href":329},"docs.mcp.overview","MCP overview docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp",{"key":331,"label":332,"href":333},"docs.mcp.cursor","MCP Cursor docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcursor",{"key":335,"label":336,"href":337},"docs.mcp.vscode","MCP VS Code docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fvs-code",{"key":339,"label":340,"href":341},"docs.mcp.claudeDesktop","MCP Claude Desktop docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-desktop",{"key":343,"label":344,"href":345},"docs.mcp.claudeCode","MCP Claude Code docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-code",{"key":347,"label":348,"href":349},"docs.mcp.claudeCowork","MCP Claude Cowork docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-cowork",{"key":351,"label":352,"href":353},"docs.mcp.githubCopilot","MCP GitHub Copilot docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgithub-copilot",{"key":355,"label":356,"href":357},"docs.mcp.goose","MCP Goose docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgoose",{"key":359,"label":360,"href":361},"docs.mcp.windsurf","MCP Windsurf docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fwindsurf",{"key":363,"label":364,"href":365},"docs.mcp.zed","MCP Zed docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fzed",{"key":367,"label":368,"href":369},"docs.mcp.jetbrains","MCP JetBrains docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fjetbrains-ides",{"key":371,"label":372,"href":373},"docs.mcp.continueDev","MCP Continue docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcontinue-dev",{"key":375,"label":376,"href":377},"docs.mcp.cline","MCP Cline docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcline",{"key":379,"label":380,"href":381},"docs.mcp.raycast","MCP Raycast docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fraycast",{"key":383,"label":384,"href":385},"docs.mcp.rovoDevCli","MCP Rovo Dev CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Frovo-dev-cli",{"key":387,"label":388,"href":389},"docs.mcp.openaiCodexCli","MCP OpenAI Codex CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fopenai-codex-cli",{"key":391,"label":392,"href":393},"docs.mcp.googleGeminiCli","MCP Google Gemini CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgoogle-gemini-cli",{"key":395,"label":396,"href":397},"docs.mcp.amazonQ","MCP Amazon Q docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Famazon-q-developer",{"key":399,"label":400,"href":401},"docs.mcp.chatgptDev","MCP ChatGPT Developer Mode docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fchatgpt-developer-mode",{"key":403,"label":404,"href":405},"docs.mcp.openclaw","MCP OpenClaw docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fopenclaw",{"key":407,"label":408,"href":409},"docs.mcp.mcpRemote","MCP Remote docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fmcp-remote",{"key":411,"label":412,"href":413},"docs.mcp.ngrok","MCP ngrok docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fngrok-setup",{"key":415,"label":416,"href":417},"docs.troubleshooting.macOS","macOS troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Fmacos",{"key":419,"label":420,"href":421},"docs.troubleshooting.windows","Windows troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Fwindows",{"key":423,"label":424,"href":425},"docs.troubleshooting.linux","Linux troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Flinux",{"key":427,"label":428,"href":429},"docs.privacy","Privacy and security docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fprivacy-security-your-data",{"key":431,"label":432,"href":433},"docs.support","Support docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fsupport",{"key":435,"label":436,"href":437},"portal.home","Pieces portal","https:\u002F\u002Fportal.pieces.app",{"key":439,"label":440,"href":441},"site.home","Website home","https:\u002F\u002Fpieces.app",{"key":443,"label":444,"href":445},"site.about","About page","https:\u002F\u002Fpieces.app\u002Fabout",{"key":447,"label":448,"href":449},"site.features","Features page","https:\u002F\u002Fpieces.app\u002Ffeatures",{"key":451,"label":452,"href":453},"site.plugins","Plugins page","https:\u002F\u002Fpieces.app\u002Fplugins",{"key":455,"label":456,"href":457},"site.contact","Contact page","https:\u002F\u002Fpieces.app\u002Fcontact",{"key":459,"label":58,"href":460},"site.updates","https:\u002F\u002Fpieces.app\u002Fupdates",{"key":462,"label":463,"href":464},"site.news","News","https:\u002F\u002Fpieces.app\u002Fnews",{"key":466,"label":467,"href":468},"site.events","Community events","https:\u002F\u002Fpieces.app\u002Fcommunity\u002Fevents",{"key":470,"label":471,"href":472},"site.userStories","User stories","https:\u002F\u002Fpieces.app\u002Fuser-stories",{"key":474,"label":475,"href":476},"site.academy","Academy","https:\u002F\u002Fpieces.app\u002Flearn\u002Facademy",{"key":478,"label":479,"href":480},"site.support","Website support","https:\u002F\u002Fpieces.app\u002Fsupport",{"key":482,"label":483,"href":484},"site.standup","Standup","https:\u002F\u002Fpieces.app\u002Fstandup",{"key":486,"label":34,"href":487},"site.blog","https:\u002F\u002Fcode.pieces.app\u002Fblog",{"key":489,"label":43,"href":490},"social.discord","https:\u002F\u002Fdiscord.gg\u002Fgetpieces",{"key":492,"label":46,"href":493},"social.x","https:\u002F\u002Fx.com\u002Fgetpieces",{"key":495,"label":496,"href":493},"social.twitter","Twitter",{"key":498,"label":499,"href":500},"social.instagram","Instagram","https:\u002F\u002Fwww.instagram.com\u002Fgetpieces\u002F",{"key":502,"label":503,"href":504},"social.tiktok","TikTok","https:\u002F\u002Fwww.tiktok.com\u002F@getpieces",{"key":506,"label":49,"href":507},"social.linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fgetpieces\u002F",{"key":509,"label":510,"href":511},"social.youtube","YouTube","https:\u002F\u002Fyoutube.com\u002F@getpieces",{"key":513,"label":514,"href":515},"github.org","GitHub organization","https:\u002F\u002Fgithub.com\u002Fpieces-app",{"key":517,"label":518,"href":519},"github.support","GitHub support","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport",{"key":521,"label":522,"href":523},"github.issues","GitHub issues","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport\u002Fissues",{"key":525,"label":526,"href":527},"github.discussions","GitHub discussions","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport\u002Fdiscussions",{"key":529,"label":530,"href":531},"github.documentation","GitHub documentation","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fdocumentation",{"key":533,"label":534,"href":535},"github.opensource","GitHub open source","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fopensource",{"key":537,"label":538,"href":539},"github.sdks.python","Python SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-python",{"key":541,"label":542,"href":543},"github.sdks.typescript","TypeScript SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-typescript",{"key":545,"label":546,"href":547},"github.sdks.dart","Dart SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-dart",{"key":549,"label":550,"href":551},"github.sdks.kotlin","Kotlin SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-kotlin",{"key":553,"label":554,"href":555},"github.plugins.obsidian","Obsidian plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fobsidian-pieces",{"key":557,"label":558,"href":255},"github.plugins.jupyterlab","JupyterLab plugin repository",{"key":560,"label":561,"href":562},"github.plugins.sublime","Sublime plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_sublime",{"key":564,"label":565,"href":566},"github.plugins.neovim","Neovim plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_neovim",{"key":568,"label":569,"href":570},"github.cliAgent","CLI agent repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fcli-agent",{"key":572,"label":573,"href":574},"github.mcpDart","MCP Dart repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fmcp_dart",{"key":576,"label":577,"href":578},"github.awesomePieces","Awesome Pieces repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fawesome-pieces",{"key":580,"label":581,"href":66},"legal.privacyPolicy","Privacy policy",{"key":583,"label":584,"href":69},"legal.refundPolicy","Refund policy",{"key":586,"label":587,"href":72},"legal.terms","Terms",{"key":589,"label":590,"href":591},"legal.security","Legal security","https:\u002F\u002Fpieces.app\u002Flegal\u002Fsecurity",{"key":593,"label":594,"href":511},"videos.youtubeChannel","YouTube channel",{"key":596,"label":597,"href":598},"videos.gettingStartedDesktop","Getting started desktop video","https:\u002F\u002Fyoutu.be\u002FdUr1lRM_TYk",{"key":600,"label":601,"href":602},"videos.snippetDiscoveryxR","Snippet discovery video","https:\u002F\u002Fyoutu.be\u002FG6vb1USw-30",{"key":604,"label":605,"href":606},"sales.bookACall","Book a sales call","https:\u002F\u002Fcalendar.app.google\u002FWVUDtUfNy5Vst3sH7",{"key":608,"label":609,"href":610},"sales.enterprise","Enterprise form","https:\u002F\u002Fgetpieces.typeform.com\u002Fto\u002FaVQFTvpE",{"key":612,"label":613,"href":527},"sales.feedback","Feedback discussions",{"key":615,"label":616,"href":617},"sales.earlyAccess","Early access form","https:\u002F\u002Fgetpieces.typeform.com\u002Fearlyaccess",{"key":619,"label":620,"href":621},"sales.supportEmail","Support email","mailto:support@pieces.app",{"key":623,"label":624,"href":19},"routes.home","Home route",{"key":626,"label":627,"href":56},"routes.about","About route",{"key":629,"label":630,"href":12},"routes.downloads","Downloads route",{"key":632,"label":633,"href":634},"routes.thanks","Post-install thanks route","\u002Finstall\u002Fthanks",{"key":636,"label":637,"href":638},"routes.pricing","Pricing route","\u002Fpricing",{"key":640,"label":641,"href":642},"cta.freeTrial","Start free trial CTA (Pieces Pro) — used by \u002Fcampaigns\u002F* landing pages","https:\u002F\u002Fcampaigns.pieces.app\u002F",{"key":644,"label":645,"href":22},"routes.enterprise","Enterprise route",{"key":647,"label":648,"href":62},"routes.contact","Contact route",{"key":650,"label":651,"href":59},"routes.updates","Updates route",{"key":653,"label":654,"href":655},"routes.migrationError","Migration error route","\u002Fmigration\u002Ferror",{"key":657,"label":658,"href":659},"routes.authenticated","Post-login authenticated route","\u002Fauth\u002Fsigned-in",{"key":661,"label":662,"href":663},"routes.signed-out","Signed out route","\u002Fauth\u002Fsigned-out",{"key":665,"label":666,"href":667},"routes.authentication-error","Authentication error route","\u002Fauth\u002Ferror",{},"data\u002Fshared\u002Furls","2AvfSWI6bZACH5Kr1ZS3txMLjteRjCjbDR_ul1uRZ9Q",{"id":672,"title":673,"author":674,"authorPhoto":675,"authorPhotoAlt":676,"authorSlug":677,"body":678,"buttonText":1108,"buttonUrl":1108,"category":1109,"date":1110,"description":1111,"draft":1112,"editorsPick":1112,"extension":1113,"featured":1112,"image":1114,"imageAlt":1115,"meta":1116,"navigation":32,"ogImage":1108,"ogImageAlt":1108,"path":1117,"seo":1118,"stem":1119,"tags":1108,"__hash__":1120},"blog\u002Fblog\u002Fflutter-app-python-backend.md","Flutter App with Python Backend | Kings of both -ends","Muhammad Hamza","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fflutter-app-python-backend\u002Fauthor.jpeg","Muhammad Hamza.","muhammad-hamza",{"type":679,"value":680,"toc":1091},"minimark",[681,685,691,696,699,702,706,709,713,724,734,771,782,788,797,800,806,814,821,824,830,836,843,849,853,864,870,876,882,888,893,900,917,923,929,933,940,946,952,956,959,972,978,984,988,991,997,1003,1010,1016,1022,1025,1031,1035,1038,1042,1048,1054,1058,1064,1070,1073,1079,1082],[682,683,684],"p",{},"In this article will explore how to build a flutter app with a python backend. We will learn how to integrate the Flask-RESTful backend, a Python extension, with Flutter as our frontend. We can take advantage of a straightforward API and make some magic happen with a flask extension!",[682,686,687],{},[688,689,690],"em",{},"Uniting the king of FRONTEND and the king of BACKEND.",[692,693,695],"h2",{"id":694},"flutter-python-install-flask-restful-and-build-a-flutter-app-with-python-backend","Flutter Python: Install Flask-RESTful and build a Flutter App with Python Backend",[682,697,698],{},"Flutter is a user interface toolkit that allows developers to create high-performing and cross-platform apps. It was created by Google and offers great flexibility in app design and development. With Flutter, you can create stunning, smooth, and responsive apps that work on multiple platforms with a single codebase. The UI elements in Flutter are customizable and its hot reload feature helps in faster development and bug fixing.",[682,700,701],{},"Flask-RESTful is a helpful extension for the Flask web framework that enables developers to easily create RESTful APIs. It provides the tools and functionality needed to quickly set up a REST API, making it a popular choice for building efficient and scalable web services. Flask-RESTful is powered by the Python programming language, so if you're familiar with Python, you'll find it very easy to work with.",[692,703,705],{"id":704},"rest-api","REST API",[682,707,708],{},"A REST API (Representational State Transfer API) is a type of application programming interface that adheres to the REST architectural style. It provides a set of standard methods, such as GET, POST, DELETE, etc., that allow developers to send and retrieve data. REST APIs communicate using HTTP, so all HTTP methods can be utilized in a REST API. REST APIs are commonly used for web and mobile applications, as they allow for efficient and flexible communication between the frontend and backend.",[692,710,712],{"id":711},"writing-our-first-rest-api","Writing our first REST API",[682,714,715,716,720,721,723],{},"In this project, we'll be utilizing the Flask-RESTful library, which is built with Python. To get started, the first step will be to install the library using ",[717,718,719],"code",{},"pip"," , the popular package manager for Python. With ",[717,722,719],{}," ,it's easy to install the Flask-RESTful library and any other necessary packages for our project.\"",[725,726,731],"pre",{"className":727,"code":729,"language":730},[728],"language-text","pip install flask-restful\n","text",[717,732,729],{"__ignoreMap":733},"",[682,735,736,743,745,746,749,750,745,753,745,756,745,759,745,762,745,765,745,768],{},[688,737,738,742],{},[739,740,741],"strong",{},"Mac OS:"," If",[717,744,719],{}," ",[688,747,748],{},"isn","’",[688,751,752],{},"t working for you and you’ve installed the latest Python version, then",[717,754,755],{},"pip3",[688,757,758],{},"will be your call. Same for the",[717,760,761],{},"python",[688,763,764],{},"to",[717,766,767],{},"python3",[688,769,770],{},"keyword.",[682,772,773,774,777,778,781],{},"We will start off by creating the file ",[717,775,776],{},"app.py"," and writing a simple ",[717,779,780],{},"hello world"," API response.",[725,783,786],{"className":784,"code":785,"language":730},[728],"import flask\nfrom flask_restful import Resource, Api\napp = flask.Flask(__name__)\napi = Api(app)\nclass HelloWorld(Resource):\n def get(self):\n return {\n 'hello': 'world',\n        }\napi.add_resource(HelloWorld, '\u002F')\nif __name__ == '__main__':\n    app.run(debug=True, host='0.0.0.0', port=8080)\n",[717,787,785],{"__ignoreMap":733},[682,789,790],{},[791,792,796],"a",{"href":793,"rel":794},"https:\u002F\u002Fuser-ef1260fb-64b8-4440-986b-261489d319c9-fhcmbheklq-uc.a.run.app\u002F?p=64f84096d6",[795],"nofollow","Save this code",[682,798,799],{},"Run the command:",[725,801,804],{"className":802,"code":803,"language":730},[728],"python app.py\n",[717,805,803],{"__ignoreMap":733},[682,807,808,809],{},"And open ",[791,810,813],{"href":811,"rel":812},"http:\u002F\u002Flocalhost:8080\u002F",[795],"http:\u002F\u002Flocalhost:8080",[682,815,816],{},[817,818],"img",{"alt":819,"src":820},"We’re using extension JSON Viewer for this look.","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fflutter-app-python-backend\u002Fimg-001.png",[682,822,823],{},"Now, let's now make the API response a bit more complex so that we can effectively demonstrate it on the Flutter frontend. By adding additional information and features to the API response, we can create a more dynamic and interactive user experience in the Flutter app.",[725,825,828],{"className":826,"code":827,"language":730},[728],"import flask\nfrom flask_restful import Resource, Api\napp = flask.Flask(__name__)\napi = Api(app)\nclass HelloWorld(Resource):\n def get(self):\n        data = [\n 'first',\n 'API',\n 'Response',\n 'with',\n 'random List',\n 'python',\n        ]\n return {\n 'data': data,\n        }\napi.add_resource(HelloWorld, '\u002F')\nif __name__ == '__main__':\n    app.run(debug=True, host='0.0.0.0', port=8080)\n",[717,829,827],{"__ignoreMap":733},[682,831,832],{},[791,833,796],{"href":834,"rel":835},"https:\u002F\u002Fuser-ef1260fb-64b8-4440-986b-261489d319c9-fhcmbheklq-uc.a.run.app\u002F?p=efb843a70d",[795],[682,837,838,839,842],{},"Following this, when you open the ",[717,840,841],{},"localhost"," it's going to look something like this:",[682,844,845],{},[817,846],{"alt":847,"src":848},"LocalHost screenshot for flutter app with python backend.","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fflutter-app-python-backend\u002Fimg-002.png",[692,850,852],{"id":851},"integration-in-flutter-flutter-app-with-python-backend","Integration in Flutter | Flutter App with Python Backend",[682,854,855,856,863],{},"To example, I’m going to use ",[791,857,860],{"href":858,"rel":859},"https:\u002F\u002Fpub.dev\u002Fpackages\u002Fflutter_bloc",[795],[739,861,862],{},"flutter_bloc"," to handle the REST APIs, followed by cubits and states. The project structure is going to look like this screenshot:",[682,865,866],{},[817,867],{"alt":868,"src":869},"cubits\u002Fdata folder containing dart.","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fflutter-app-python-backend\u002Fimg-003.png",[682,871,872,873],{},"We’ll start with a simple model class that holds a ",[717,874,875],{},"List",[725,877,880],{"className":878,"code":879,"language":730},[728],"import 'dart:convert';\nclass Data {\n final List words;\n Data({\n    required this.words,\n  });\n Data copyWith({\n    List? words,\n  }) {\n return Data(\n      words: words ?? this.words,\n    );\n  }\n Map toMap() { return {\n      'words': words,\n    };\n  }\n  factory Data.fromMap(Map map) {\n return Data(\n      words: List.from((map['words'] as List)),\n    );\n  }\n  String toJson() => json.encode(toMap());\n  factory Data.fromJson(String source) =>\n      Data.fromMap(json.decode(source) as Map);\n  @override\n  String toString() => 'Data(words: $words)';\n  @override\n  int get hashCode => words.hashCode;\n}\n",[717,881,879],{"__ignoreMap":733},[682,883,884],{},[791,885,796],{"href":886,"rel":887},"https:\u002F\u002Fuser-ef1260fb-64b8-4440-986b-261489d319c9-fhcmbheklq-uc.a.run.app\u002F?p=9670418e31",[795],[889,890,892],"h3",{"id":891},"data_providerdart","data_provider.dart",[682,894,895,896,899],{},"Then, we’ll request the data from the API in the ",[717,897,898],{},"data_provider"," layer.",[682,901,902,745,905,745,914],{},[688,903,904],{},"You may use",[791,906,909],{"href":907,"rel":908},"https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdio",[795],[688,910,911],{},[739,912,913],{},"dio",[688,915,916],{},"here as well, which is my preference.",[725,918,921],{"className":919,"code":920,"language":730},[728],"part of 'cubit.dart';\nclass DataDataProvider {\n static Future fetch() async {\n try {\n final request = await http.get(Uri.parse('http:\u002F\u002Flocalhost:8080'));\n return Data.fromJson(request.body);\n    } catch (e) {\n throw Exception(\"Internal Server Error\");\n    }\n  }\n}\n",[717,922,920],{"__ignoreMap":733},[682,924,925],{},[791,926,796],{"href":927,"rel":928},"https:\u002F\u002Fuser-ef1260fb-64b8-4440-986b-261489d319c9-fhcmbheklq-uc.a.run.app\u002F?p=8a1c4b9d53",[795],[889,930,932],{"id":931},"repositorydart","repository.dart",[682,934,935,936,939],{},"Next, just pass the data from API to the ",[717,937,938],{},"cubits",":",[725,941,944],{"className":942,"code":943,"language":730},[728],"part of 'cubit.dart';\nclass DataRepository {\n Future fetch() => DataDataProvider.fetch();}\n",[717,945,943],{"__ignoreMap":733},[682,947,948],{},[791,949,796],{"href":950,"rel":951},"https:\u002F\u002Fuser-ef1260fb-64b8-4440-986b-261489d319c9-fhcmbheklq-uc.a.run.app\u002F?p=272a48bce2",[795],[889,953,955],{"id":954},"statedart","state.dart",[682,957,958],{},"And we’re handling a few different states here:",[960,961,962,966,969],"ul",{},[963,964,965],"li",{},"Loading state",[963,967,968],{},"Success state",[963,970,971],{},"Failure state",[725,973,976],{"className":974,"code":975,"language":730},[728],"part of 'cubit.dart';\n@immutable\nclass DataState extends Equatable {\n final Data? data;\n final String? message;\n const DataState({\n    this.data,\n    this.message,\n  });\n  @override\n List get props => [\n data,\n message,\n      ];\n}\n@immutable\nclass DataDefault extends DataState {}\n@immutable\nclass DataFetchLoading extends DataState {\n const DataFetchLoading() : super();\n}\n@immutable\nclass DataFetchSuccess extends DataState {\n const DataFetchSuccess({Data? data}) : super(data: data);\n}\n@immutable\nclass DataFetchFailed extends DataState {\n const DataFetchFailed({String? message}) : super(message: message);\n}\n",[717,977,975],{"__ignoreMap":733},[682,979,980],{},[791,981,796],{"href":982,"rel":983},"https:\u002F\u002Fuser-ef1260fb-64b8-4440-986b-261489d319c9-fhcmbheklq-uc.a.run.app\u002F?p=f22d48a013",[795],[889,985,987],{"id":986},"cubitdart","cubit.dart",[682,989,990],{},"Finally, we’re omitting states based on if we have the data or not.",[725,992,995],{"className":993,"code":994,"language":730},[728],"import 'dart:async';\nimport 'package:flutter\u002Fmaterial.dart';\nimport 'package:flutter_bloc\u002Fflutter_bloc.dart';\nimport 'package:equatable\u002Fequatable.dart';\nimport 'package:http\u002Fhttp.dart' as http;\nimport 'package:jugaad\u002Fmodels\u002Fdata.dart';\npart 'data_provider.dart';\npart 'repository.dart';\npart 'state.dart';\nclass DataCubit extends Cubit {\n static DataCubit cubit(BuildContext context, [bool listen = false]) =>\n BlocProvider.of(context, listen: listen);\n DataCubit() : super(DataDefault());\n  final repo = DataRepository();\n  Future fetch() async {\n    emit(const DataFetchLoading());\n try {\n      final data = await repo.fetch();\n      emit(DataFetchSuccess(data: data));\n    } catch (e) {\n      emit(DataFetchFailed(message: e.toString()));\n    }\n  }\n}\n",[717,996,994],{"__ignoreMap":733},[682,998,999],{},[791,1000,796],{"href":1001,"rel":1002},"https:\u002F\u002Fuser-ef1260fb-64b8-4440-986b-261489d319c9-fhcmbheklq-uc.a.run.app\u002F?p=9e954baf07",[795],[682,1004,1005,1006,1009],{},"Now let’s handle the flutter frontend using ",[717,1007,1008],{},"BlocBuilder",". The final product will be something like this:",[725,1011,1014],{"className":1012,"code":1013,"language":730},[728],"import 'package:flutter\u002Fmaterial.dart';\nimport 'package:flutter_bloc\u002Fflutter_bloc.dart';\nimport 'package:jugaad\u002Fcubits\u002Fdata\u002Fcubit.dart';\nvoid main() {\n  runApp(const MyApp());\n}\nclass MyApp extends StatelessWidget {\n const MyApp({Key? key}) : super(key: key);\n  @override\n  Widget build(BuildContext context) {\n return MultiBlocProvider(\n      providers: [\n        BlocProvider(create: (_) => DataCubit()),\n      ],\n      child: const MaterialApp(\n        debugShowCheckedModeBanner: false,\n        title: 'flutter.py',\n        home: DataScreen(),\n      ),\n    );\n  }\n}\nclass DataScreen extends StatefulWidget {\n const DataScreen({Key? key}) : super(key: key);\n  @override\n  State createState() => _DataScreenState();\n}\nclass _DataScreenState extends State {\n  @override\n void initState() {\n super.initState();\n DataCubit.cubit(context).fetch();\n  }\n  @override\n Widget build(BuildContext context) {\n return Scaffold(\n      body: BlocBuilder(\n        builder: (context, state) {\n          \u002F\u002F loading\n          if (state is DataFetchLoading) {\n            return const Center(\n              child: CircularProgressIndicator(),\n            );\n          }\n          \u002F\u002F success\n          else if (state is DataFetchSuccess) {\n            return ListView(\n              children: state.data!.words\n                  .map(\n                    (word) => ListTile(\n                      title: Text(word),\n                    ),\n                  )\n                  .toList(),\n            );\n          }\n          \u002F\u002F failure\n          else if (state is DataFetchFailed) {\n            return Center(\n              child: Text(state.message!),\n            );\n          }\n          \u002F\u002F something unexpected\n          return const Center(\n            child: Text('Something went wrong'),\n          );\n        },\n      ),\n    );\n  }\n}\n",[717,1015,1013],{"__ignoreMap":733},[682,1017,1018],{},[791,1019,796],{"href":1020,"rel":1021},"https:\u002F\u002Fuser-ef1260fb-64b8-4440-986b-261489d319c9-fhcmbheklq-uc.a.run.app\u002F?p=b7b344a5a4",[795],[682,1023,1024],{},"And… 🥁🥁🥁",[682,1026,1027],{},[817,1028],{"alt":1029,"src":1030},"Data from the Flask API.","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fflutter-app-python-backend\u002Fimg-004.gif",[692,1032,1034],{"id":1033},"complexity","Complexity++",[682,1036,1037],{},"To improve our understanding, I will make the API response more complex and adjust the data.dart model class accordingly. This will illustrate the interaction between the API response and the data model and show us how to present the information effectively in the front end Flutter app.",[889,1039,1041],{"id":1040},"api-response","API response",[725,1043,1046],{"className":1044,"code":1045,"language":730},[728],"import flask\nfrom flask_restful import Resource, Api\napp = flask.Flask(__name__)\napi = Api(app)\nclass HelloWorld(Resource):\n def get(self):\n        data = [\n            {\n 'word': 'cat',\n 'type': 'animal',\n            },\n            {\n 'word': 'football',\n 'type': 'sports',\n            },\n            {\n 'word': 'rice',\n 'type': 'food',\n            },\n        ]\n return {\n 'data': data,\n        }\napi.add_resource(HelloWorld, '\u002F')\nif __name__ == '__main__':\n    app.run(debug=True, host='0.0.0.0', port=8080)\n",[717,1047,1045],{"__ignoreMap":733},[682,1049,1050],{},[791,1051,796],{"href":1052,"rel":1053},"https:\u002F\u002Fuser-ef1260fb-64b8-4440-986b-261489d319c9-fhcmbheklq-uc.a.run.app\u002F?p=5664458dc2",[795],[889,1055,1057],{"id":1056},"datadart","Data.dart",[725,1059,1062],{"className":1060,"code":1061,"language":730},[728],"import 'dart:convert';\nclass Data {\n final String word;\n final String type;\n Data({\n    required this.word,\n    required this.type,\n  });\n Data copyWith({\n    String? word,\n    String? type,\n  }) {\n return Data(\n      word: word ?? this.word,\n      type: type ?? this.type,\n    );\n  }\n Map toMap() { return {\n      'word': word,\n 'type': type,\n    };\n  }\n  factory Data.fromMap(Map map) {\n return Data(\n      word: map['word'] as String,\n      type: map['type'] as String,\n    );\n  }\n  String toJson() => json.encode(toMap());\n  factory Data.fromJson(String source) =>\n      Data.fromMap(json.decode(source) as Map);\n  @override\n  String toString() => 'Data(word: $word, type: $type)';\n  @override\n  int get hashCode => word.hashCode ^ type.hashCode;\n  @override\n  bool operator ==(covariant Data other) {\n if (identical(this, other)) return true;\n return other.word == word && other.type == type;\n  }\n}\n",[717,1063,1061],{"__ignoreMap":733},[682,1065,1066],{},[791,1067,796],{"href":1068,"rel":1069},"https:\u002F\u002Fuser-ef1260fb-64b8-4440-986b-261489d319c9-fhcmbheklq-uc.a.run.app\u002F?p=f48b469c5a",[795],[682,1071,1072],{},"The UI on our flutter app with python backend will look something like this:",[682,1074,1075],{},[817,1076],{"alt":1077,"src":1078},"Final UI.","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fflutter-app-python-backend\u002Fimg-005.png",[682,1080,1081],{},"That concludes our discussion. I hope you have gained new insights and information about integrating a Python backend with a Flutter app. It is common for individuals to inquire about the type of backends that can be used with Flutter. However, it is important to note that Flutter serves as a UI toolkit and can be paired with any backend of your choice, be it Flask-RESTful, Django, Node.js, or any other.",[682,1083,1084,1085,1090],{},"I encourage you to ",[791,1086,1089],{"href":1087,"rel":1088},"https:\u002F\u002Fpieces.app\u002Fblog\u002Fflutter-game-pong-game-flame",[795],"continue exploring and creating innovative projects"," with Flutter. Thank you for reading, and I wish you all the best in your fluttering endeavors. 💙",{"title":733,"searchDepth":1092,"depth":1092,"links":1093},2,[1094,1095,1096,1097,1104],{"id":694,"depth":1092,"text":695},{"id":704,"depth":1092,"text":705},{"id":711,"depth":1092,"text":712},{"id":851,"depth":1092,"text":852,"children":1098},[1099,1101,1102,1103],{"id":891,"depth":1100,"text":892},3,{"id":931,"depth":1100,"text":932},{"id":954,"depth":1100,"text":955},{"id":986,"depth":1100,"text":987},{"id":1033,"depth":1092,"text":1034,"children":1105},[1106,1107],{"id":1040,"depth":1100,"text":1041},{"id":1056,"depth":1100,"text":1057},null,"Software Development","2022-10-18T00:00:00.000Z","Flutter App with a Python Backend! Learn how to unite Flutter, developed by Google, and Python to create the ultimate tech stack!",false,"md","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fflutter-app-python-backend\u002Fhero.jpeg","flutter.py: Putting kings of both -end together.",{},"\u002Fblog\u002Fflutter-app-python-backend",{"title":673,"description":1111},"blog\u002Fflutter-app-python-backend","K07Wlnan6oNIVmcY_G7ubED8ufvijESLwxZTzjbPgTs",{"id":1122,"title":674,"body":1123,"description":733,"draft":1112,"extension":1113,"meta":1127,"navigation":32,"path":1128,"photo":1129,"photoAlt":1108,"seo":1130,"stem":1131,"__hash__":1132},"authors\u002Fauthors\u002Fmuhammad-hamza.md",{"type":679,"value":1124,"toc":1125},[],{"title":733,"searchDepth":1092,"depth":1092,"links":1126},[],{},"\u002Fauthors\u002Fmuhammad-hamza","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fauthors\u002Fplaceholder.svg",{"title":674,"description":733},"authors\u002Fmuhammad-hamza","8Rz7h2hoYvtX9wrkWNJzSB-YIaAFtQ7yWeVwcVBbg9Q",{"left":1134,"top":1134,"width":1135,"height":1135,"rotate":1134,"vFlip":1112,"hFlip":1112,"body":1136},0,24,"\u003Cpath fill=\"currentColor\" d=\"m7.825 13l4.9 4.9q.3.3.288.7t-.313.7q-.3.275-.7.288t-.7-.288l-6.6-6.6q-.15-.15-.213-.325T4.426 12t.063-.375t.212-.325l6.6-6.6q.275-.275.688-.275t.712.275q.3.3.3.713t-.3.712L7.825 11H19q.425 0 .713.288T20 12t-.288.713T19 13z\"\u002F>"]