Tạo Project flutter
- Để tạo một project flutter ta dùng lệnh sau
 
flutter create --org com.yourdomain your_app_name
- 
Trong đó:
your_app_nametên ứng dụng của bạn. Lưu ý đặt theo format.--org com.yourcompanylàapplicationId(Android) hayPRODUCT_BUNDLE_IDENTIFIER(iOS)
 - 
Và để chạy ứng dụng ta dùng lệnh
 
flutter run
Cấu trúc dự án
- Sau khi đã tạo được project flutter thì đầu tiên chúng ta cùng tìm hiểu cấu trúc của một dự án flutter
 

- Trong đó:
android: Nơi chứa code native của Androidbuildsẽ được tạo khi Flutter được thực thi lần đầu tiên. Nó chứa các tệp được tạo cần thiết để chạy ứng dụng trên các nền tảng khác nhau.ios: Nơi chứa code native của iOSlib: Nơi chứa mã ứng dụng của bạn. Chúng ta sẽ triển khai mã nguồn của dự án tại đây.test: Đây là thư mực chứa các file để chúng ta viết các unit-test case.pubspec.yaml: Là nơi khai báo các thư viện, config hệ thống.- Ngoài ra các bạn còn có thể tạo thêm thư mục trong quá trình phát triển, ví dụ như thư mục assets để chứa các file hình ảnh
 
 - Đó là những thư mục và file cơ bản của một project flutter và còn một số thư mục nữa chúng ta sẽ tìm hiểu sau trong quá trình học tập.
 
main.dart
- Khi các bạn mở thư mục lib các bạn sẽ thấy một file tên 
main.dartcó nội dụng như sau 
void main() {
  runApp(MyApp());
}
// MyApp()
- Đây chính là hàm main và sẽ được chạy đầu tiên trong project.
 - Bên trong main gọi hàm 
runAppvới đối tượng làMyApp()được truyền vào. 
MyApp()
class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const HomePage(),
    );
  }
}
- Trong đó ta thấy 
MyAppkế thừaStatelessWidgetvà ghi đè phương thứcbuildtrả vềMaterialApp, là một widget cung cấp cho lập trình viên một bộ khung trong quá trình phát triển ứng dụng nhưtitle,theme,home. Mỗi ứng dụng Flutter chỉ nên chứa 1MaterialApp. - Và trong 
MaterialAppta lại thấy cóhomevới đối tượng làMyHomePage() 

StatelessWidget
- Khi màn hình chúng ta không cần thay đổi gì về nội dung (hiển thị tĩnh) thì sẽ kế thừa 
StatelessWidgetvà khi kế thừa StatelessWidget thì chúng ta phải ghi đè phương thứcbuildnhư ở trên. 
class HomePage extends StatelessWidget {
  const HomePage({super.key});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Home'),
        backgroundColor: Colors.blueAccent,
        ),
        body: const Center(
          child: Text('Hello, World!'),
        ),
      );
  }
}
- Ở đây chúng ta thấy khi ghi đè build sẽ trả về 1 đối tượng 
Scaffold, là 1 widget cung cấp cho lập trình viên một bộ khung chứa sẵn các thuộc tính quan trong để xây dựng giao diện 1 màn hình nhưappBar,body,FloatingActionButton,… - Trong Scaffold ta thấy có khai báo 
appBarvới một đối tượng làAppBarcó thuộc tính title là mộtTextvà body được truyền vào 1 widget làCentercó child widget làText 
StatefulWidget
- Khi bạn tạo page cần thay đổi nội thì sẽ kế thừa 
StatefulWidgetvà sẽ có một chút thay đổi. - Khi sử dụng StatefulWidget sẽ có điểm khác là bạn phải khai báo 2 class là 
Statevàwidget - Mục đích của class này là duy trì state khi Flutter re-render các widget
 
class CounterPage extends StatefulWidget {
}
class _CounterPageState extends State<CounterPage> {
}
- 
Ở đây
CounterPagelà widget và_CounterPageStatelà State - 
Sử dụng tiền tố _ của State thì để xem nó là sở hữu riêng của StatefulWidget.
 - 
Khi kế thừa StatefulWidget sẽ cần override
createStateđể tạo đối tượng State 
class CounterPage extends StatefulWidget {
  const CounterPage({Key? key}) : super(key: key);
  @override
  _CounterPageState createState() => _CounterPageState();
}
- Còn khi kế thừa State<> thì cần override 
buildđể tạo các widget 
class _CounterPageState extends State<CounterPage> {
  var count = 0;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Home"),
          backgroundColor: Colors.blue,
        ),
        body: Center(
          child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Count: $count'),
            OutlinedButton(
              onPressed: () {
                setState(() {
                  count++;
                });
              },
              child: const Text('Click Me'),
            )
          ],
        ),)
      );
  }
}
- Ở đây đây chúng ta khai báo 1 biến 
count = 0và 1Scaffoldcó chứa 1Columnmà bên trong có 1Textvà 1OutlinedButton - Khi ấn vào nút (
onPressed) thì chúng ta sẽ gọi hàmsetState()để set lại giá trị cho biến count = count + 1, có nghĩa là mỗi lần ấn nút thì giá trị count sẽ tăng lên 1. 

Tổng kết
- Tạo một project flutter bằng command line
 - Cấu trúc của một dự án Flutter
 - Cách sử dụng 
StatelessWidgetvàStatefulWidget 
Nguồn tham khảo
- Bài viết được tham khảo từ các nguồn tài liệu của đồng nghiệp
 - Series và Dart và Flutter của fxstudio