Lập trình Flutter

Cách chạy Flutter trên Android/iOS/Web

13/11/2025 Đặng Trí Thanh 389 lượt xem ~17 phút đọc
Mục lục bài viết
    Cách chạy Flutter trên Android/iOS/Web

    Cách chạy Flutter trên Android/iOS/Web

    Flutter trên các nền tảng

    Giới thiệu

    Flutter là một framework phát triển ứng dụng đa nền tảng của Google, cho phép bạn xây dựng ứng dụng cho Android, iOS và Web từ một codebase duy nhất. Bài viết này sẽ hướng dẫn bạn cách cài đặt và chạy ứng dụng Flutter trên các nền tảng khác nhau.

    Yêu cầu hệ thống

    Windows

    • Windows 7 SP1 trở lên (64-bit)
    • Git for Windows
    • Android Studio
    • Visual Studio Code (khuyến nghị)

    macOS

    • macOS 10.14 trở lên
    • Xcode (cho iOS)
    • Android Studio
    • Visual Studio Code (khuyến nghị)

    Linux

    • Ubuntu 18.04 trở lên
    • Android Studio
    • Visual Studio Code (khuyến nghị)

    Cài đặt Flutter SDK

    1. Tải Flutter SDK từ trang chủ Flutter: https://flutter.dev/docs/get-started/install

    2. Giải nén file tải về vào thư mục mong muốn (ví dụ: C:srcflutter trên Windows)

    3. Thêm đường dẫn Flutter vào biến môi trường PATH:

      • Windows: Thêm C:srcflutterbin vào PATH
      • macOS/Linux: Thêm export PATH="$PATH:pwd/flutter/bin" vào ~/.bashrc hoặc ~/.zshrc
    4. Kiểm tra cài đặt bằng lệnh:

      flutter doctor

    Cài đặt cho Android

    1. Cài đặt Android Studio từ: https://developer.android.com/studio

    2. Cài đặt Android SDK:

      • Mở Android Studio
      • Vào Tools > SDK Manager
      • Chọn “SDK Platforms” và cài đặt Android SDK
      • Chọn “SDK Tools” và cài đặt:
        • Android SDK Build-Tools
        • Android SDK Command-line Tools
        • Android Emulator
        • Android SDK Platform-Tools
    3. Tạo máy ảo Android (AVD):

      • Mở Android Studio
      • Vào Tools > AVD Manager
      • Click “Create Virtual Device”
      • Chọn thiết bị và phiên bản Android
      • Hoàn tất quá trình tạo AVD
    4. Kiểm tra cài đặt:

      flutter doctor --android-licenses
      flutter doctor

    Cài đặt cho iOS (chỉ macOS)

    1. Cài đặt Xcode từ Mac App Store

    2. Cài đặt các công cụ dòng lệnh:

      xcode-select --install
    3. Chấp nhận giấy phép Xcode:

      sudo xcodebuild -license accept
    4. Cài đặt CocoaPods:

      sudo gem install cocoapods
    5. Kiểm tra cài đặt:

      flutter doctor

    Cài đặt cho Web

    1. Bật hỗ trợ web trong Flutter:

      flutter config --enable-web
    2. Kiểm tra cài đặt:

      flutter doctor

    Tạo và chạy ứng dụng Flutter

    Tạo ứng dụng mới

    flutter create my_app
    cd my_app

    Chạy trên Android

    1. Kết nối thiết bị Android:

      • Bật chế độ Developer Options trên điện thoại
      • Bật USB Debugging
      • Kết nối điện thoại với máy tính qua USB
      • Chấp nhận yêu cầu debug trên điện thoại
    2. Kiểm tra thiết bị đã kết nối:

      flutter devices
    3. Chạy ứng dụng:

      flutter run

    Chạy ứng dụng Flutter trên Android

    Khi chạy lệnh flutter run, bạn sẽ thấy:

    • Terminal hiển thị quá trình build và chạy ứng dụng
    • Ứng dụng được cài đặt và chạy trên thiết bị Android
    • Giao diện ứng dụng hiển thị với AppBar, nội dung và nút Floating Action Button
    • Có thể sử dụng các phím tắt để tương tác với ứng dụng

    Chạy trên iOS (chỉ macOS)

    1. Mở Xcode và chấp nhận giấy phép

    2. Kết nối thiết bị iOS hoặc khởi động máy ảo iOS

    3. Chạy ứng dụng:

      flutter run

    Chạy trên Web

    1. Chạy ứng dụng:
      flutter run -d chrome

    Các lệnh hữu ích

    Kiểm tra thiết bị đang kết nối

    flutter devices

    Chạy trên thiết bị cụ thể

    flutter run -d <device-id>

    Build ứng dụng

    Android:

    flutter build apk

    iOS:

    flutter build ios

    Web:

    flutter build web

    Xử lý lỗi thường gặp

    Lỗi Android SDK

    • Kiểm tra biến môi trường ANDROID_HOME
    • Cập nhật Android SDK Tools
    • Chấp nhận giấy phép Android SDK

    Lỗi iOS

    • Cập nhật Xcode
    • Chạy pod install trong thư mục ios
    • Kiểm tra quyền truy cập

    Lỗi Web

    • Xóa thư mục build: flutter clean
    • Cập nhật Flutter: flutter upgrade
    • Kiểm tra phiên bản Chrome

    Kết luận

    Flutter cung cấp một cách tiếp cận thống nhất để phát triển ứng dụng đa nền tảng. Với các hướng dẫn trên, bạn có thể bắt đầu phát triển ứng dụng Flutter cho Android, iOS và Web. Hãy nhớ luôn cập nhật Flutter SDK và các công cụ phát triển để có trải nghiệm tốt nhất.


    Tài liệu tham khảo

    Cấu hình IDE

    Visual Studio Code

    1. Cài đặt Flutter và Dart extensions:

      • Mở VS Code
      • Vào Extensions (Ctrl+Shift+X)
      • Tìm và cài đặt:
        • Flutter
        • Dart
        • Flutter Widget Snippets
        • Awesome Flutter Snippets
    2. Cấu hình VS Code:

      • Format on Save: Bật tính năng tự động format code
      • Flutter Hot Reload: Cấu hình phím tắt
      • Flutter DevTools: Cài đặt công cụ debug

    Android Studio

    1. Cài đặt Flutter và Dart plugins:

      • Mở Android Studio
      • Vào File > Settings > Plugins
      • Tìm và cài đặt:
        • Flutter
        • Dart
    2. Cấu hình Android Studio:

      • Flutter SDK Path: Chỉ định đường dẫn Flutter SDK
      • Dart SDK Path: Tự động phát hiện
      • Flutter Hot Reload: Cấu hình phím tắt

    Cấu trúc dự án Flutter

    my_app/
    ├── android/          # Mã nguồn Android
    ├── ios/             # Mã nguồn iOS
    ├── lib/             # Mã nguồn Dart chính
    │   ├── main.dart    # Điểm khởi đầu ứng dụng
    │   ├── screens/     # Các màn hình
    │   ├── widgets/     # Các widget tái sử dụng
    │   ├── models/      # Các model dữ liệu
    │   ├── services/    # Các service
    │   └── utils/       # Các tiện ích
    ├── test/            # Unit tests và widget tests
    ├── web/             # Mã nguồn Web
    └── pubspec.yaml     # File cấu hình dự án

    Quản lý dependencies

    Thêm package mới

    1. Tìm package trên pub.dev

    2. Thêm vào pubspec.yaml:

      dependencies:
      flutter:
       sdk: flutter
      http: ^1.1.0
      provider: ^6.0.5
    3. Cài đặt dependencies:

      flutter pub get

    Cập nhật dependencies

    flutter pub upgrade

    Hot Reload và Hot Restart

    Hot Reload

    • Giữ nguyên state của ứng dụng
    • Cập nhật UI và logic
    • Phím tắt: r trong terminal hoặc Ctrl+S trong VS Code

    Hot Restart

    • Reset toàn bộ ứng dụng
    • Mất state hiện tại
    • Phím tắt: R trong terminal hoặc Ctrl+Shift+S trong VS Code

    Debug và Testing

    Debug

    1. Sử dụng print:

      print('Debug message');
    2. Sử dụng debugPrint:

      debugPrint('Debug message with timestamp');
    3. Sử dụng breakpoints trong IDE

    Unit Testing

    void main() {
      test('Counter increments', () {
        final counter = Counter();
        counter.increment();
        expect(counter.value, 1);
      });
    }

    Widget Testing

    void main() {
      testWidgets('Counter increments smoke test', (WidgetTester tester) async {
        await tester.pumpWidget(MyApp());
        expect(find.text('0'), findsOneWidget);
        await tester.tap(find.byIcon(Icons.add));
        await tester.pump();
        expect(find.text('1'), findsOneWidget);
      });
    }

    Tối ưu hóa hiệu suất

    Build Release

    # Android
    flutter build apk --release
    
    # iOS
    flutter build ios --release
    
    # Web
    flutter build web --release

    Tối ưu hóa hình ảnh

    1. Sử dụng Image.asset với cacheWidth và cacheHeight
    2. Nén hình ảnh trước khi sử dụng
    3. Sử dụng const cho các widget tĩnh

    Tối ưu hóa memory

    1. Sử dụng const constructor
    2. Tránh tạo widget không cần thiết
    3. Sử dụng ListView.builder thay vì ListView

    Triển khai ứng dụng

    Android

    1. Tạo keystore:

      keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload
    2. Cấu hình android/app/build.gradle:

      android {
       signingConfigs {
           release {
               storeFile file("upload-keystore.jks")
               storePassword "******"
               keyAlias "upload"
               keyPassword "******"
           }
       }
       buildTypes {
           release {
               signingConfig signingConfigs.release
           }
       }
      }
    3. Build APK:

      flutter build apk --release

    iOS

    1. Cấu hình Xcode:

      • Chọn team development
      • Cấu hình Bundle Identifier
      • Cấu hình version và build number
    2. Archive và upload:

      • Product > Archive
      • Distribute App

    Web

    1. Build cho production:

      flutter build web --release
    2. Triển khai lên hosting:

      • Firebase Hosting
      • GitHub Pages
      • Netlify
      • Vercel

    Các công cụ hữu ích

    Flutter DevTools

    1. Khởi động DevTools:

      flutter run --debug
    2. Tính năng chính:

      • Performance profiling
      • Memory analysis
      • Network inspection
      • Widget inspector

    Flutter Inspector

    1. Mở trong IDE
    2. Kiểm tra widget tree
    3. Debug layout issues

    Flutter Performance

    1. Timeline view
    2. Frame rendering
    3. Memory usage

    Best Practices

    Code Style

    1. Tuân thủ Dart Style Guide
    2. Sử dụng flutter format để format code
    3. Sử dụng flutter analyze để kiểm tra lỗi

    Architecture

    1. Sử dụng BLoC hoặc Provider cho state management
    2. Tách biệt business logic và UI
    3. Sử dụng repository pattern

    Performance

    1. Tránh rebuild không cần thiết
    2. Sử dụng const constructor
    3. Tối ưu hóa hình ảnh và assets

    Tài nguyên học tập

    Documentation

    Courses

    Communities

    Chạy và hiển thị kết quả trên Android

    Tạo ứng dụng mẫu

    1. Tạo project mới:

      flutter create my_first_app
      cd my_first_app
    2. Mở file lib/main.dart và thay thế nội dung:

      
      import 'package:flutter/material.dart';

    void main() {
    runApp(const MyApp());
    }

    class MyApp extends StatelessWidget {
    const MyApp({super.key});

    @override
    Widget build(BuildContext context) {
    return MaterialApp(
    title: ‘Flutter Demo’,
    theme: ThemeData(
    primarySwatch: Colors.blue,
    useMaterial3: true,
    ),
    home: const MyHomePage(title: ‘Flutter Demo Home Page’),
    );
    }
    }

    class MyHomePage extends StatefulWidget {
    const MyHomePage({super.key, required this.title});
    final String title;

    @override
    State createState() => _MyHomePageState();
    }

    class _MyHomePageState extends State {
    int _counter = 0;

    void _incrementCounter() {
    setState(() {
    _counter++;
    });
    }

    @override
    Widget build(BuildContext context) {
    return Scaffold(
    appBar: AppBar(
    backgroundColor: Theme.of(context).colorScheme.inversePrimary,
    title: Text(widget.title),
    ),
    body: Center(
    child: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
    const Text(
    ‘Bạn đã nhấn nút này nhiều lần:’,
    ),
    Text(
    ‘$_counter’,
    style: Theme.of(context).textTheme.headlineMedium,
    ),
    ],
    ),
    ),
    floatingActionButton: FloatingActionButton(
    onPressed: _incrementCounter,
    tooltip: ‘Tăng’,
    child: const Icon(Icons.add),
    ),
    );
    }
    }

    Chạy ứng dụng trên Android

    1. Kết nối thiết bị Android:

      • Bật chế độ Developer Options trên điện thoại
      • Bật USB Debugging
      • Kết nối điện thoại với máy tính qua USB
      • Chấp nhận yêu cầu debug trên điện thoại
    2. Kiểm tra thiết bị đã kết nối:

      flutter devices
    3. Chạy ứng dụng:

      flutter run

    Các phím tắt khi chạy ứng dụng

    • r: Hot reload (cập nhật UI mà không mất state)
    • R: Hot restart (khởi động lại ứng dụng)
    • q: Thoát ứng dụng
    • p: Hiển thị widget tree
    • o: Chuyển đổi giữa Android và iOS
    • w: Chuyển sang chế độ web

    Debug trên thiết bị Android

    1. Sử dụng Flutter DevTools:

      flutter run --debug
    2. Mở DevTools trong trình duyệt:

      • Performance tab: Kiểm tra hiệu suất
      • Memory tab: Kiểm tra bộ nhớ
      • Network tab: Kiểm tra kết nối mạng
      • Widget Inspector: Kiểm tra cấu trúc widget

    Xử lý lỗi thường gặp trên Android

    1. Lỗi “Waiting for another flutter command to release the startup lock”:

      rm ~/flutter/bin/cache/lockfile
    2. Lỗi “Failed to install the following Android SDK packages”:

      flutter doctor --android-licenses
    3. Lỗi “Unable to find git in your PATH”:

      • Cài đặt Git
      • Thêm Git vào PATH

    Tối ưu hóa hiển thị trên Android

    1. Cấu hình AndroidManifest.xml:

      <manifest ...>
       <application
           android:label="My First App"
           android:icon="@mipmap/ic_launcher">
           <activity
               android:name=".MainActivity"
               android:exported="true"
               android:launchMode="singleTop"
               android:theme="@style/LaunchTheme"
               android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
               android:hardwareAccelerated="true"
               android:windowSoftInputMode="adjustResize">
               <meta-data
                   android:name="io.flutter.embedding.android.NormalTheme"
                   android:resource="@style/NormalTheme" />
               <intent-filter>
                   <action android:name="android.intent.action.MAIN"/>
                   <category android:name="android.intent.category.LAUNCHER"/>
               </intent-filter>
           </activity>
           <meta-data
               android:name="flutterEmbedding"
               android:value="2" />
       </application>
      </manifest>
    2. Cấu hình styles.xml:

      <?xml version="1.0" encoding="utf-8"?>
      <resources>
       <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
           <item name="android:windowBackground">@drawable/launch_background</item>
       </style>
       <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
           <item name="android:windowBackground">?android:colorBackground</item>
       </style>
      </resources>

    Tạo APK để cài đặt

    1. Build APK:

      flutter build apk
    2. Cài đặt APK:

      flutter install

    hoặc tìm file APK tại:

    build/app/outputs/flutter-apk/app-release.apk

    Kiểm tra hiệu suất

    1. Sử dụng Flutter Performance:

      flutter run --profile
    2. Kiểm tra các chỉ số:

      • FPS (Frames per second)
      • Memory usage
      • CPU usage
      • GPU usage

    Tùy chỉnh giao diện Android

    1. Thay đổi theme:

      MaterialApp(
      theme: ThemeData(
       primarySwatch: Colors.blue,
       brightness: Brightness.light,
       useMaterial3: true,
      ),
      darkTheme: ThemeData(
       brightness: Brightness.dark,
       useMaterial3: true,
      ),
      themeMode: ThemeMode.system,
      // ...
      )
    2. Tùy chỉnh status bar:

      SystemChrome.setSystemUIOverlayStyle(
      SystemUiOverlayStyle(
       statusBarColor: Colors.transparent,
       statusBarIconBrightness: Brightness.dark,
      ),
      );
    3. Tùy chỉnh navigation bar:

      SystemChrome.setSystemUIOverlayStyle(
      SystemUiOverlayStyle(
       systemNavigationBarColor: Colors.white,
       systemNavigationBarIconBrightness: Brightness.dark,
      ),
      );

    Trader hiện đại và cách chạy flutter trên

    Trader chuyên nghiệp ngày nay không chỉ đọc biểu đồ mà còn dùng cách chạy flutter trên để tự động hóa phân tích, kiểm tra chiến lược và quản lý rủi ro. Python giúp biến ý tưởng thành công cụ một cách nhanh chóng.

    Bài viết trình bày chi tiết về cách chạy flutter trên, từ thiết lập môi trường đến ví dụ áp dụng thực tế trong quy trình giao dịch hằng ngày.

    Thiết lập môi trường nhanh

    # Cài đặt các thư viện cần thiết
    pip install pandas numpy matplotlib requests
    # kiểm tra phiên bản
    import pandas as pd
    print(pd.__version__)

    Sau khi cài đặt, bạn có thể bắt đầu nạp dữ liệu giá, tính chỉ báo và vẽ biểu đồ. Quy trình lặp nhanh giúp bạn thử nghiệm nhiều ý tưởng trong thời gian ngắn.

    Các bài toán thường gặp của trader

    Bài toán Mô tả Thư viện
    Tải giá Lấy OHLCV từ sàn requests, ccxt
    Tính chỉ báo SMA, RSI, MACD pandas, ta-lib
    Backtest Mô phỏng chiến lược backtrader, vectorbt
    Cảnh báo Thông báo tín hiệu telegram, twilio
    Quản lý vốn Tính khối lượng numpy

    Ví dụ: tính RSI và phát hiện tín hiệu

    def rsi(close, period=14):
        delta = close.diff()
        gain = delta.clip(lower=0).rolling(period).mean()
        loss = (-delta.clip(upper=0)).rolling(period).mean()
        rs = gain / loss
        return 100 - (100 / (1 + rs))
    df['rsi'] = rsi(df['close'])
    print(df[['close', 'rsi']].tail())

    RSI trên 70 cho thấy vùng quá mua, dưới 30 là quá bán. Đây là tín hiệu tham khảo, cần kết hợp thêm xu hướng và khối lượng trước khi vào lệnh.

    Sai lầm phổ biến và cách tránh

    Sai lầm Vì sao nguy hiểm Cách tránh
    Dùng dữ liệu demo thay live Không đúng thực tế Kiểm tra dữ liệu thật
    Bỏ qua phí & trượt giá Lợi nhuận ảo Mô phỏng chi phí thực
    Overfitting tham số Chiến lược không ổn định Giữ tham số ít, hợp lý
    Không kiểm soát rủi ro Cháy tài khoản Đặt stop loss mọi lệnh

    Câu hỏi thường gặp về cách chạy flutter trên

    Tôi mới bắt đầu, học cách chạy flutter trên từ đâu?

    Bắt đầu từ việc nạp dữ liệu và tính chỉ báo cơ bản. Làm được hai việc này, bạn đã có nền tảng để xây dựng công cụ của riêng mình.

    Có cần giỏi toán không?

    Chỉ cần kiến thức thống kê cơ bản. Các thư viện đã đóng gói sẵn hầu hết phép tính, bạn chỉ cần hiểu ý nghĩa để dùng đúng.

    Dùng bot tự động có an toàn không?

    An toàn khi bạn hiểu rõ logic, quản lý rủi ro tốt và giám sát thường xuyên. Chạy demo trước khi dùng tiền thật.

    Kết luận

    Cách Chạy Flutter Trên giúp trader tiết kiệm thời gian, tăng độ chính xác và giảm căng thẳng. Hãy xây dựng từng bước, kiểm chứng kỹ lưỡng và luôn ưu tiên quản lý rủi ro.

    Ví dụ thực tế về cách chạy flutter trên

    Để minh họa rõ hơn, chúng ta xét một ví dụ thực tế áp dụng cách chạy flutter trên. Giả sử bạn muốn triển khai nó vào công việc hằng ngày: bắt đầu từ việc xác định mục tiêu, thu thập dữ liệu cần thiết, rồi thực hiện từng bước.

    Bước đầu tiên, hãy liệt kê các tài nguyên và công cụ bạn đang có. Bước thứ hai, xây dựng một phiên bản tối giản nhất có thể chạy được. Bước thứ ba, kiểm tra kết quả trên dữ liệu nhỏ trước khi mở rộng.

    # ví dụ tối giản: chạy thử từng bước
    def step_1():
        print('Thu thập dữ liệu')
    def step_2():
        print('Xử lý và phân tích')
    def step_3():
        print('Đánh giá kết quả')
    for f in (step_1, step_2, step_3):
        f()

    Kết quả ban đầu có thể chưa hoàn hảo, nhưng quan trọng là bạn có một vòng lặp làm → đo → học. Mỗi vòng lặp giúp bạn hiểu sâu hơn và cải thiện chất lượng.

    Điều chỉnh sau khi thử nghiệm

    Sau vòng lặp đầu tiên, hãy ghi lại những gì hoạt động tốt và những gì chưa. Dựa trên đó, điều chỉnh một tham số tại một thời điểm để dễ dàng xác định nguyên nhân của sự thay đổi.

    So sánh các cách tiếp cận cách chạy flutter trên

    Không có một cách duy nhất để áp dụng cách chạy flutter trên. Tùy vào bối cảnh, bạn có thể chọn cách làm thủ công, bán tự động hoặc tự động hoàn toàn. Mỗi cách có ưu nhược điểm riêng cần cân nhắc.

    Tiêu chí Thủ công Bán tự động Tự động
    Tốc độ Chậm Trung bình Nhanh
    Độ chính xác Phụ thuộc con người Khá ổn định Ổn định, nhất quán
    Chi phí đầu tư Thấp Trung bình Cao
    Khả năng mở rộng Hạn chế Khá tốt Rất tốt
    Rủi ro sai sót Cao Trung bình Thấp nếu đúng quy trình
    Phù hợp khi Bắt đầu, khối lượng nhỏ Đang phát triển Khối lượng lớn, dài hạn

    Lời khuyên là hãy bắt đầu với cách thủ công có hỗ trợ của công cụ, hiểu rõ quy trình, rồi mới tự động hóa từng phần. Điều này giúp bạn kiểm soát rủi ro và có nền tảng kiến thức vững chắc.

    Khi nào nên nâng cấp cách tiếp cận

    Bạn nên nâng cấp khi khối lượng công việc tăng đến mức thủ công không theo kịp, hoặc khi bạn đã hiểu đủ rõ quy trình để tin tưởng giao cho máy tính thực hiện. Đừng tự động hóa một quy trình mà bạn chưa hiểu.

    Lộ trình triển khai cách chạy flutter trên từng bước

    Việc triển khai cách chạy flutter trên hiệu quả cần một lộ trình rõ ràng. Chia nhỏ mục tiêu lớn thành các giai đoạn có thể kiểm tra được giúp bạn duy trì động lực và dễ dàng điều chỉnh khi gặp vướng mắc.

    Giai đoạn Công việc chính Kết quả mong đợi
    Tuần 1 Học khái niệm, chuẩn bị công cụ Hiểu bản chất, môi trường sẵn sàng
    Tuần 2 Xây dựng phiên bản tối giản Có sản phẩm chạy được
    Tuần 3 Kiểm thử và đánh giá Báo cáo kết quả, phát hiện lỗi
    Tuần 4 Tối ưu và mở rộng Chất lượng cải thiện rõ rệt
    Tuần 5+ Vận hành và duy trì Hệ thống ổn định, cải tiến liên tục

    Ở mỗi giai đoạn, hãy dành thời gian ghi chép lại quá trình. Nhật ký công việc không chỉ giúp bạn nhớ lại mà còn là tài liệu quý để đối chiếu khi kết quả không như mong đợi.

    Tiêu chí hoàn thành mỗi giai đoạn

    Mỗi giai đoạn nên có tiêu chí hoàn thành rõ ràng. Ví dụ: ‘có thể chạy được với dữ liệu mẫu’, ‘không còn lỗi chặn’, ‘kết quả được ghi lại’. Tiêu chí rõ ràng giúp bạn biết chính xác khi nào nên chuyển sang bước tiếp theo.

    Học Flutter bài bản

    Nếu bạn muốn học có lộ trình và có người sửa bài thay vì tự ghép tài liệu, xem khóa học Flutter Cơ Bản (28 buổi, từ con số 0 đến app đầu tiên). Chưa biết nên bắt đầu ở đâu? Đọc bài so sánh học lập trình mobile ở TPHCM.

    .hndl-embed-wrap{max-width:800px;margin:28px auto 24px}
    .hndl-embed-wrap iframe{display:block;width:100% !important;max-width:100% !important;border:0;background:#fff;height:470px}
    @media (max-width:640px){.hndl-embed-wrap iframe{height:520px}}

    Đặng Trí Thanh

    Đặng Trí Thanh

    Giám đốc Công nghệ · DNT Digital · Giảng viên HNDL Hướng Nghiệp Dữ Liệu

    834
    Bài viết
    15.4k
    Người theo dõi
    120k+
    Lượt đọc

    Đặng Trí Thanh — Founder & CTO · Hướng Nghiệp Dữ Liệu – DNT Digital. Chuyên đào tạo và triển khai thực chiến Python, MT5 và hệ thống bot auto trading / IB cho học viên và doanh nghiệp.

    document.addEventListener(‘DOMContentLoaded’, function() {
    const btn = document.getElementById(‘hndl-btn-follow’);
    const countSpan = document.getElementById(‘hndl-follower-count’);
    if (!btn || !countSpan) return;

    const authorId = ‘3’;
    const storageKey = ‘hndl_followed_author_’ + authorId;

    // Kiểm tra trạng thái đã follow từ LocalStorage
    let isFollowed = localStorage.getItem(storageKey) === ‘true’;

    function updateUI() {
    if (isFollowed) {
    btn.textContent = ‘Đang theo dõi’;
    btn.classList.add(‘active’);
    countSpan.textContent = ‘15.5k’;
    } else {
    btn.textContent = ‘Theo dõi’;
    btn.classList.remove(‘active’);
    countSpan.textContent = ‘15.4k’;
    }
    }

    updateUI();

    btn.addEventListener(‘click’, function() {
    isFollowed = !isFollowed;
    localStorage.setItem(storageKey, isFollowed ? ‘true’ : ‘false’);

    // Hiệu ứng micro-animation
    btn.style.transform = ‘scale(0.95)’;
    setTimeout(() => {
    btn.style.transform = ‘none’;
    updateUI();
    }, 100);
    });
    });

    Bài viết liên quan về Flutter

    Tham khảo thêm khóa học lập trình Flutter đa nền tảng của Hướng Nghiệp Dữ Liệu.

    .hndl-embed-wrap{max-width:800px;margin:28px auto 24px}
    .hndl-embed-wrap iframe{display:block;width:100% !important;max-width:100% !important;border:0;background:#fff;height:470px}
    @media (max-width:640px){.hndl-embed-wrap iframe{height:520px}}

    Đặng Trí Thanh

    Đặng Trí Thanh

    Giám đốc Công nghệ · DNT Digital · Giảng viên HNDL Hướng Nghiệp Dữ Liệu

    1.397
    Bài viết
    15.4k
    Người theo dõi
    120k+
    Lượt đọc

    Đặng Trí Thanh — Founder & CTO · Hướng Nghiệp Dữ Liệu – DNT Digital. Chuyên đào tạo và triển khai thực chiến Python, MT5 và hệ thống bot auto trading / IB cho học viên và doanh nghiệp.

    document.addEventListener(‘DOMContentLoaded’, function() {
    const btn = document.getElementById(‘hndl-btn-follow’);
    const countSpan = document.getElementById(‘hndl-follower-count’);
    if (!btn || !countSpan) return;

    const authorId = ‘1’;
    const storageKey = ‘hndl_followed_author_’ + authorId;

    // Kiểm tra trạng thái đã follow từ LocalStorage
    let isFollowed = localStorage.getItem(storageKey) === ‘true’;

    function updateUI() {
    if (isFollowed) {
    btn.textContent = ‘Đang theo dõi’;
    btn.classList.add(‘active’);
    countSpan.textContent = ‘15.5k’;
    } else {
    btn.textContent = ‘Theo dõi’;
    btn.classList.remove(‘active’);
    countSpan.textContent = ‘15.4k’;
    }
    }

    updateUI();

    btn.addEventListener(‘click’, function() {
    isFollowed = !isFollowed;
    localStorage.setItem(storageKey, isFollowed ? ‘true’ : ‘false’);

    // Hiệu ứng micro-animation
    btn.style.transform = ‘scale(0.95)’;
    setTimeout(() => {
    btn.style.transform = ‘none’;
    updateUI();
    }, 100);
    });
    });

    Đặng Trí Thanh

    Đặng Trí Thanh

    Giám đốc Công nghệ · DNT Digital · Giảng viên HNDL Hướng Nghiệp Dữ Liệu
    1.398 Bài viết
    15.4k Người theo dõi
    120k+ Lượt đọc

    Đặng Trí Thanh — Founder & CTO · Hướng Nghiệp Dữ Liệu - DNT Digital. Chuyên đào tạo và triển khai thực chiến Python, MT5 và hệ thống bot auto trading / IB cho học viên và doanh nghiệp.

    Bài viết liên quan

    DNT DIGITAL

    🤖 AI CODE: Vibe Code NEEDED! 🚀 🏦 SSI • DNSE • MT5 • Bitget ⚡

    Zalo 0934145100
    Khóa đào tạo
    Hỗ trợ

    Được học lại miễn phí · Hỗ trợ trọn đời · Cập nhật miễn phí

    Đội ngũ hỗ trợ

    Đặng Trí Thanh
    Đặng Trí Thanh
    Giám đốc Công nghệ DNT Digital
    Zalo 0934145100
    Mộng Cầm
    Mộng Cầm
    Hỗ trợ khách hàng · Huấn luyện viên
    Zalo 0927909257
    Khánh Linh
    Khánh Linh
    Hỗ trợ khách hàng · Huấn luyện viên
    Zalo 0927909582