{"version":1,"pages":[{"id":"c5t2gjkgBocZiL1tjUQv","title":"Welcome","pathname":"/flutter","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"hand-wave","description":"🚀 Welcome to My Flutter GitBook!"},{"id":"y0H2DpuawHJCACFywoPe","title":"Tip Code Faster","pathname":"/flutter/easy-code/tip-code-faster","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"comet","description":"","breadcrumbs":[{"label":"easy code"}]},{"id":"757ESPKGR9SwyJPqwpIM","title":"FVM","pathname":"/flutter/easy-code/fvm","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"code-branch","description":"Fix Flutter version for your team with FVM","breadcrumbs":[{"label":"easy code"}]},{"id":"PG14RfyD6nuNYL68vG7H","title":"Make","pathname":"/flutter/easy-code/make","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"terminal","description":"Use Make to run many Flutter commands with one short command","breadcrumbs":[{"label":"easy code"}]},{"id":"8mfrjG04MVDFXtJQbSsu","title":"Easy Maintain","pathname":"/flutter/easy-code/easy-maintain","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"person-digging","description":"Reducing Maintenance and Sustaining Code","breadcrumbs":[{"label":"easy code"}]},{"id":"6Yh2LXIXAdzRX2g1isw5","title":"Mason","pathname":"/flutter/easy-code/mason","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"explosion","description":"Code Flutter Faster with Mason","breadcrumbs":[{"label":"easy code"}]},{"id":"9K2cFvWJZkj1En1mS41Y","title":"Log Color","pathname":"/flutter/easy-code/log-color","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"palette","description":"Setting Up Colored Logs and Saving Logs to Device Storage","breadcrumbs":[{"label":"easy code"}]},{"id":"NLO1FMlDB7QtAs4FAA8k","title":"Activity Diagram","pathname":"/flutter/easy-code/activity-diagram","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"head-side-brain","description":"","breadcrumbs":[{"label":"easy code"}]},{"id":"nOyMKoFdRsvzloZZ19PO","title":"FFmpeg Flutter","pathname":"/flutter/media/ffmpeg-flutter","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"monero","description":"Handling Video with FFmpeg in Flutter","breadcrumbs":[{"label":"Media"}]},{"id":"0WC9Kg79sKDw0COGDLUj","title":"Plugin","pathname":"/flutter/architecture-code/plugin","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"puzzle-piece-simple","description":"Plugin: Communicating with Native Code for Efficient Flutter App Maintenance","breadcrumbs":[{"label":"Architecture code"}]},{"id":"DOQf7tbR65m4o5Jlz62x","title":"Flutter Clean Architecture","pathname":"/flutter/architecture-code/flutter-clean-architecture","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"ram","description":"Easier Maintenance and Expansion of Flutter Code with Clean Architecture","breadcrumbs":[{"label":"Architecture code"}]},{"id":"awFEXKYydCCmZKw6vQIk","title":"Base Project","pathname":"/flutter/architecture-code/base-project","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"atom","description":"Creating a Base Project in Flutter","breadcrumbs":[{"label":"Architecture code"}]},{"id":"1lpIWX1RW20PkI7TGvxs","title":"Flavor","pathname":"/flutter/architecture-code/flavor","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"sliders","description":"Set up 3 environments (dev, staging, production) for mobile in Flutter (3 separate mobile apps)","breadcrumbs":[{"label":"Architecture code"}]},{"id":"QMkTqQbLXYMSzWOrpNtw","title":"Package","pathname":"/flutter/architecture-code/package","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"arrows-to-circle","description":"Package - Store the Best of Your Code for Your Projects","breadcrumbs":[{"label":"Architecture code"}]},{"id":"xhCc6xkN0EOAzEhnIdww","title":"Dart Workspace and Melos","pathname":"/flutter/architecture-code/dart-workspace-melos","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"boxes-stacked","description":"Use Dart Workspace for consistent dependency resolution and Melos to orchestrate commands in a Flutter monorepo","breadcrumbs":[{"label":"Architecture code"}]},{"id":"3Eh62eld4JjEvdiZuUZE","title":"MQTT and App Lifecycle","pathname":"/flutter/system/mqtt-realtime-app-lifecycle","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"tower-broadcast","description":"How I organize MQTT when the app enters the background, preserve subscriptions, and restore data when it returns to the foreground","breadcrumbs":[{"label":"System"}]},{"id":"MnpADg71Yuu0vcuuCWTo","title":"Context Anywhere","pathname":"/flutter/state-management/context-anywhere","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"message-middle","description":"Guide to Setting Up and Accessing BuildContext Anywhere in a Flutter Project","breadcrumbs":[{"label":"State management"}]},{"id":"V3SeIz7l08DCG5hi9prc","title":"Bloc","pathname":"/flutter/state-management/bloc","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"rectangles-mixed","description":"","breadcrumbs":[{"label":"State management"}]},{"id":"tFi0DZUoGC2jkEso9Mqu","title":"ChangeNotifier","pathname":"/flutter/state-management/changenotifier","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"light-ceiling","description":"Controlling Widgets with ChangeNotifier","breadcrumbs":[{"label":"State management"}]},{"id":"flT55X8RgxKD0XpLXtUC","title":"Redux/Flutter Redux at Scale","pathname":"/flutter/state-management/redux-flutter-redux-large-app","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"diagram-project","description":"Organize Redux and Flutter Redux by feature so a global store remains manageable as the application grows","breadcrumbs":[{"label":"State management"}]},{"id":"YyM552Bk6JgngO4Jb0D9","title":"Redux Epics and RxDart","pathname":"/flutter/state-management/redux-epics-rxdart","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"wave-square","description":"Choose the correct concurrency strategy in Redux Epics to prevent duplicate requests and stale results from overwriting state","breadcrumbs":[{"label":"State management"}]},{"id":"GoLrUH02g4WSVray7nHP","title":"Clean code","pathname":"/flutter/clean-code/clean-code","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"broom-wide","description":"Best Practices for Writing Clean and Understandable Code in Flutter Team Development","breadcrumbs":[{"label":"Clean code"}]},{"id":"GYRjxkG3zMjUYpCTRcv4","title":"Coverage","pathname":"/flutter/clean-code/coverage-codecov","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"chart-simple","description":"Upload Flutter test coverage to Codecov and show a badge in README","breadcrumbs":[{"label":"Clean code"}]},{"id":"tbmomLDMDlD9EJkGgiw7","title":"Git hook","pathname":"/flutter/clean-code/git-hook","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"code-branch","description":"Run commands automatically when using Git commands","breadcrumbs":[{"label":"Clean code"}]},{"id":"5gKOCHnCinMIWgGm3uxB","title":"BDD with Flutter Gherkin","pathname":"/flutter/quality/bdd-flutter-gherkin","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"list-check","description":"How I keep Gherkin feature files while migrating BDD flows from Flutter Driver to integration_test and WidgetTester","breadcrumbs":[{"label":"Quality"}]},{"id":"v7aRB1u6516kfIK3yStm","title":"Enum","pathname":"/flutter/my-dart/enum","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"spider-web","description":"The Power of Enums in Simplifying Code","breadcrumbs":[{"label":"MY DART"}]},{"id":"DDwBamhA1zlGZaY4h0sH","title":"Dark Mode","pathname":"/flutter/ui/dark-mode","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"circle-half-stroke","description":"Setting Up Light/Dark Mode and Fonts in a Flutter App","breadcrumbs":[{"label":"UI"}]},{"id":"CTKWji67N7nUi8hjGxHc","title":"Responsive","pathname":"/flutter/ui/responsive","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"arrow-up-right-and-arrow-down-left-from-center","description":"Responsive Screen Guide in Flutter","breadcrumbs":[{"label":"UI"}]},{"id":"4HPxogOT3HRVQ8Hwj6mG","title":"Multi-Language","pathname":"/flutter/ui/multi-language","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"earth-asia","description":"Language Switching in Flutter Without Third-Party Packages","breadcrumbs":[{"label":"UI"}]},{"id":"nTBlb18opkIcuVJhsaxA","title":"Core UI","pathname":"/flutter/ui/core-ui","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"transporter","description":"Reusing the UI You Have Built","breadcrumbs":[{"label":"UI"}]},{"id":"89PR5qCrqkpCHnbR1iiD","title":"Salt","pathname":"/flutter/security/salt","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"salt-shaker","description":"Password Security in Flutter Apps: AES Encryption with Salt and IV","breadcrumbs":[{"label":"Security"}]},{"id":"Fbl8YWIUovHWvjb7NUlz","title":"Secure Storage: Keychain and Keystore","pathname":"/flutter/security/secure-storage-keychain-keystore","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"key","description":"How I preserve the old state when iOS Keychain is temporarily unavailable and prevent a Secure Storage write from destroying data","breadcrumbs":[{"label":"Security"}]},{"id":"Uxl2ZCTTHotwyeBqW6SB","title":"Fastlane - Google Play","pathname":"/flutter/easy-operation/fastlane-google-play","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"code-branch","description":"Build Flutter apps and automatically upload to Google Play with Fastlane (free)","breadcrumbs":[{"label":"Easy Operation"}]},{"id":"g61dHdAGfBEB5glZyihO","title":"Firebase App Distribution (Android)","pathname":"/flutter/easy-operation/firebase-app-distribution","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"cloud-arrow-up","description":"Upload Flutter Android apps to Firebase App Distribution for manual and automated testing with GitHub Actions","breadcrumbs":[{"label":"Easy Operation"}]},{"id":"4e9GljIu9iyAhYIPgfEq","title":"Web","pathname":"/flutter/pain-point/web","siteSpaceId":"sitesp_0rtZe","lang":"en","icon":"browser","description":"Flutter Web Issues: Performance, SEO, and More","breadcrumbs":[{"label":"pain point"}]},{"id":"iyowa0ioX6DQ7pJNsmJk","title":"Welcome","pathname":"/flutter/tieng-viet","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"hand-wave","description":"🚀 Chào mừng bạn đến với phong cách code Flutter của tôi!"},{"id":"LhBkNdlWs4s7vwxPy41d","title":"Tip Code Faster","pathname":"/flutter/tieng-viet/easy-code/tip-code-faster","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"comet","description":"","breadcrumbs":[{"label":"easy code"}]},{"id":"MqMetTVBVJZv2ziVK6cV","title":"FVM","pathname":"/flutter/tieng-viet/easy-code/fvm","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"code-branch","description":"Cố định phiên bản Flutter cho nhóm của bạn với FVM","breadcrumbs":[{"label":"easy code"}]},{"id":"avWBt8m7YYWaWKzP4m63","title":"Make","pathname":"/flutter/tieng-viet/easy-code/make","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"terminal","description":"Sử dụng Make để chạy nhiều lệnh Flutter chỉ bằng một lệnh ngắn","breadcrumbs":[{"label":"easy code"}]},{"id":"BZxU0uMvFSnvb7iIlAoE","title":"Easy Maintain","pathname":"/flutter/tieng-viet/easy-code/easy-maintain","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"person-digging","description":"Giảm khối lượng công việc bảo trì và duy trì","breadcrumbs":[{"label":"easy code"}]},{"id":"5srjGksGo7VZhxUHoUsm","title":"Mason","pathname":"/flutter/tieng-viet/easy-code/mason","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"explosion","description":"Code Flutter Nhanh hơn với Mason","breadcrumbs":[{"label":"easy code"}]},{"id":"SPxjpFiWNKo8chmOREFO","title":"Log Color","pathname":"/flutter/tieng-viet/easy-code/log-color","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"palette","description":"Thiết lập log màu và lưu log vào bộ nhớ thiết bị","breadcrumbs":[{"label":"easy code"}]},{"id":"oKAXzhhYQ5NBc4OxQbOm","title":"Activity Diagram","pathname":"/flutter/tieng-viet/easy-code/activity-diagram","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"head-side-brain","description":"","breadcrumbs":[{"label":"easy code"}]},{"id":"7u99hvMKoyFLBI1NWET3","title":"FFmpeg Flutter","pathname":"/flutter/tieng-viet/media/ffmpeg-flutter","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"monero","description":"Xử lý video bằng FFmpeg trong Flutter","breadcrumbs":[{"label":"Media"}]},{"id":"Ljda9TIhyoWyAOkfPEp7","title":"Plugin","pathname":"/flutter/tieng-viet/architecture-code/plugin","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"puzzle-piece-simple","description":"Plugin: Giao tiếp với code native để bảo trì app Flutter hiệu quả","breadcrumbs":[{"label":"Architecture code"}]},{"id":"ViSS9f3QYjTsiffTL9D0","title":"Flutter Clean Architecture","pathname":"/flutter/tieng-viet/architecture-code/flutter-clean-architecture","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"ram","description":"Dễ dàng bảo trì và mở rộng code Flutter với Clean Architecture","breadcrumbs":[{"label":"Architecture code"}]},{"id":"XvPIjyKnRoIX3EqGtWPM","title":"Base Project","pathname":"/flutter/tieng-viet/architecture-code/base-project","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"atom","description":"Tạo một Base Project trong Flutter","breadcrumbs":[{"label":"Architecture code"}]},{"id":"laKGZvIGOclFqBLPK7Wp","title":"Flavor","pathname":"/flutter/tieng-viet/architecture-code/flavor","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"sliders","description":"Thiết lập 3 môi trường (dev, staging, production) cho mobile trong Flutter (3 apps riêng biệt)","breadcrumbs":[{"label":"Architecture code"}]},{"id":"gmpXWgFdCeCNoXvjUBFD","title":"Package","pathname":"/flutter/tieng-viet/architecture-code/package","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"arrows-to-circle","description":"Package - Lưu trữ code tốt nhất cho bạn Dự án","breadcrumbs":[{"label":"Architecture code"}]},{"id":"XsK6Wu3b5bUHseUvSGIi","title":"Dart Workspace và Melos","pathname":"/flutter/tieng-viet/architecture-code/dart-workspace-melos","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"boxes-stacked","description":"Dùng Dart Workspace để thống nhất dependency và Melos để điều phối command trong Flutter monorepo","breadcrumbs":[{"label":"Architecture code"}]},{"id":"T29uurcgn1sW9NojEYEk","title":"MQTT và App Lifecycle","pathname":"/flutter/tieng-viet/system/mqtt-realtime-app-lifecycle","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"tower-broadcast","description":"Cách tôi tổ chức hệ thống MQTT khi app vào background, giữ subscription và khôi phục dữ liệu lúc quay lại foreground","breadcrumbs":[{"label":"System"}]},{"id":"oDLVcKklQYxUTUKkGqA5","title":"Context Anywhere","pathname":"/flutter/tieng-viet/state-management/context-anywhere","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"message-middle","description":"Hướng dẫn thiết lập và truy cập BuildContext mọi nơi trong dự án Flutter","breadcrumbs":[{"label":"State management"}]},{"id":"7AmPwNg3DjB3TqNy4DLs","title":"Bloc","pathname":"/flutter/tieng-viet/state-management/bloc","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"rectangles-mixed","description":"","breadcrumbs":[{"label":"State management"}]},{"id":"MaZr4HNaUI1zBiJrZ14x","title":"ChangeNotifier","pathname":"/flutter/tieng-viet/state-management/changenotifier","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"light-ceiling","description":"Kiểm soát Widget bằng ChangeNotifier","breadcrumbs":[{"label":"State management"}]},{"id":"wBMCVgywK0KHFY2xfIAm","title":"Redux/Flutter Redux ở quy mô lớn","pathname":"/flutter/tieng-viet/state-management/redux-flutter-redux-large-app","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"diagram-project","description":"Tổ chức Redux và Flutter Redux theo feature để global store vẫn dễ kiểm soát khi ứng dụng phát triển lớn","breadcrumbs":[{"label":"State management"}]},{"id":"tTdynMtjfRKxROJ4K1AG","title":"Redux Epics và RxDart","pathname":"/flutter/tieng-viet/state-management/redux-epics-rxdart","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"wave-square","description":"Chọn đúng concurrency strategy trong Redux Epics để tránh request trùng và kết quả cũ ghi đè state","breadcrumbs":[{"label":"State management"}]},{"id":"MtOV7xbzk1axacaQHCe3","title":"Clean code","pathname":"/flutter/tieng-viet/clean-code/clean-code","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"broom-wide","description":"Các phương pháp tốt nhất để viết Clean Code rõ ràng, dễ hiểu khi phát triển Flutter theo team","breadcrumbs":[{"label":"Clean code"}]},{"id":"h9feLtxoklHc7Bheuw0C","title":"Coverage","pathname":"/flutter/tieng-viet/clean-code/coverage-codecov","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"chart-simple","description":"Tải test coverage Flutter lên Codecov và hiển thị huy hiệu trong README","breadcrumbs":[{"label":"Clean code"}]},{"id":"wuuXszd3izJ4iT3WXfmn","title":"Git hook","pathname":"/flutter/tieng-viet/clean-code/git-hook","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"code-branch","description":"Chạy lệnh tự động khi sử dụng lệnh Git","breadcrumbs":[{"label":"Clean code"}]},{"id":"IyI3mRDrQ0ZD2DrBKrD6","title":"BDD với Flutter Gherkin","pathname":"/flutter/tieng-viet/quality/bdd-flutter-gherkin","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"list-check","description":"Cách tôi giữ Gherkin feature file nhưng migrate từng luồng BDD từ Flutter Driver sang integration_test và WidgetTester","breadcrumbs":[{"label":"Quality"}]},{"id":"AMfIbARKhAU4zoW94NWZ","title":"Enum","pathname":"/flutter/tieng-viet/my-dart/enum","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"spider-web","description":"Sức mạnh của Enums trong việc đơn giản hóa Code","breadcrumbs":[{"label":"MY DART"}]},{"id":"rSDmu6kQxU406E0dOxiC","title":"Dark Mode","pathname":"/flutter/tieng-viet/ui/dark-mode","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"circle-half-stroke","description":"Thiết lập chế độ sáng/tối và phông chữ trong app Flutter","breadcrumbs":[{"label":"UI"}]},{"id":"qYBP2s2tbhzAoC1t8zTw","title":"Responsive","pathname":"/flutter/tieng-viet/ui/responsive","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"arrow-up-right-and-arrow-down-left-from-center","description":"Hướng dẫn về Responsive trong Flutter","breadcrumbs":[{"label":"UI"}]},{"id":"lsX0YxMOW5jhaQk6mEnn","title":"Multi-Language","pathname":"/flutter/tieng-viet/ui/multi-language","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"earth-asia","description":"Chuyển đổi ngôn ngữ trong Flutter mà không cần plugin","breadcrumbs":[{"label":"UI"}]},{"id":"qTZwLroP289MyP3Iy08b","title":"Core UI","pathname":"/flutter/tieng-viet/ui/core-ui","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"transporter","description":"Sử dụng lại giao diện UI mà bạn đã xây dựng","breadcrumbs":[{"label":"UI"}]},{"id":"7EKuPaqGQzkS85MM4wzU","title":"Salt","pathname":"/flutter/tieng-viet/security/salt","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"salt-shaker","description":"Bảo mật mật khẩu trong app Flutter: Mã hóa AES bằng Salt và IV","breadcrumbs":[{"label":"Security"}]},{"id":"9ZiwRYPRTf0ann29VBsg","title":"Secure Storage: Keychain và Keystore","pathname":"/flutter/tieng-viet/security/secure-storage-keychain-keystore","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"key","description":"Cách tôi giữ state cũ khi iOS Keychain tạm thời không phản hồi và ngăn một lần ghi Secure Storage làm mất dữ liệu","breadcrumbs":[{"label":"Security"}]},{"id":"PUFmfLfpHag5qXZy4UPf","title":"Fastlane - Google Play","pathname":"/flutter/tieng-viet/easy-operation/fastlane-google-play","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"code-branch","description":"Tự động tải app Flutter lên Google Play với Fastlane (miễn phí)","breadcrumbs":[{"label":"Easy Operation"}]},{"id":"dMD5i35qcUb7MkqiPbRK","title":"Firebase App Distribution (Android)","pathname":"/flutter/tieng-viet/easy-operation/firebase-app-distribution","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"cloud-arrow-up","description":"Tải app Flutter Android lên Firebase App Distribution tự động để kiểm tra thủ công","breadcrumbs":[{"label":"Easy Operation"}]},{"id":"TpIEFuNHe6IKNKnUgegt","title":"Web","pathname":"/flutter/tieng-viet/pain-point/web","siteSpaceId":"sitesp_ugPNg","lang":"vi","icon":"browser","description":"Flutter Các vấn đề về web: Hiệu suất, SEO và hơn thế nữa","breadcrumbs":[{"label":"pain point"}]}]}