Category: Mobile Development

  • Hướng dẫn Riverpod trong Flutter (Flutter Riverpod Tutorial)

    Hướng dẫn Riverpod trong Flutter (Flutter Riverpod Tutorial)

    Hướng dẫn Riverpod trong Flutter
    (Flutter Riverpod Tutorial)

    Trong Flutter có rất nhiều cách quản lý state như Provider, Bloc, GetX, Redux,… Mỗi cách đều có những ưu nhược điểm riêng. Trong số đó, có 3 phương pháp quản lý state phổ biến hơn cả là Provider (được team Flutter của Google đề xuất sử dụng), Boc (được rất nhiều lập trình viên chuyên nghiệp khuyên dùng) và gần đây nhất là GetX được đông đảo người mới tiếp cận Flutter lựa chọn nhờ sự đơn giản, dễ sử dụng.

    Mời bạn xem danh sách video hướng dẫn quản lý trạng thái trong flutter:

    Provider có một số hạn chết nhất định và Riverpod chính là bản nâng cấp của Provider để khắc phục những hạn chế đó.

    Có thể bạn không để ý, “Riverpod” chính là các chữ cái của “Provider” được sắp xếp lại.

    Riverpod trong Flutter có gì khác Provider?

    Nhược điểm của Provider

    Theo thiết kế, Provider là một cải tiến của InheritedWidget và nó phụ thuộc vào các widget của Flutter. Bạn sẽ sử dụng các widget mặc định của Flutter xây dựng lên ứng dụng của mình.

    Việc kết hợp các Provider rất dài dòng, việc trộn lẫn giữa UI code và dependency injection khiến code rất khó đọc. (Để hiểu dependency injection mời bạn xem video sau https://www.youtube.com/watch?v=SVqHgRbwBLs)

    Hãy tưởng tượng bạn có MySecondClass phụ thuộc vào MyFirstClass.

    main.dart

    class MySecondClass {
     final MyFirstClass myFirstClass;
     MySecondClass(this.myFirstClass);
     }

    Khi đó, để tạo provider MySecondClass bạn sẽ phải viết code lồng nhau rất phức tạp. Tưởng tượng bạn có khoảng 10 class phụ thuộc nhau thì code sẽ như một mớ bùi nhùi 😟

    main.dart
    class MyWidget extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Provider(
          create: (context) => MyFirstClass(),
          child: ProxyProvider<MyFirstClass, MySecondClass>(
            update: (context, firstClass, previous) => MySecondClass(firstClass),
            child: MyVisibleWidget(),
          ),
        );
      }
    }

    Thứ hai, Provider chỉ dựa vào “type” để tìm các đối tượng mà bạn cần. Nếu bạn có hai đối tượng cùng “type”, bạn chỉ có thể nhận được đối tượng gần nhất.

    main.dart

    class MyWidget extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Provider(
          create: (context) => 'A String far away.',
          child: Provider(
            create: (context) => 'A String that is close.',
            builder: (context, child) {
              // Displays 'A String that is close.'
              // There's no way to obtain 'A String far away.'
              return Text(Provider.of<String>(context));
            },
          ),
        );
      }
    }

    Cuối cùng, nếu bạn cố gắng truy cập vào một “type” không được cung cấp, bạn sẽ chỉ gặp lỗi khi chạy. Bên trong bất kỳ widget nào, bạn có thể truy cập tới các Provider của mình theo type với cú pháp sau:

    Provider.of<MyType>(context)

    Nhưng nếu bạn không cẩn thận, có thể gặp lỗi với ProviderNotFoundException khi chạy chương trình, dù lúc biên dịch chương trình hoàn toàn không báo lỗi. Điều này không phải là lý tưởng vì chúng ta phải luôn cố gắng bắt càng nhiều lỗi càng tốt tại thời điểm compile-time.

    Hướng dẫn Riverpod trong Flutter (Flutter Riverpod Tutorial) 1

    Ưu điểm của Riverpod

    • Compile safe: Không còn gặp lỗi ProviderNotFoundException hoặc quên xử lý các trạng thái loading. Sử dụng Riverpod, nếu code được biên dịch thành công, nó sẽ hoạt động theo đúng ý bạn.
    • Provider, without its limitations: Riverpod có hỗ trợ multiple provider có cùng type; kết hợp các providers không đồng bộ; thêm providers từ mọi nơi, …
    • Không phụ thuộc vào Flutter: Create/share/tests providers, with no dependency on Flutter. Điều này bao gồm việc có thể listen providers mà không cần một BuildContext.

    2. Cách sử dụng Riverpod trong Flutter

    Hướng dẫn Riverpod trong Flutter (Flutter Riverpod Tutorial) 2

    Bước 1. Thêm thư viện riverpod

    Đầu tiên ta cần thêm package riverpod vào file pubspec.yaml trong dự án Flutter của bạn. Trong bài này, ta sẽ sử dụng flutter_riverpod, ngoài ra còn có hooks_riverpodriverpod.

    pubspec.yaml

    dependencies:
      flutter:
        sdk: flutter
      flutter_riverpod: ^0.12.1

    Bước 2. Khai báo biến toàn cục

    Riverpod’s Providers không được đặt trong widget tree. Thay vào đó, chúng là các biến toàn cục nằm ở bất kỳ file nào mà bạn muốn.

    final greetingProvider = Provider((ref) => 'Hello Riverpod!');

    Provider đơn giản nhất này có thể cung cấp một giá trị read-only. Có nhiều loại Providers khác nữa để làm việc với Futures, Streams, ChangeNotifier, StateNotifier,…

    Tham số ref có kiểu ProviderReference. Bạn sẽ thấy ở phần sau, nó chủ yếu được sử dụng để giải quyết sự phụ thuộc giữa các Provider.

    Mặc dù Provider object có thể truy cập toàn cục, nhưng điều này không có nghĩa là provided object (trong trường hợp này là chuỗi “Hello Riverpod!”) là global. Giống như với một hàm toàn cục, bạn có thể gọi nó từ bất cứ đâu nhưng giá trị trả về cũng có thể trở thành phạm vi cục bộ. Hãy xem xét đoạn code sau:

    function_analogy.dart
    String globalFunction() {
      return 'some value';
    }
    
    class MyClass {
      void _classMethod() {
        final valueLocalToThisMethod = globalFunction();
      }
    }

    Bước 3. ProviderScope

    Sau khi cài đặt xong Riverpod, chúng ta cần bao widget gốc của mình bằng ProviderScope.

    Gói Riverpod chỉ đi kèm với một InheritedWidget duy nhất cần được đặt phía trên toàn bộ widget trê được gọi là ProviderScope. Nó chịu trách nhiệm giữ một thứ gọi là ProviderContainer, thứ này có trách nhiệm lưu trữ trạng thái của các đối tượng Provider riêng lẻ.

    main.dart
    void main() {
      runApp(
        ProviderScope(
          child: MyApp(),
        ),
      );
    }

    Bước 4. Theo dõi một provider

    Làm cách nào để chúng ta lấy được string từ greetingProvider để có thể hiển thị trong Text? Thực tế có hai cách để làm điều đó.

    main.dart

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Riverpod Tutorial',
          home: Scaffold(
            appBar: AppBar(
              title: Text('Riverpod Tutorial'),
            ),
            body: Center(
              child: Text('greeting goes here'),
            ),
          ),
        );
      }
    }

    Cách đầu tiên là thay đổi superclass tiện thành ConsumerWidget của package flutter_riverpod. Điều này thêm một tham số ScopedReader vào phương thức build của class đó. Widget sẽ được rebuild nếu có bất kỳ sự thay đổi nào xảy ra.

    main.dart

    class MyApp extends ConsumerWidget {
      @override
      Widget build(BuildContext context, ScopedReader watch) {
        // Gets the string from the provider and causes
        // the widget to rebuild when the value changes.
        final greeting = watch(greetingProvider);
    
        return MaterialApp(
          title: 'Riverpod Tutorial',
          home: Scaffold(
            appBar: AppBar(
              title: Text('Riverpod Tutorial'),
            ),
            body: Center(
              child: Text(greeting),
            ),
          ),
        );
      }
    }

    Cách khác để nhận được giá trị từ provider là dùng Consumer, cách này sẽ hữu ích nếu bạn muốn nhanh chóng tối ưu hóa việc xây dựng lại widget con của mình, không muốn các widget khác cũng phải rebuild lại theo. Trong trường hợp này ta chỉ cần xây dựng lại Text widget bản bị ảnh hưởng trên toàn bộ cây widget.

    main.dart

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Riverpod Tutorial',
          home: Scaffold(
            appBar: AppBar(
              title: Text('Riverpod Tutorial'),
            ),
            body: Center(
              child: Consumer(
                builder: (context, ref, child) {
                  final greeting = ref.watch(greetingProvider);
                  return Text(greeting);
                },
              ),
            ),
          ),
        );
      }
    }
    

    Đọc một provider

    Đôi khi, không thể gọi “watch” vì bạn không ở trong phương thức build. Hoặc bạn chỉ muốn lấy giá trị từ provider ra chứ không muốn widget sẽ rebuild. Ví dụ: bạn có thể muốn thực hiện một hành động khi một nút được nhấn. Đó là khi bạn có thể gọi context.read(). Dưới đây là một loại provider khác – ChangeNotifierProvider:

    main.dart
    class IncrementNotifier extends ChangeNotifier {
      int _value = 0;
      int get value => _value;
    
      void increment() {
        _value += 1;
        notifyListeners();
      }
    }
    
    final incrementProvider = ChangeNotifierProvider((ref) => IncrementNotifier());

    Ta sẽ lấy ví dụ với Counter App. Text widget sẽ theo “watch” provider và tự động được rebuilt nếu xảy ra thay đổi và FloatingActionButton sẽ chỉ đọc provider để gọi phương thức increment() trên đó.

    main.dart

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Riverpod Tutorial',
          home: Scaffold(
            body: Center(
              child: Consumer(
                builder: (context, watch, child) {
                  final incrementNotifier = watch(incrementProvider);
                  return Text(incrementNotifier.value.toString());
                },
              ),
            ),
            floatingActionButton: FloatingActionButton(
              onPressed: () {
                context.read(incrementProvider).increment();
              },
              child: Icon(Icons.add),
            ),
          ),
        );
      }
    }

    3. Những điểm tuyệt vời của Riverpod

    Sử dụng nhiều provider cùng type

    Riverpod’s providers objects không dựa vào types để tìm kiếm các provider, nên có nhiều provider cùng type mà không gặp vấn đề gì
    example.dart
    final firstStringProvider = Provider((ref) => 'First');
    final secondStringProvider = Provider((ref) => 'Second');
    
    // Somewhere inside a ConsumerWidget
    final first = watch(firstStringProvider);
    final second = watch(secondStringProvider);

    Dependency between providers

    Bất kỳ ứng dụng nào trong thực tế đều có sự phụ thuộc giữa các lớp. Ví dụ: bạn có thể có ChangeNotifier phụ thuộc vào Repository,mà nó lại phụ thuộc vào HttpClient. Xử lý các phụ thuộc như vậy với Riverpod rất đơn giản và dễ đọc.

    Với ví dụ đơn giản sau, chỉ có một FutureProvider phụ thuộc trực tiếp vào một FakeHttpClient. Việc getting một provider khác bên trong function của provider được thực hiện bằng cách gọi read trên tham số ProviderReference – ref luôn được chuyển vào. Nếu bạn phụ thuộc vào provider có giá trị có thể thay đổi, bạn cũng có thể gọi watch.

    main.dart

    class FakeHttpClient {
      Future<String> get(String url) async {
        await Future.delayed(const Duration(seconds: 1));
        return 'Response from $url';
      }
    }
    
    final fakeHttpClientProvider = Provider((ref) => FakeHttpClient());
    final responseProvider = FutureProvider<String>((ref) async {
      final httpClient = ref.read(fakeHttpClientProvider);
      return httpClient.get('https://resocoder.com');
    });

    Sử dụng các giá trị từ FutureProvider từ UI thay cho FutureBuilders rất tuyệt vời. Riverpod giúp việc xây dựng các widgets dựa trên Future một cách dễ dàng.

    main.dart

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Riverpod Tutorial',
          home: Scaffold(
            body: Center(
              child: Consumer(
                builder: (context, watch, child) {
                  final responseAsyncValue = watch(responseProvider);
                  return responseAsyncValue.map(
                    data: (_) => Text(_.value),
                    loading: (_) => CircularProgressIndicator(),
                    error: (_) => Text(
                      _.error.toString(),
                      style: TextStyle(color: Colors.red),
                    ),
                  );
                },
              ),
            ),
          ),
        );
      }
    }

    Passing arguments to providers

    Nếu bạn muốn chuyển một URL do người dùng xác định đến responseProvider? Hãy dùng family, thay đổi responseProvider thành như sau…

    main.dart

    final responseProvider =
        FutureProvider.family<String, String>((ref, url) async {
      final httpClient = ref.read(fakeHttpClientProvider);
      return httpClient.get(url);
    });

    Bạn có thể thử thay đổi chuỗi URL được mã hóa cứng và bạn sẽ thấy rằng hàm này sẽ FutureProvider chạy lại hàm tạo của nó mỗi khi bạn thay đổi chuỗi được truyền vào.

    main.dart

    final responseAsyncValue = watch(responseProvider('https://resocoder.com'));

    Automatically disposing of state

    Bộ nhớ đệm cho provider’s state là rất tuyệt nhưng đôi khi bạn muốn hủy trạng thái của một provider khi nó không còn được sử dụng nữa vì nhiều lý do như:

    • Khi sử dụng Firebase, bạn muốn đóng connect để tránh các phí phát sinh
    • Để thiết lập lại trạng thái khi người dùng rời khỏi màn hình và vào lại.
    main.dart
    final responseProvider =
        FutureProvider.autoDispose.family<String, String>((ref, url) async {
      final httpClient = ref.read(fakeHttpClientProvider);
      return httpClient.get(url);
    });

    autoDispose sẽ loại bỏ provider’s state ngay khi provider không được sử dụng. Trong ví dụ trên, điều này xảy ra ta thay đổi đối số được truyền vào provider family. Tuy nhiên, autoDispose hữu ích ngay cả khi bạn không sử dụng family modifier. Trong trường hợp đó, việc xóa bỏ được bắt đầu khi ConsumerWidget một provider bị disposed.

    Bài viết được biên tập từ https://resocoder.com/2020/11/27/flutter-riverpod-tutorial-the-better-provider/

  • Các câu hỏi phỏng vấn Flutter

    Các câu hỏi phỏng vấn Flutter

    Các câu hỏi phỏng vấn Flutter

    Flutter ngày càng được nhiều người quan tâm nhờ khả năng phát triển app đa nền tảng. Dưới đây, chúng tôi giới thiệu Các câu hỏi phỏng vấn Flutter để bạn đọc tham khảo. Bạn có thể xem thêm KINH NGHIỆM PHỎNG VẤN FLUTTER.

    Flutter là gì?

    Flutter là một bộ công cụ giao diện người dùng để tạo các ứng dụng di động nhanh, đẹp, được biên dịch nguyên bản với một ngôn ngữ lập trình và một cơ sở code duy nhất. Nó là một framework phát triển code nguồn mở được phát triển bởi Google. Nói chung, Flutter không phải là một ngôn ngữ; nó là một SDK. Ứng dụng Flutter sử dụng ngôn ngữ lập trình Dart để tạo ứng dụng. Phiên bản alpha đầu tiên của Flutter được phát hành vào tháng 5 năm 2017.

    Flutter chủ yếu được tối ưu hóa cho các ứng dụng di động 2D có thể chạy trên cả nền tảng Android và iOS. Chúng tôi cũng có thể sử dụng nó để tạo các ứng dụng đầy đủ tính năng, bao gồm máy ảnh, bộ nhớ, vị trí địa lý, mạng, SDK của bên thứ ba, v.v.

    Mời bạn xem giới thiệu chi tiết hơn tại bài Flutter là gì?

    Dart là gì?

    Dart là một ngôn ngữ lập trình hướng đối tượng, có mục đích chung với cú pháp kiểu C. Nó là code nguồn mở và được phát triển bởi Google vào năm 2011. Mục đích của lập trình Dart là tạo giao diện người dùng frontend cho web và ứng dụng di động. Nó là một ngôn ngữ quan trọng để tạo ứng dụng Flutter. Ngôn ngữ Dart có thể được biên dịch cả AOT (Ahead-of-Time) và JIT (Just-in-Time.

    Học Flutter có cần học Dart không?

    Có, việc học ngôn ngữ Dart để xây dựng ứng dụng Flutter là rất cần thiết. Vì Flutter chỉ là một bộ khung (framework) sử dụng ngôn ngữ Dart để tạo nên ứng dụng.

    Flutter có miễn phí không?

    Có. Flutter hoàn toàn miễn phí và mã nguồn mở.

    Widget trong Flutter là gì?

    Một ứng dụng Flutter luôn được coi là một cây các material. Bất cứ khi nào bạn định viết code để xây dựng bất cứ thứ gì trong Flutter, nó sẽ nằm bên trong một widget. Các widget mô tả chế độ xem ứng dụng của bạn trông như thế nào với cấu hình và trạng thái hiện tại của chúng. Khi bạn thực hiện bất kỳ thay đổi nào trong code, widget con sẽ xây dựng lại mô tả của nó bằng cách tính toán sự khác biệt của widget con hiện tại và trước đó để xác định những thay đổi tối thiểu đối với việc hiển thị trong giao diện người dùng của ứng dụng.

    Các widget được lồng vào nhau để xây dựng ứng dụng. Nó có nghĩa là thư mục gốc của ứng dụng của bạn tự nó là một widget và tất cả các cách nhìn xuống cũng là một widget. Ví dụ: một widget có thể hiển thị một cái gì đó, có thể xác định thiết kế, có thể xử lý tương tác, v.v.

    Sự khác nhau giữa Stateful Widget và Stateless Widget?

    Một widget Stateful có thông tin state. Nó được gọi là động vì nó có thể thay đổi dữ liệu bên trong trong suốt thời gian tồn tại của widget. Một widget cho phép chúng ta làm mới màn hình được gọi là Stateful widget. widget con này không có phương thức build(). Nó có phương thức createState(), trả về một lớp mở rộng Lớp state Flutters. Các ví dụ về widget Stateful là Checkbox, Radio, Slider, InkWell, Form và TextField.

    widget không trạng thái(Stateless) không có bất kỳ thông tin trạng thái nào. Nó vẫn tĩnh trong suốt vòng đời của nó. Ví dụ về widget không trạng thái là Văn bản, Hàng, Cột, Vùng chứa, v.v. Nếu màn hình hoặc widget chứa nội dung tĩnh, nó phải là widget Stateless, nhưng nếu bạn muốn thay đổi nội dung, nó cần phải là widget Stateful.

    Các trình soạn thảo tốt nhất để phát triển Flutter là gì?

    Các công cụ phát triển Flutter cho phép phát triển Flutter nhanh hơn và do đó thúc đẩy quy trình làm việc của nhà phát triển. Flutter IDE và các công cụ cần một số plugin để phát triển các ứng dụng di động. Các plugin giúp chúng tôi biên dịch, phân tích code và phát triển Flutter. IDE phổ biến cho sự phát triển của Flutter như sau:

    • Android Studio
    • Visual Studio
    • IntelliJ IDEA
    • Xcode

    Tệp pubspec.yaml là gì?

    Đó là tệp cấu hình của dự án sẽ sử dụng rất nhiều trong quá trình làm việc với dự án Flutter. Nó cho phép bạn cách ứng dụng của bạn hoạt động. Nó cũng cho phép chúng tôi thiết lập các ràng buộc cho ứng dụng. Tệp này chứa:

    • Cài đặt chung của dự án như tên, mô tả và phiên bản của dự án.
    • Sự phụ thuộc của dự án.
    • Nội dung dự án (ví dụ: hình ảnh, âm thanh, v.v.).

    Các gói và plugin trong Flutter là gì?

    Gói là một nhóm các loại lớp, giao diện và gói con tương tự nhau. Các gói và plugin giúp chúng tôi xây dựng ứng dụng mà không cần phải phát triển mọi thứ từ các gói. Trong Flutter, nó cho phép bạn nhập các widget hoặc chức năng mới vào ứng dụng. Các gói và plugin có một sự khác biệt rất nhỏ. Nói chung, các gói là các thành phần mới hoặc code được viết bằng ngôn ngữ Dart, trong khi các plugin cho phép nhiều chức năng hơn trên thiết bị bằng cách sử dụng code gốc. Trong DartPub, cả gói và plugin đều được gọi là gói.

    Ưu điểm của Flutter là gì?

    Các câu hỏi phỏng vấn Flutter 3

    Các ưu điểm phổ biến của Flutter framework như sau:

    • Phát triển đa nền tảng: Tính năng này cho phép Flutter viết code một lần, duy trì và có thể chạy trên các nền tảng khác nhau. Nó tiết kiệm thời gian, công sức và tiền bạc của các nhà phát triển.
    • Phát triển nhanh hơn: Hiệu suất của ứng dụng Flutter rất nhanh. Flutter biên dịch ứng dụng bằng cách sử dụng thư viện nhánh C / C ++ giúp ứng dụng gần với code máy hơn và mang lại cho ứng dụng hiệu suất gốc tốt hơn.
    • Cộng đồng tốt: Flutter có hỗ trợ cộng đồng tốt, nơi các nhà phát triển có thể hỏi các vấn đề và nhận được kết quả nhanh chóng.
    • Tải lại trực tiếp và nóng: Nó làm cho quá trình phát triển ứng dụng cực kỳ nhanh chóng. Tính năng này cho phép chúng tôi thay đổi hoặc cập nhật code được phản ánh ngay sau khi các thay đổi được thực hiện.
    • code tối thiểu: Ứng dụng Flutter được phát triển bởi ngôn ngữ lập trình Dart, sử dụng biên dịch JIT và AOT để cải thiện thời gian khởi động tổng thể, hoạt động và tăng tốc hiệu suất. JIT nâng cao hệ thống phát triển và làm mới giao diện người dùng mà không cần nỗ lực thêm vào việc xây dựng hệ thống mới.
    • Tập trung vào giao diện người dùng: Nó có giao diện người dùng tuyệt vời vì nó sử dụng widget tập trung vào thiết kế, các công cụ phát triển cao, API nâng cao và nhiều tính năng khác.
    • Tài liệu: Flutter có hỗ trợ tài liệu rất tốt. Nó được tổ chức và nhiều thông tin hơn. Chúng ta có thể lấy mọi thứ mà chúng ta muốn viết ở một nơi.

    Bạn có thể cài đặt Flutter bằng cách nào?

    Để cài đặt và chạy Flutter trên hệ thống Windows, MacOS trước tiên bạn cần đáp ứng các yêu cầu này đối với môi trường phát triển của mình.

    Hệ điều hành Windows 7 trở lên (Tôi là Windows 10. Bạn cũng có thể sử dụng Mac hoặc Linux OS.).
    Dung lượng đĩa 400 MB (Nó không bao gồm không gian đĩa cho IDE / công cụ).
    Công cụ 1. Windows PowerShell2. Git dành cho Windows 2.x (Tại đây, Sử dụng Git từ tùy chọn Dấu nhắc Lệnh của Windows).
    SDK Flutter SDK dành cho Windows
    IDE Android Studio (Chính thức)

    Mời bạn tham khảo thêm Cài đặt Flutter với Visual Studio Code

    So sánh Flutter và React Native?

    • Flutter và React Native đều được sử dụng để phát triển ứng dụng kết hợp gốc từ một cơ sở code duy nhất. Các ứng dụng này có thể chạy trên nền tảng iOS và Android.
    • React Native do Facebook phát triển, trong khi framework công tác Flutter lần đầu tiên được giới thiệu bởi Google. Vì vậy, cả hai framework đều có tính năng và tính cộng đồng rất tốt.
    • Flutter sử dụng ngôn ngữ Dart để tạo ứng dụng, trong khi React Native sử dụng JavaScript để xây dựng ứng dụng.
    • Theo quan điểm của nhà phát triển, rất khó để lựa chọn trong số chúng. Do đó, rất khó để chọn ra người chiến thắng giữa Flutter và React Native.

    Tại sao build app Flutter lần đầu tiên mất nhiều thời gian?

    Khi bạn dựng ứng dụng Flutter lần đầu tiên, sẽ mất nhiều thời gian hơn. Đó là do Flutter đã xây dựng tệp APK hoặc IPA dành riêng cho thiết bị. Do đó, Gradle và Xcode được sử dụng để xây dựng tệp, mất nhiều thời gian.

    Tại sao thư mục Android và iOS lại nằm trong dự án Flutter?

    • Android: Thư mục này chứa một dự án Android hoàn chỉnh. Nó được sử dụng khi bạn tạo ứng dụng Flutter cho Android. Khi code Flutter được biên dịch thành code gốc, nó sẽ được đưa vào dự án Android này, do đó kết quả là một ứng dụng Android gốc. Ví dụ : Khi bạn đang sử dụng trình giả lập Android, dự án Android này được sử dụng để xây dựng ứng dụng Android, được triển khai thêm cho Thiết bị ảo Android.
    • iOS: Thư mục này chứa một dự án Mac hoàn chỉnh. Nó được sử dụng khi bạn xây dựng ứng dụng Flutter cho iOS. Nó tương tự như thư mục Android, được sử dụng khi phát triển ứng dụng cho Android. Khi code Flutter được biên dịch thành code gốc, nó sẽ được đưa vào dự án iOS này, để kết quả là một ứng dụng iOS gốc. Chỉ có thể xây dựng ứng dụng Flutter cho iOS khi bạn đang làm việc trên macOS và Xcode IDE.

    Tween Animation là gì?

    Đây là hình thức rút gọn của in-betweening. Trong hoạt ảnh tween, bắt buộc phải xác định điểm đầu và điểm cuối của hoạt ảnh. Nó có nghĩa là hoạt ảnh bắt đầu với giá trị bắt đầu, sau đó đi qua một loạt các giá trị trung gian và cuối cùng đạt đến giá trị kết thúc. Nó cũng cung cấp dòng thời gian và đường cong, xác định thời gian và tốc độ của quá trình chuyển đổi. framework công cụ cung cấp tính toán về cách chuyển đổi từ điểm đầu và điểm cuối.

    Giải thích Hot Reload trong Flutter?

    Tính năng tải lại nóng cho phép bạn nhanh chóng và dễ dàng thực hiện một thử nghiệm trong dự án. Nó giúp xây dựng giao diện người dùng, thêm các tính năng mới, sửa lỗi và phát triển ứng dụng nhanh chóng. Để thực hiện tải lại nóng ứng dụng Flutter, hãy làm theo các bước sau:

    Chạy ứng dụng trong trình chỉnh sửa Flutter hoặc cửa sổ dòng lệnh được hỗ trợ.

    Sửa đổi bất kỳ tệp Dart nào trong dự án.

    Nếu bạn sử dụng IDE hỗ trợ Flutter, hãy chọn Lưu tất cả hoặc nhấp vào nút Tải lại nóng trên thanh công cụ. Ngay lập tức, bạn có thể xem kết quả trong trình mô phỏng hoặc thiết bị thực của mình.

    Kể tên một số ứng dụng phổ biến sử dụng Flutter?

    Ngày nay, nhiều tổ chức sử dụng Flutter để xây dựng ứng dụng. Một số ứng dụng phổ biến nhất được xây dựng trên Flutter như sau:

    • Google Ads
    • Reflectly
    • Alibaba
    • Birch Finance
    • Coach Yourself
    • Tencent
    • Watermaniac

    Kể tên gói cơ sở dữ liệu phổ biến được sử dụng trong Flutter?

    Các gói cơ sở dữ liệu phổ biến và được sử dụng nhiều nhất được sử dụng trong Flutter như sau:

    • Cơ sở dữ liệu sqflite: Nó cho phép truy cập và thao tác với cơ sở dữ liệu SQLite.
    • Cơ sở dữ liệu Firebase: Nó sẽ cho phép bạn truy cập và thao tác với cơ sở dữ liệu đám mây.

    Animation nào cho phép bạn thể hiện hành vi trong thế giới thực?

    Animation dựa trên Vật lý cho phép bạn thể hiện hành vi trong thế giới thực trong Flutter.

    Sự khác biệt giữa Khởi động lại Nóng và Tải lại Nóng là gì?

    Sau đây là những điểm khác biệt cơ bản giữa Khởi động lại nóng và Tải lại nóng:

    Tải lại nóng (Hot reload) Khởi động lại nóng
    Nó hoạt động với một phím r nhỏ trên thiết bị đầu cuối hoặc dấu nhắc lệnh. Nó chủ yếu hoạt động bằng tay
    Tính năng tải lại nóng cho phép chúng tôi nhanh chóng biên dịch mã mới được thêm vào tệp và gửi chúng đến Máy ảo Dart (DVM). Sau khi hoàn tất cập nhật DVM, nó sẽ cập nhật ngay giao diện người dùng của ứng dụng. Nó cho phép các nhà phát triển có được một ứng dụng được biên dịch đầy đủ vì nó phá hủy các giá trị Trạng thái đã có và đặt chúng thành mặc định. Trên mỗi lần Khởi động lại nóng, cây widget ứng dụng của chúng ta được xây dựng lại hoàn toàn với code đã nhập mới.
    Nó giúp xây dựng giao diện người dùng, thêm các tính năng mới, sửa lỗi và phát triển ứng dụng nhanh chóng. Mất nhiều thời gian hơn Tải lại nóng để biên dịch và cập nhật ứng dụng.

    22. Trong đoạn mã dưới đây, hãy chuyển makeMangoShake() thành getter có tên là mangoshake bằng cách sử dụng cú pháp viết tắt “fat arrow”: 

    class Recipe {  
      int mango;  
      int milk;  
      int sugar;  
      Recipe(this.mango, this.milk, this.sugar);   
      int makeMangoShake() {  
        return mango+milk+sugar;  
      }  
    }

    Fat Arrow (=>) được sử dụng khi phương thức chứa một dòng code. Chúng ta có thể sử dụng nó bằng cú pháp sau:

    methodName(parameters) => statement;

    Cần lưu ý rằng chúng ta không thể sử dụng từ khóa return có mũi tên béo (=>). Sau khi chuyển makeMangoShake() thành một mũi tên, nó sẽ giống như đoạn mã dưới đây:

    int get mangoshake => mango + milk + sugar;

    Sự khác biệt giữa các hàm “main()” và “runApp()” trong Flutter là gì?

    Chúng ta có thể phân biệt các hàm chính và hàm runApp trong Flutter như sau:

    • Hàm main() chịu trách nhiệm khởi động chương trình. Nếu không có hàm main(), chúng ta không thể viết bất kỳ chương trình nào trên Flutter.
    • Hàm runApp() có nhiệm vụ trả về các widget được gắn vào màn hình dưới dạng gốc của cây widget và sẽ được hiển thị trên màn hình.

    Khi nào bạn nên sử dụng mainAxisAlignment và crossAxisAlignment?

    Chúng ta có thể sử dụng crossAxisAlignment và mainAxisAlignment để kiểm soát cách các widget hàng và cột sắp xếp các con của nó dựa trên sự lựa chọn của chúng ta.

    Trục chéo của hàng sẽ chạy theo chiều dọc và trục chính sẽ chạy theo chiều ngang. Xem hình ảnh minh họa bên dưới để hiểu rõ hơn.

    Các câu hỏi phỏng vấn Flutter 4

    Trục chéo của cột sẽ chạy theo chiều ngang và trục chính sẽ chạy theo chiều dọc. Hình ảnh minh họa dưới đây giải thích rõ ràng hơn.

    Các câu hỏi phỏng vấn Flutter 5

    Sự khác biệt giữa SizedBox và Container là gì?

    • Container trong Flutter là một widget có thể chứa nhiều widget và quản lý chúng một cách hiệu quả thông qua chiều rộng, chiều cao, phần đệm, màu nền, v.v. Nếu chúng ta có một widget cần một số kiểu nền có thể là hạn chế về màu sắc, hình dạng hoặc kích thước , chúng tôi có thể bọc nó trong một widget vùng chứa.
    • SizedBox trong Flutter là một hộp đi kèm với kích thước được chỉ định. Không giống như Container, nó không cho phép chúng ta thiết lập màu sắc hoặc trang trí cho widget. Chúng tôi chỉ có thể sử dụng nó để xác định kích thước của tiện ích được truyền khi còn nhỏ. Nó có nghĩa là nó buộc widget con của nó phải có chiều rộng hoặc chiều cao cụ thể.

    Stream trong Flutter là gì?

    Luồng là một chuỗi các sự kiện không đồng bộ. Nó cung cấp một chuỗi dữ liệu không đồng bộ. Nó cũng giống như một đường ống mà chúng ta đặt một số giá trị vào một đầu và nếu chúng ta có một người nghe ở đầu kia, nó sẽ nhận được giá trị đó. Chúng tôi có thể giữ nhiều người nghe trong một luồng và tất cả những người nghe đó sẽ nhận được cùng một giá trị khi được đưa vào đường dẫn.

    Chúng tôi có thể xử lý luồng bằng cách sử dụng hàm chờ hoặc nghe từ API luồng. Nó có một cách để phản hồi các lỗi. Chúng ta có thể tạo luồng theo nhiều cách, nhưng chúng có thể được sử dụng theo cách giống nhau. Xem ví dụ dưới đây:

    Future<int> sumStream(Stream<int> stream) async {  
        var sum = 0;  
        await for (var value in stream) {  
          sum = sum + value;  
        }  
        return sum;  
      }

    Các loại Stream trong Flutter?

    Stream có thể có hai loại, đó là:

    • Single subscription streams (Các luồng đăng ký đơn lẻ) Đây là loại luồng phổ biến nhất chứa một chuỗi các sự kiện, là các phần của một tổng thể lớn hơn. Nó sẽ cung cấp các sự kiện theo đúng thứ tự và không bỏ sót bất kỳ sự kiện nào. Nếu thiếu bất kỳ sự kiện nào, thì phần còn lại của luồng sẽ không có ý nghĩa gì. Luồng này chủ yếu được sử dụng để đọc tệp hoặc nhận yêu cầu web. Nó sẽ nghe một lần, và nếu nó đang nghe lại, điều đó có nghĩa là đã bỏ lỡ một sự kiện ban đầu. Khi nó bắt đầu nghe, dữ liệu sẽ được tìm nạp và cung cấp theo từng phần.
    • Broadcast streams (Các luồng phát sóng) Đây là một loại luồng được sử dụng cho các thư riêng lẻ có thể được xử lý từng thư một mà không cần biết về các sự kiện trước đó. Nó có thể có nhiều người nghe để nghe đồng thời và chúng ta có thể nghe lại sau khi hủy đăng ký trước đó. Sự kiện chuột này trong trình duyệt là một loại luồng này.

    Tại sao phương thức build() trên State mà không phải StatefulWidgets?

    Lý do chính đằng sau điều này là StatefulWidget sử dụng một lớp State riêng biệt mà không xây dựng một phương thức bên trong phần thân của nó. Nó có nghĩa là tất cả các trường bên trong Widget là bất biến và bao gồm tất cả các lớp con của nó.

    Mặt khác, StatelessWidget có các phương thức xây dựng và liên kết bên trong cơ thể của nó. Đó là do bản chất của StatelessWidget, được hiển thị hoàn toàn trên màn hình bằng cách sử dụng thông tin được cung cấp. Nó cũng không cho phép bất kỳ thay đổi nào trong tương lai đối với thông tin State của nó.

    StatefulWidget cho phép chúng tôi thay đổi thông tin State trong quá trình sử dụng ứng dụng. Do đó, nó không phù hợp để lưu trữ trong một phương thức xây dựng để thỏa mãn các điều kiện lớp Widget nơi tất cả các trường là bất biến. Đây là lý do chính để giới thiệu State . Ở đây, chúng ta chỉ cần ghi đè hàm createState () để đính kèm Trạng thái đã xác định với StatefulWidget, và sau đó tất cả các thay đổi dự kiến ​​sẽ xảy ra trong một lớp riêng biệt.

    Các chế độ build khác nhau trong Flutter là gì?

    Công cụ Flutter hỗ trợ ba chế độ trong khi biên dịch ứng dụng. Các chế độ biên dịch này có thể được chọn tùy thuộc vào vị trí của chúng ta trong chu trình phát triển. Tên của các chế độ là:

    • Debug
    • Profile
    • Release

    Tại sao chúng ta cần mixin?

    Dart không hỗ trợ nhiều thừa kế. Vì vậy, để triển khai nhiều kế thừa trong Flutter / Dart, chúng ta cần các mixin. Mixins cung cấp một cách để viết code của lớp có thể sử dụng lại trong nhiều phân cấp lớp.

    Tại sao chúng ta sử dụngTicker trong Flutter?

    Ticker trong Flutter là tốc độ làm mới hình ảnh động của chúng ta. Nó là một lớp gửi tín hiệu ở một khoảng thời gian đều đặn, tức là khoảng 60 lần mỗi giây. Chúng ta có thể hiểu điều đó bằng đồng hồ của mình, đồng hồ này hoạt động đều đặn. Tại mỗi lần đánh dấu, Ticker cung cấp một phương thức gọi lại với khoảng thời gian kể từ lần đánh dấu đầu tiên vào mỗi giây, sau khi nó được bắt đầu. Ngay cả khi các code bắt đầu vào các thời điểm khác nhau, nó luôn được đồng bộ hóa tự động.

    Key trong Flutter là gì?

    • Các Key trong Flutter được sử dụng làm code định danh cho Widget, Elements và SemanticsNodes. Chúng ta có thể sử dụng nó khi một widget mới cố gắng cập nhật một phần tử hiện có; sau đó, khóa của nó phải giống với khóa widget hiện tại được liên kết với phần tử.
    • Các khóa không được khác nhau giữa các Phần tử trong cùng một gốc.
    • Các lớp con của Key phải là GlobalKey hoặc LocalKey.
    • Key rất hữu ích khi chúng ta cố gắng thao tác (chẳng hạn như thêm, xóa hoặc sắp xếp lại thứ tự) một tập hợp các widget cùng loại có trạng thái nào đó.

    Làm thế nào bạn sẽ thực thi code chỉ trong chế độ gỡ lỗi?

    Để thực thi code chỉ trong chế độ gỡ lỗi, trước tiên chúng ta cần nhập nền tảng phi tiêu như bên dưới:

    import 'package:flutter/foundation.dart' as Foundation;

    Tiếp theo, chúng ta cần sử dụng kReleaseMode như bên dưới:

    if (Foundation.kReleaseMode){ // is Release Mode ??
    print('release mode');
    } else {
    print('debug mode');
    }

    Chế độ profile là gì, và bạn sử dụng nó khi nào?

    Chế độ hồ sơ(Profile) được sử dụng để đo hiệu suất của các ứng dụng của chúng ta. Trong chế độ này, một số khả năng gỡ lỗi được duy trì để xác định hiệu suất ứng dụng của bạn. Chế độ này bị tắt trên trình giả lập và trình mô phỏng vì chúng không đại diện cho hiệu suất thực.

    Chúng ta có thể sử dụng lệnh dưới đây để biên dịch chế độ cấu hình:

    Chế độ release là gì và bạn sử dụng nó khi nào?

    • Chế độ phát hành (release) cho phép chúng ta tối ưu hóa code và tạo chúng mà không có bất kỳ dữ liệu gỡ lỗi nào ở dạng được tối ưu hóa hoàn toàn. Trong chế độ này, nhiều code của ứng dụng sẽ bị xóa hoặc viết lại hoàn toàn.
    • Chúng ta sử dụng chế độ này khi chúng ta sẵn sàng phát hành ứng dụng. Nó cho phép tối ưu hóa tối đa và kích thước dấu chân tối thiểu của ứng dụng.
    • Chúng ta có thể sử dụng lệnh dưới đây để biên dịch chế độ phát hành:

    flutter run --release

    Sự khác biệt giữa WidgetsApp và MaterialApp là gì?

    Biểu đồ so sánh dưới đây giải thích sự khác biệt cơ bản giữa WidgesApp và MaterialApp:

    WidgetsApp MaterialApp
    WidgetsApp được sử dụng để điều hướng cơ bản. Nó bao gồm nhiều widget nền tảng cùng với thư viện widget mà Flutter sử dụng để tạo giao diện người dùng của ứng dụng của chúng ta. MaterialApp, cùng với thư viện material, là một lớp được xây dựng trên đầu WidgetsApp và thư viện của nó. Nó triển khai thiết kế Material Design cung cấp giao diện thống nhất cho ứng dụng của chúng ta trên bất kỳ nền tảng nào.
    Lớp WidgetsApp là lớp cơ sở cho lớp MaterialApp. Nó cung cấp nhiều công cụ thú vị như Bộ điều hướng hoặc Chủ đề để phát triển ứng dụng.
    Nó bao bọc một số widget cần thiết để xây dựng ứng dụng. Nó bao gồm một số widget cần thiết cho các ứng dụng thiết kế vật liệu xây dựng.

    BuildContext là gì?

    BuildContext trong Flutter là một phần của các widget trong cây Element để mỗi widget có BuildContext của riêng mình. Chúng ta chủ yếu sử dụng nó để tham chiếu đến một widget hoặc chủ đề khác. Ví dụ, nếu chúng ta muốn sử dụng một yếu tố thiết kế material design, thì nó bắt buộc phải tham chiếu nó đến Scaffold. Chúng ta có thể lấy nó bằng phương thức Scaffold.of (context).

    Bạn có thể thực hiện những loại kiểm tra nào trong Flutter?

    Kiểm tra là một hoạt động được sử dụng để xác minh và xác thực ứng dụng, không có lỗi và đáp ứng các yêu cầu của người dùng. Nói chung, chúng ta có thể sử dụng ba loại kiểm tra này trong Flutter:

    • Unit Tests: Nó kiểm tra một chức năng, phương thức hoặc lớp. Mục tiêu của nó là đảm bảo tính đúng đắn của code trong nhiều điều kiện khác nhau. Thử nghiệm này được sử dụng để kiểm tra tính hợp lệ của logic kinh doanh của chúng ta.
    • Widget Tests: Nó kiểm tra một widget duy nhất. Mục tiêu của nó là đảm bảo rằng giao diện người dùng của widget trông và tương tác với các widget khác như mong đợi.
    • Integration Tests: Nó xác thực một ứng dụng hoàn chỉnh hoặc một phần lớn của ứng dụng. Mục tiêu của nó là đảm bảo rằng tất cả các widget và dịch vụ cùng hoạt động như mong đợi.

    Toán tử kiểm tra Null là gì?

    Dart cung cấp một số thông tin hữu ích để xử lý các giá trị null.

    1. Toán tử gán “?? =” chỉ gán giá trị cho một biến khi biến đó đang rỗng (null).

    int a; // Initial value of a is null.  
    a ??= 5;  
    print(a); // It will print 5.

    2. Toán tử “??” được sử dụng để đánh giá và trả về giá trị giữa hai biểu thức. Đầu tiên, nó thực thi và kiểm tra biểu thức bên trái nếu khác rỗng thì trả về giá trị của biểu thức đó; nếu không, nó sẽ thực thi và trả về giá trị của biểu thức bên phải:

    print(3 ?? 5); // It will print 3.  
    print(null ?? 5); // It will print 5.

    Sự khác nhau giữa toán tử “??” và “?”

    Toán tử ??  Toán tử ? 
    Các “??” toán tử được sử dụng để đánh giá và trả về giá trị giữa hai biểu thức.

    Nó có thể được sử dụng như sau:expr1 ?? expr2Toán tử này đầu tiên kiểm tra biểu thức 1 và nếu nó không phải là null, trả về giá trị của nó; nếu không, nó sẽ đánh giá và trả về giá trị của biểu thức 2.

    Các “?” toán tử được sử dụng để đánh giá và trả về giá trị giữa hai biểu thức dựa trên điều kiện đã cho.

    Nó có thể được sử dụng như sau:điều kiện? expr1: expr2Toán tử này đầu tiên kiểm tra điều kiện và nếu nó đúng, nó sẽ đánh giá expr1 và trả về giá trị của nó (nếu điều kiện được khớp). Nếu không, nó sẽ đánh giá và trả về giá trị của expr2.

  • Flutter là gì?

    Flutter là gì?

    Flutter là gì?

    Để trả lời câu hỏi Flutter là gì, những đặc điểm cơ bản của Flutter, chúng tôi xin được trích đăng một phần đồ án tốt nghiệp của bạn Đỗ Thế Hiệp, sinh viên trường ĐH QUẢN LÝ và CÔNG NGHỆ HẢI PHÒNG.

    Flutter là gì?

    Flutter là một bộ SDK đa nền tảng có thể hoạt động trên iOS và Android do Google phát triển được sử dụng để tạo ra các ứng dụng dành cho di động (native app).

    Flutter gồm 2 thành phần quan trọng:

    • Một SDK (Software Development Kit): Một bộ sưu tập các công cụ sẽ giúp bạn phát triển các ứng dụng của mình.
    • Một Framework (UI Library based on widgets): Một tập hợp các thành phần giao diện người dùng (UI) có thể tái sử dụng (button, text inputs, slider, v.v.) giúp bạn có thể cá nhân hóa tùy theo nhu cầu của riêng mình.

    Nói chung, tạo một ứng dụng di động là một công việc rất phức tạp và đầy thử thách. Có rất nhiều framework có sẵn, cung cấp các tính năng tuyệt vời để phát triển các ứng dụng di động. Để phát triển các ứng dụng dành cho thiết bị di động, Android cung cấp một framework gốc dựa trên ngôn ngữ Java và Kotlin, trong khi iOS cung cấp một framework dựa trên ngôn ngữ Objective-C/Swift.

    Vì vậy, chúng ta cần hai ngôn ngữ và framework khác nhau để phát triển ứng dụng cho cả hai hệ điều hành. Ngày nay, để khắc phục sự phức tạp này, có một số framework đã được giới thiệu hỗ trợ cả hệ điều hành cùng với các ứng dụng dành cho máy tính để bàn. Những loại framework này được gọi là công cụ phát triển đa nền tảng [1] .

    Framework phát triển đa nền tảng có khả năng viết một code và có thể triển khai trên nhiều nền tảng khác nhau (Android, iOS và Máy tính để bàn). Nó tiết kiệm rất nhiều thời gian và nỗ lực phát triển của các nhà phát triển.

    Có một số công cụ có sẵn để phát triển đa nền tảng, bao gồm các công cụ dựa trên web. Mỗi framework này có mức độ thành công khác nhau trong ngành công nghiệp di động. Gần đây, một framework công tác mới đã được giới thiệu trong họ phát triển đa nền tảng có tên là Flutter được phát triển từ Google.

    Flutter là một bộ công cụ giao diện người dùng để tạo các ứng dụng nhanh, đẹp, được biên dịch nguyên bản cho thiết bị di động, web và máy tính để bàn với một ngôn ngữ lập trình và cơ sở code duy nhất. Nó là miễn phí và code nguồn mở. Ban đầu nó được phát triển từ Google và bây giờ được quản lý theo tiêu chuẩn ECMA. Ứng dụng Flutter sử dụng ngôn ngữ lập trình Dart để tạo ứng dụng.

    Flutter chủ yếu được tối ưu hóa cho các ứng dụng di động 2D có thể chạy trên cả nền tảng Android và iOS. Chúng ta cũng có thể sử dụng nó để xây dựng các ứng dụng đầy đủ tính năng, bao gồm máy ảnh, bộ nhớ, vị trí địa lý, mạng, SDK của bên thứ ba, v.v.

    Điều làm Flutter trở lên khác biệt?

    Flutter khác với các framework khác vì nó không sử dụng WebView cũng như các widget OEM (Original Equipment Manufacturer) đi kèm với thiết bị. Thay vào đó, nó sử dụng công cụ kết xuất hiệu suất cao của riêng mình để vẽ các widget. Nó cũng triển khai hầu hết các hệ thống của nó như hoạt ảnh, cử chỉ và widget bằng ngôn ngữ lập trình Dart cho phép các nhà phát triển đọc, thay đổi, thay thế hoặc loại bỏ mọi thứ một cách dễ dàng. Nó cung cấp khả năng kiểm soát tuyệt vời cho các nhà phát triển đối với hệ thống.

    Các tính năng của Flutter

    Flutter cung cấp các phương pháp dễ dàng và đơn giản để bắt đầu xây dựng các ứng dụng dành cho thiết bị di động và máy tính để bàn đẹp mắt với một bộ thiết kế material design và widget phong phú. Ở đây, chúng ta sẽ thảo luận về các tính năng chính của nó để phát triển framework di động.

     

    Các tính năng của Flutter
    Các tính năng của Flutter
    • Code nguồn mở(Open-Source:): Flutter là một framework code nguồn mở và miễn phí để phát triển các ứng dụng di động.
    • Đa nền tảng(Cross-platform): Tính năng này cho phép Flutter viết code một lần, duy trì và có thể chạy trên các nền tảng khác nhau. Nó tiết kiệm thời gian, công sức và tiền bạc của các nhà phát triển.
    • Tải lại nóng (Hot Reload): Bất cứ khi nào nhà phát triển thực hiện thay đổi trong code, thì những thay đổi này có thể được nhìn thấy ngay lập tức với Tải lại nóng. Nó có nghĩa là những thay đổi hiển thị ngay lập tức trong chính ứng dụng. Đây là một tính năng rất tiện dụng, cho phép nhà phát triển sửa các lỗi ngay lập tức.
    • Các tính năng và SDK gốc có thể truy cập (Accessible Native Features and SDKs): Tính năng này cho phép quá trình phát triển ứng dụng dễ dàng và thú vị thông qua code gốc của Flutter, tích hợp bên thứ ba và các API nền tảng. Do đó, chúng tôi có thể dễ dàng truy cập SDK trên cả hai nền tảng.
    • Code tối thiểu (Minimal code): Ứng dụng Flutter được phát triển bởi ngôn ngữ lập trình Dart, sử dụng biên dịch JIT và AOT để cải thiện thời gian khởi động tổng thể, hoạt động và tăng tốc hiệu suất. JIT nâng cao hệ thống phát triển và làm mới giao diện người dùng mà không cần nỗ lực thêm vào việc xây dựng hệ thống mới.
    • Widget: framework công tác Flutter cung cấp các widget có khả năng phát triển các thiết kế cụ thể có thể tùy chỉnh. Quan trọng nhất, Flutter có hai bộ widget: Material Design và các widget Cupertino giúp mang lại trải nghiệm không có trục trặc trên tất cả các nền tảng.

    Kiến trúc của Flutter

    Kiến trúc Flutter

    Trong phần này, chúng ta sẽ thảo luận về kiến trúc của Flutter framework. Kiến trúc Flutter chủ yếu bao gồm bốn thành phần.

    • Động cơ Flutter (Flutter Engine)
    • Thư viện nền tảng (Foundation Library)
    • Vật dụng (Widgets)
    • Thiết kế các widget cụ thể (Design Specific Widgets)

    Flutter Engine

    Nó là một cổng để giúp chạy các ứng dụng di động chất lượng cao và cơ bản dựa trên ngôn ngữ C ++. Nó triển khai các thư viện lõi Flutter bao gồm animation và đồ họa, tệp và mạng I / O, kiến trúc plugin, hỗ trợ trợ năng và thời gian chạy dart để phát triển, biên dịch và chạy các ứng dụng Flutter. Phải sử dụng thư viện đồ họa mã nguồn mở của Google, Skia, để hiển thị đồ họa cấp thấp.

    Thư viện nền tảng (Foundation Library)

    Nó chứa tất cả các gói cần thiết cho các khối build cơ bản để viết một ứng dụng Flutter. Các thư viện này được viết bằng ngôn ngữ Dart.

    Vật dụng (widget)

    Trong Flutter, mọi thứ đều là một widget, đó là khái niệm cốt lõi của framework. Widget trong Flutter về cơ bản là một thành phần giao diện người dùng ảnh hưởng và kiểm soát chế độ xem và giao diện của ứng dụng. Nó đại diện cho một mô tả bất biến về một phần của giao diện người dùng và bao gồm đồ họa, văn bản, hình dạng và animation được tạo bằng các widget. Các widget tương tự như các thành phần React.

    Trong Flutter, ứng dụng tự nó là một widget chứa nhiều widget con. Điều đó có nghĩa rằng ứng dụng là tiện ích con cấp cao nhất và giao diện người dùng của nó được xây dựng bằng cách sử dụng một hoặc nhiều tiện ích con, bao gồm các tiện ích con phụ. Tính năng này giúp bạn tạo một giao diện người dùng phức tạp rất dễ dàng.

    Kiến trúc Flutter
    Kiến trúc Flutter

    Trong ví dụ trên, chúng ta có thể thấy rằng tất cả các thành phần đều là các widget có chứa các widget con. Do đó, ứng dụng Flutter tự nó là một widget.

    Thiết kế các widget cụ thể

    Framework Flutter có hai bộ widget phù hợp với các ngôn ngữ thiết kế cụ thể. Đây là Material Design cho ứng dụng Android và Cupertino Style cho ứng dụng IOS.

  • 100 ĐỀ THI HỌC SINH GIỎI TIN HỌC – ĐỀ THI TIN HỌC TRẺ

    100 ĐỀ THI HỌC SINH GIỎI TIN HỌC – ĐỀ THI TIN HỌC TRẺ

    Bài 1: Viết chương trình nhập vào tọa độ tâm I(a;b) và bán kính r của một đường tròn (a, b, r là các số nguyên). Sau đó nhập vào một điểm A(x, y) bất kì và kiểm tra xem nó có thuộc đường tròn hay không?

    Bài 2: Viết chương trình tính tích xy (với x, y là hai số thực có độ lớn tùy ý).

    Bài 3: Tìm tất cả các chữ số có ba chữ số, sao cho tổng các lập phương của các chữ số thì bằng chính số đó.

    Bài 4: Nhập 3 loại tiền và số tiền cần đổi. Hãy tìm tất cả các tổ hợp có được của 3 loại tiền trên cho số tiền vừa nhập.

    Bài 5: Viết chương trình giải bài toán cổ sau:

    Trăm trâu trăm cỏ
    Trâu đứng ăn năm
    Trâu nằm ăn ba
    Trâu già ba con một bó.

    Hỏi có bao nhiêu con mỗi loại?

    Bài 6: Lập tam giác PASCAL, dùng chương trình con.

    Bài 7: Viết các chương trình con  tính diện tích tam giác, tròn, vuông, chữ nhật trong một chương trình. Sau  đó hỏi chọn  một trong các phương án  tính diện  tích bằng  cách chọn trong bảng chọn lệnh sau:

    1. Không làm gì hết và trở về màn hình soạn thảo.
    2. Tính diện tích hình vuông
    3. Tính diện tích hình tròn
    4. Tính diện tích tam giác
    5. Tính diện tích hình chữ nhật

    Bài 8: Viết chương trình nhập vào một dãy số nguyên   có n phần tử. In ra màn hình phần tử nhỏ nhất, phần tử lớn nhất và giá trị trung bình của danh sách ra màn hình.

    Bài 9: Viết chương trình nhập vào một dãy số nguyên  có n phần tử.

    1. Đưa những phần tử lẻ ra đầu danh sách, những phần tử chẵn về cuối danh sách và in kết quả ra màn hình.
    2. Sắp xếp các phần tử lẻ đầu danh sách theo thứ tứ tăng dần, sắp xếp các phần tử chẵn cuối danh sách theo thứ tự giảm dần. In danh sách ra màn hình.

    Bài 10: Viết chương trình nhập vào một chuỗi kí tự, sau đó nhập vào một kí tự bất kì và đếm số lần của nó trong chuỗi đã nhập.

    Bài 11: Viết chương trình nhập vào một chuỗi ký tự. Kiểm tra xem nó có đối xứng hay không (Ví dụ: Chuỗi đối xứng RADAR, MADAM).

    Bài 12: Viết chương trình nhập vào họ tên của một người. Sau đó in chuỗi họ tên ra màn hình với các ký tự đầu đổi thành chữ hoa, toàn bộ chuỗi họ và tên đổi thành chữ hoa.

    Bài 13: Viết chương trình nhập vào một dãy số nguyên  có n phần tử.

    1. Sắp xếp dãy theo thứ tự tăng dần và in kết quả ra màn hình.
    2. Nhập vào một số x bất kì, đếm số lần xuất hiện của nó trong dãy trên.
    3. In ra màn hình số phần tử nhỏ hơn hoặc bằng x.
    4. In ra màn hình số phần tử lớn hơn x.

    Bài 14: Sử dụng lệnh lặp để tính tổng của 11 số hạng đầu tiên

    S = 100 + 105 + 110  +...

    Bài 15:  Tìm số P, biết rằng

    P/4 = 1 - 1/3   + 1/5 - 1/7  +...

    Với độ chính xác: |1/2n-1| < 10^-5

    Bài 16: Cho một dãy số nguyên A(i) với i=1,...N. Viết chương trình:

    1. Tính và in ra trung bình cộng cuả các số dương trong dãy.
    2. Đếm xem có bao nhiêu số chia hết cho 3.
    3. In ra vị trí các số bằng 0 (nếu có) trong dãy đã cho.

    Bài 17:  Viết chương trình tìm các số có 3 chữ số mà tổng lập phương các chữ số của nó bằng chính nó (các số Amstrong).

    Bài 18:  Nhập một số thực x rồi tính

    S = 1 + x/1! + x^2/2! + x^3/3! +...+ x^n/n!

    với độ chính xác | x^n/n! | < 10^-5.

    Bài 19:  Dãy Fibonaxi được định nghĩa như sau:

    A1=A2=1, An=A(n-1) + A(n-2) với n>=2.

    Hãy:

    1. Nhập một số n và in ra n số Fibonaxi đầu tiên.
    2. Nhập một số n và in ra các số Fibonaxi nhỏ hơn hoặc bằng n.

    Bài 20:  Cho một dãy số. Viết chương trình:

    1. Gom tất cả các số chia hết cho 7 về đầu dãy và tất cả các số chia hết cho 5 vể cuối dãy.
    2. Sắp xếp phần số đã gom theo thứ tự tăng dần.

    Bài 21:   Cho một dãy số. Hãy viết chương trình Tìm phần tử nhỏ nhất và phần tử nhỏ thứ hai. Hãy cho biết vị trí đầu tiên của phần tử lớn nhất.

    Bài 22: Cho một dãy ký tự. Hãy viết chương trình tách dãy trên thành hai nửa, nửa đầu gồm các số, nửa sau là các chữ cái. Sắp xếp nửa đầu giảm dần, nửa sau tăng dần.

    Bài 23: Xét dãy các xâu F1, F2,... Fn trong đó:

    F1 = 'A'; F2 = 'B'; Fk+1 = Fk + F(k-1) với k=>2

    Ví dụ:

    F1 = 'A'
    F2 = 'B'
    F3 = 'BA'
    F4 = 'BAB'
    F5 = 'BABBA'
    F6 = 'BABBABAB'...

    Cho xâu S độ dài không quá 25, chỉ bao gồm các kí tự 'A''B'. Yêu cầu:

    1. Hãy xác định số lần xuất hiện xâu S trong xâu Fn, n<=35. Chú ý: Hai lần xuất hiện của S trong Fn không nhất thiết phải là các xâu rời nhau hoàn toàn.
    2. Dữ liệu vào: Đọc từ file văn bản FIBISTR.INP có cấu trúc như sau: Gồm nhiều dòng, mỗi dòng gồm nS. Giữa nS có đúng 1 dấu cách. Dữ liệu vào là chuẩn, không cần kiểm tra.
    3. Dữ liệu ra: Ghi ra file văn bản FIBISTR.OUT có cấu trúc như sau: Gồm nhiều dòng, mỗi dòng dữ liệu ứng với một dòng kết quả ra.

    Bài 24: SỐ PHẢN NGUYÊN TỐ. Một số tự nhiên n được gọi là số phản nguyên tố nếu nó có nhiều ước số nhất trong n số tự nhiên đầu tiên.

    Yêu cầu: Cho số K không vượt quá 10000. Ghi ra số phản nguyên tố lớn nhất nhỏ hơn hoặc bằng K.

    Dữ liệu vào: Đọc từ file văn bản OPNT.INP có cấu trúc như sau:

    • Dòng đầu tiên là số M (1<M<=100) là số lượng các số cần tìm số phản nguyên tố lớn nhất của nó.
    • M dòng tiếp theo là các số K1,K2,..KM

    Dữ liệu ra: Ghi ra file văn bản SOPNT.OUT có cấu trúc như sau:

    • Gồm M dòng.
    • Dòng thứ i (1<=i<=M) là số phản nguyên tố lớn nhất nhỏ hơn hoặc bằng Ki.

    Bài 25: Ngồi nhà quá rỗi, Sơn có ý tưởng dùng các que diêm tạo thành các số hập phân. Một cách đại diện cho 10 chữ số thập phân như sau:

    ĐỀ THI HỌC SINH GIỎI TIN HỌC - ĐỀ THI TIN HỌC TRẺ

    Cho N que diêm, Sơn có thể tạo ra một loạt các chữ số. Sơn kinh gạc phát hiện ra số nhỏ nhất và lớn nhất trong số đó có thể tạo được bằng cách sử dụng tất cả các que diêm của Sơn.

    Yêu cầu: Xác định số nhỏ nhất và lớn nhất mà Sơn có thể tạo ra.

    Dữ liệu vào: Đọc từ file văn bản MATCH.INP có cấu trúc như sau:

    • Dòng đầu tiên là số test K (1<K<=100)
    • K dòng tiếp theo, mỗi test gồm một dòng chứa số nguyên n (2<=n<=100) là số que diêm

    Bài 26: Dãy số được gọi là dãy số đối xứng nếu đọc các phần tử của dãy số này từ trái sang phải hay đọc ngược lại đều được cùng kết quả. Ví dụ: 1, 2, 1 hoặc 1, 2, 2, 1 là các dãy số đối xứng.

    Dãy số P được gọi là dãy số con của dãy số A nếu các phần tử thuộc P có mặt liên tiếp trong dãy số A với thứ tự không đổi. Ví dụ: 2, 1, 3 là dãy số con của 1, 2, 2, 1, 3.

    Cho dãy số tự nhiên A gồm n phần tử a1, a2, a3…an (ai <35000, 5<n<100)

    Yêu cầu: Hãy viết phương trình tìm dãy số P là dãy số con đối xứng dài nhất của dãy số A.

    Dữ liệu vào: Nhập vào số tự nhiên n và n phần tử của dãy số A.

    Kết quả: Xuất ra màn hình kết quả vừa tìm được

    Ví dụ:

    Dữ liệu vào: (nhập từ bàn phím)

    N=5   1 2 2 1

    Kết quả: (xuất ra màn hình)

    A: 1 2 2 1 2

    Bài 27:   Xâu s1 có độ dài m và s2 có độ dài n ( m,n là hai số tự nhiên; n,m<250). Biết rằng s1,s2 chỉ chứa các kí tự ‘A’…’Z’.

    Yêu cầu: Hãy viết phương trình tìm xâu con chung dài nhất của xâu s1 và s2.

    Dữ liệu vào: Nhập từ bàn phím 2 xâu s1 và s2.

    Kết quả: Xuất ra màn hình xâu con chung của 2 xâ s1 và s2.

    Ví dụ:

    Dữ liệu vào: kết quả: ABBA

    S1:ABBABC

    S2:ABABBA

    Bài 28: Cho xâu S có độ dài N (N<100). Xâu S chỉ chứa các k‎ tự số ‘0’…’9’.

    Yêu cầu: Hãy viết chương trình tìm xâu S1 bằng cách hoán vị các k‎ tự số trong xâu S sao cho xâu S1 có giá trị nhỏ nhất lớn hơn S.

    Đữ liệu vào: Cho trong tệp tin so.inp, gồm 1 dòng ghi xâu S.

    Kết quả: Ghi trong tập tin so.out, gồm 1 dòng ghi kết quả vừa tìm được.

    Ví dụ:

    Dữ liệu vào: (So.inp)     Kết quả: (so.out)

    ‘1234’   ‘1324’

    Bài 29: Viết chương tìm ước số chung lớn nhất của hai số nguyên a và b khác 0, với a, b được nhập từ bàn phím.

    Bài 30:  Viết chương trình nhập vào một mảng gồm n phần tử (n<=100). Kiểm tra và in ra màn hình các số là số nguyên tố sắp xếp theo thứ tự tăng dần.

    Bài 31: Cho số tự nhiên N (N<=50). Hãy viết chương trình thực hiện:

    1. Nhập số N, sau đó nhập N số nguyên từ bàn phím. thứ tự của các số gọi là chỉ số.
    2. Hãy tính trong dãy số trên có bào nhiêu số dương chẵn.
    3. Tìm (các) chỉ số của giá trị âm lớn nhất của dãy số nếu có.
    4. Tìm tất cả các dãy con dài nhất các số khác không cùng dấu.

    Bài 32:  Nhập vào từ bàn phím một số N nguyên dương (N<=5000).

    1. Hãy phân tích N thành tổng của hai số nguyên tố (nếu được) và thông báo không được nếu không có phương án nào.
    2. Nếu N thoả mãn câu a, hãy đưa càng nhiều càng tốt các phương án phân tích (2 phương án có cùng các số hạng chỉ coi là một)

    Bài 33:  Cho trước một dãy số bao gồm toàn các số 0 và 1. Dãy này có độ dài nhỏ hơn 255.

    1. Viết chương trình nhập dãy số trên từ bàn phím. Các số được nhập liên tiếp từ bàn phím, quá trình nhập dữ liệu kết thúc nhấn phím <Enter>. Nếu việc nhập dữ liệu sai trên màn hình kết quả “Bạn đã nhập sai, đề nghị nhập lại” và cho phép nhập lại ngay dữ liệu.
    2. Một dãy con đúng của dãy trên được gọi là một dãy con liên tục bất kỳ của dãy trên bao gồm các số hạng giống nhau. Hãy tính độ dài lớn nhất của một dãy con đúng của dãy trên.
    3. Một dãy con đúng bậc 1 của dãy trên được coi là một dãy con liên tục bất kỳ của dãy trên bao gồm toàn các số hạng giống nhau ngoại trừ 1 phần tử. Hãy tính độ dài lớn nhất của một dãy con đúng bậc 1 của dãy trên.

    Bài 34:  Cho số nguyên N trong phạm vi từ 1000 đến 999999. Cần xác định số này có phải là thông tin về một ngày tháng có trong thế kỷ 21 không. (Thế kỷ 21 bắt đầu từ 1 tháng 1 năm 2001 và kết thúc vào ngày 31 tháng 12 năm 3000. Biết rằng 2  chữ số cuối của N là chỉ hai chữ số cuối của năm, các chữ số còn lại (ở đầu) xác định ngày và tháng.

    Ví dụ:

    1111       tương ứng với 1 tháng 1 năm 2011;

    21290     tương ứng với 2 tháng 12 năm 2090 hoặc 21 tháng 2 năm 2090;

    131192 tương ứng với 13 tháng 11 năm 2092;

    32392     Không phải là thông tin về một ngày tháng nào cả;

    311198 Không phải là thông tin về một ngày tháng nào cả;

    29205     Không phải là thông tin về một ngày tháng nào cả;

    Dữ liệu: Nhập vào số N từ bàn phím.

    Kết quả: Đưa ra màn hình các ngày tháng năm tương ứng với N hoặc thông báo là KHONG nếu N không phải là thông tin về một ngày tháng nào cả.

    Ví dụ:

    Giá trị của N Thông báo ra màn hình tương ứng
    1111

    21290

    29205

    1-1-2011

    2-12-2090 HOAC 21-2-2090

    KHONG

    Bài 35:    Cho dãy số nguyên a1, a2,…, an (n <= 1000).

    Hãy tìm cách thực hiện một số ít nhất phép đổi chỗ hai số hạng bất kỳ của dãy để thu được dãy số mà số lẻ đứng ở vị trí lẻ, số chẵn đứng ở vị trí chẵn.

    Dữ liệu: Vào từ file văn bản DAYSO.INP:

    • Dòng đầu tiên chứa số nguyên dương n;
    • Dòng thứ i trong số n dòng tiếp theo chứa số hạng ai của dãy đã cho (-32767 à 32767, i = 1, 2,…, n).

    Kết quả: ghi ra file văn bản DAYSO.OUT:

    • Dòng đầu tiên ghi số lượng phép đổi chỗ cần thực hiện k (qui ước k = -1, nếu không thể biến đổi được dãy đã cho thành dãy thoả mãn yêu cầu đầu bài);
    • Nếu k > 0, thì dòng thứ j trong số k dòng tiếp theo ghi chỉ số của hai số hạng cần đổi chỗ cho nhau ở lần đổi chỗ thứ j  ( j =1, 2,…, k).

    Ví dụ:

     DAYSO.INP DAYSO.OUT DAYSO.INP DAYSO.OUT
    6

    1

    2

    3

    4

    6

    5

    1

    5 6

    4

    1

    3

    2

    5

    -1

    Bài 36:  Một nhóm gồm n bạn học sinh của một lớp tham gia một câu lạc bộ tin học vào dịp nghỉ hè. Biết rằng khoảng thời gian mà bạn thứ i có mặt tại câu lạc bộ là [ai, bi] (ai<bi tương ứng là các thời điểm đến và rời khỏi câu lạc bộ). Cô giáo chủ nhiệm lớp muốn tới thăm các bạn trong nhóm này. Hãy giúp cô giáo chủ nhiệm xác định thời điểm đến câu lạc bộ sao cho tại thời điểm đó cô giáo có thể gặp được nhiều bạn trong nhóm nhất.

    Dữ liệu: Vào từ file văn bản MEETING.INP:

    • Dòng đầu tiên ghi số nguyên dương n (n <= 1000);
    • Dòng thứ i trong số n dòng tiếp theo ghi 2 số nguyên không âm ai, bi, i = 1, 2,…, n.

    Kết quả: Ghi ra file văn bản MEETING.OUT:

    • Dòng đầu tiên ghi số nguyên dương k là số lượng bạn đang có mặt ở câu lạc bộ tại thời điểm cô giáo đến;
    • Trong k dòng tiếp theo ghi chỉ số của k bạn có mặt ở câu lạc bộ tại thời điểm cô giáo đến, mỗi dòng ghi một chỉ số của một bạn.

    Ví dụ:

     MEETING.INP MEETING.OUT MEETING.INP MEETING.OUT
    6

    1  2

    2  3

    2  5

    5  7

    6  7

    9 11

    3

    1

    2

    3

    5

    1 2

    3 5

    7 9

    11 15

    17 21

    1

    1

    Bài 37:  Ứng với mỗi số tự nhiên x, ta có số tự nhiên f(x) bằng tổng bình phương các chữ số của x. Từ x ta xây dựng dãy (Xn) như sau:

    X1 = x ; X2 = f(X1) ; X3 = f(X2) ; …; Xi = f(Xi – 1)    với   1 <= I <= n

    Ví dụ:

    x = 12 ta có dãy: 12; 5; 25; 29; 85; 89; 145; 42; 20; 4; 16; 37; 58; 89

    x = 4 ta có dãy: 4; 16; 37; 58; 89; 145; 42; 20; 4

    Viết chương trình nhập vào từ bàn phím số tự nhiên x và in ra màn hình dãy (Xn)

    Dữ liệu vào: Số tự nhiên x.

    Dữ liệu ra: In ra màn hình dãy (Xn)

    Bài 38:  Tạo một dãy gồm n (3 < n < 20) số nguyên nhận các giá trị ngẫu nhiên từ 1 đến 99.  Xuất dãy  và xuất ra vị trí các số nguyên tố của dãy.

    Dữ liệu vào: Số nguyên n có giới hạn theo đề.

    Kết quả ra: Mảng a ngẫu nhiên và vị trí các số nguyên tố trong mảng.

    Ví dụ:

    Dữ liệu vào Dữ liệu ra
    19

     

    So phan tu cua mang: 19

    Mang a la:

    74 98 69 94  5 11 11 50 21 61 89 73 14 19 55 31 71 50  1

    Vi tri cac so nguyen to co trong a la:  5  6  7 10 11 12 14 16 17

    Lưu ý: số 1 không phải là số nguyên tố

    Bài 39:  Viết chương trình in ra màn hình các số từ x đến y là số chẵn và chia hết cho 3. với x, y nhập từ bàn phím? Đếm xem có tất cả bao nhiêu số?

    Dữ liệu vào: Số nguyên x và y (x < y).

    Kết quả ra: Các số chẵn chia hết cho 3 trong phạm vi từ x đến y và đếm có bao nhiêu số.

    Ví dụ:

    Dữ liệu vào Dữ liệu ra
    3

    40

    12  18  24  30  36

    Co tat ca: 6 so

    Các bài từ 40 đến 64 sau đây lấy từ 100 đề Toán Tin (Tin học &#038; Nhà trường)

    Bài 65: Bạn Huy không tập trung tư tưởng trong giờ toán vì vậy thầy giáo cho thêm bài tập về nhà rèn luyện khả năng tập trung tư tưởng và tính cẩn thận chu đáo. Nội dung bài tập là cho n xâu chỉ bao gồm các ký tự la tinh thường và chữ số. Đoạn các ký tự số liên tục tạo thành một số nguyên. Ở mỗi đoạn ký tự số liên tục Huy phải trích ra số lớn nhất có thể, sắp xếp các số nhận được từ các xâu đã cho và đưa ra theo thứ tự không giảm, mỗi số được đưa ra dưới dạng không có các số 0 không có nghĩa.

    Ví dụ, với n = 1 và xâu là 01a2b3456cde478 dãy số cần đưa ra là 1, 2, 478, 3456.

    Yêu cầu: Cho số nguyên n (1 ≤ n ≤ 100) và n xâu, mỗi xâu có độ dài không quá 100. Hãy đưa ra dãy số nhận được đã sắp xếp theo thứ tự không giảm, mỗi số trên một dòng.

    Dữ liệu: Vào từ file văn bản numbers.inp:

    Dòng đầu tiên chứa số nguyên n,

    Mỗi dòng trong n dòng sau chứa một xâu chỉ gồm các ký tự la tinh thường và số.

    Dữ liệu đảm bảo có không quá 500 số được tách ra.

    Kết quả: Đưa ra file văn bản NUMBERS.OUT dãy số nhận được đã sắp xếp theo thứ tự không giảm, mỗi số trên một dòng.

    Ví dụ:

    numbers.inp numbers.out
    4

    43silos0

    zita002

    le2sim

    231233

    0

    2

    2

    43

    231233

    Bài 66: Hãy viết chương trình đổi tờ giấy bạc có mệnh giá n (Việt Nam đồng) ra ba loại giấy bạc có mệnh giá 500, 200, 100 (Việt Nam đồng) sao cho số tờ gấy bạc phải sử dụng là ít nhất (n được nhập từ bàn phím).

    Bài 67: Tuổi của cha hiện nay là b tuổi, tuổi của con là c tuổi (b-c > 0 và b, c là các số nguyên dương). Hãy viết chương trình (với b, c được nhập từ bàn phím) để kiểm tra xem tuổi cha có gấp đôi tuổi con hay không? Nếu đúng thì đưa ra màn hình thông báo “hiện nay tuổi cha gấp đôi tuổi con”; trường hợp ngược lại, hãy tính số năm n (trước đó hoặc sau đó) tuổi cha gấp đôi tuổi con và đưa ra màn hình thông báo “n năm trước đây tuổi cha gấp đôi tuổi con” hay “sau n năm tuổi cha sẽ gấp đôi tuổi con”.

    Bài 68: Hàng tháng, các hộ dân sử dụng điện đều nhận được một hóa đơn thanh toán tiền điện. Giá tiền điện phải trả được tính như sau:

    • 100 số đầu tiên, mỗi số phải trả 550 đồng,
    • Từ số 101 đến số 150, mỗi số phải trả 1100 đồng,
    • Từ số 151 đến số 200, mỗi số phải trả 1470 đồng,
    • Từ số 201 trở đi, mỗi số phải trả 1600 đồng.

    Số tiền điện mà mỗi hộ dân phải trả ở hóa đơn là tổng số tiền điện mà người đó đã sử dụng với 10% thuế VAT.     Hãy viết chương trình tính số tiền điện mà người tiêu dùng phải trả trong tháng với a là số KW điện mà người tiêu dùng đã sử dụng và được nhập từ bàn phím.

    Bài 69: Nhập vào số tự nhiên n (0 < n < 10) và hai mảng số nguyên A, B có n phần tử đại diện cho hai tập hợp theo yêu cầu không có hai phần tử trùng nhau trong cùng một tập hợp. (Do đó, trong quá trình nhập nếu phần tử vừa nhập vào đã có trong mảng thì không bổ sung vào mảng). In ra màn hình tập hợp A, tập hợp B và các phần tử là giao của hai tập hợp A và B.

    Bài 70:

    1. Nhập một dãy số nguyên có n phần tử (0< n <= 100)
    2. Sắp xếp dãy vừa nhập theo thứ tự tăng dần, in ra màn hình dãy đã sắp thứ tự
    3. Tìm trên dãy đã sắp xếp có phần tử x hay không, với x được nhập từ bàn phím.

    Bài 71: Cho đa thức bậc n:

    A = anxn + an-1xn-1+…+ a1x + a0

    Trong đó an, an-1,…a1,a0 là các hệ số nguyên có giá trị tuyệt đối không quá 100.

    Biết rằng phương trình A = 0 nếu có nghiệm nguyên thì nghiệm nguyên đó chỉ có thể là ước số của hệ số a0.

    Yêu cầu: Hãy tìm tất cả các nghiệm nguyên (nếu có) của phương trình A = 0.

    Bài 72: Kỳ thi học sinh giỏi năm học 2008-2009 của tỉnh Bà Rịa-Vũng Tàu có 8 đội tuyển dự thi đến từ các huyện (TX, TP), số thứ tự các huyện được đánh số lần lượt từ 1 đến 8 là Vũng Tàu, Bà Rịa, Tân Thành, Châu Đức, Xuyên Mộc, Đất Đỏ, Long Điền, Côn Đảo. Mỗi thí sinh dự thi có một số báo danh duy nhất (là một số nguyên dương), mỗi đội tuyển của huyện tối đa 90 thí sinh. Sau khi thi xong Sở Giáo dục- Đào tạo tổ chức cho các thí sinh  giao lưu với nhau, Ban tổ chức sắp xếp các thí sinh đứng thành một vòng tròn, để tạo điều kiện cho các thí sinh trong tỉnh được giao lưu với nhau Ban tổ chức yêu cầu các thí sinh cùng huyện không đứng gần nhau, các thí sinh thuộc 2 huyện có số thứ tự liền kề cũng không được đứng gần nhau.

    Yêu cầu: Hãy giúp Ban tổ chức chỉ ra một cách xếp thỏa mãn yêu cầu trên

    Dữ liệu vào: file ‘pupil.inp’

    Gồm có 8 dòng, dòng thứ i chứa các số báo danh của các thí sinh huyện thứ i, các số báo danh cách nhau ít nhất một dấu cách.

    Dữ liệu ra: file ‘pupil.out’

    (Mô tả cách xếp n thí sinh theo yêu cầu trên một vòng tròn, ta có thể mô tả trên một đường thẳng, trong đó thí sinh đầu và thí sinh cuối đứng gần nhau trên vòng tròn)

    Gồm n dòng (n là tổng số thí sinh), mỗi dòng là số báo danh của thí sinh. Trong trường hợp không có cách nào thỏa mãn yêu cầu thì ghi là -1

    Ví dụ

    Pupil.inp Pupil.out
    1 2 3

    4 5 6

    7 8 9

    10 11 12

    13 14 15

    16 17 18

    19 20 21

    22 23

    1

    22

    16

    7

    17

    23

    2

    18

    8

    3

    9

    10

    4

    11

    5

    12

    6

    13

    19

    14

    20

    15

    21

    Bài 73: Nhập vào một số tự nhiên N với (0 < N ≤ 65535). Hãy cho biết chữ số lớn nhất của số tự nhiên vừa nhập. Hãy in đảo ngược số N.

    Ví dụ: N=6548. Chữ số lớn nhất là: 8. Số in ngược là: 8456.

    Bài 74: Nhập vào một số tự nhiên N với (0 < N ≤ 65535), phân tích số vừa nhập thành các thừa số nguyên tố, nếu số vừa nhập là số nguyên tố thì chỉ thông báo ra màn hình đây là số nguyên tố.

    Ví dụ:

    • Nếu số vừa nhập là 300, thì in ra màn hình 300 = 2. 2. 3. 5. 5
    • Nếu số vừa nhập là 307, thì in ra màn hình “307 là số nguyên tố”

    Bài 75: Tìm tất cả các số nguyên dương x, y, z  thỏa mãn phương trình: ax + by + cz = n; trong đó a, b, c, n là các số nguyên dương (a, b, c ≤ 65535; n ≤ 2.147.483.647)

    Yêu cầu kỹ thuật:

    1. Kiểm tra việc nhập dữ liệu thỏa mãn yêu cầu của đề bài. Nếu người sử dụng nhập sai thì thông báo nhập sai và hỏi người dùng có muốn nhập lại hay không, nếu không thì kết thúc chương trình.
    2. Không được dùng quá 2 vòng lặp lồng nhau và điều kiện dừng của mỗi vòng lặp không được vượt quá ngưỡng mà từ đó ta biết chắc chắn phương trình không có nghiệm.
    3. Nếu phương trình có nghiệm thì liệt kê có thứ tự các bộ nghiệm của phương trình theo dạng sau:

    Giả sử phương trình có dạng 15x + 28y + 24z = 454, ta in ra màn hình như sau:

    STT     x          y          x

    1          10        10        1

    2          14        7          2

    Ngược lại không thì thông báo phương trình không có nghiệm.

    Bài 76: Một số có tổng các ước nhỏ hơn nó bằng chính nó được gọi là số hoàn chỉnh.

    Ví dụ: 6 có các ước nhỏ hơn nó là 1, 2, 3. Tổng là 1 + 2 + 3 = 6.

    Viết chương trình xét xem một số n được nhập từ bàn phím có phải là số hoàn chỉnh không.

    Bài 77: Viết chương trình tìm các số hoàn chỉnh nhỏ hơn n (Với n được nhập từ bàn phím).

    Bài 78: Dãy Fibonacy có hai phần tử đầu là 1, 1. Các phần tử sau bằng tổng hai phần tử đứng ngay trước nó:

    1, 1, 2, 3, 5, 8, 13, 21,…

    Viết chương trình in ra dãy Fibonacy có phần tử lớn nhất nhỏ hơn n?

    Bài 79: Viết chương trình nhập n số, xoá số thứ k trong n số vừa nhập. In ra n-1 số còn lại.

    Bài 80: Viết chương trình cho phép nhập một dãy gồm n số nguyên. Nhập thêm một số và chèn thêm vào dãy sau phần tử k.

    Bài 81: Viết chương trình in ra màn hình tam giác Pascal. Ví dụ, với n=4 sẽ in ra hình sau:

    1          1
    
    1          2          1
    
    1          3          3          1
    
    1          4          6          4          1

    Hàng thứ n được xác định từ hàng n-1:

    • Phần tử đầu tiên và phần tử cuối cùng đều bằng 1.
    • Phần tử thứ 2 là tổng của phần tử thứ nhất và thứ 2 của hàng n-1
    • Phần tử thứ k của hàng thứ n là tổng của phần tử thứ k-1 và k của hàng thứ n-1.

    Bài 82: Viết chương trình tính giai thừa của số n (Viết là n!). Với yêu cầu:

    • Nếu người dùng nhập số n < 0 thì yêu cầu nhập lại.
    • Sử dụng chương trình con để tính giai thừa của một số.

    Bài 83: Viết chương trình cho phép cộng hai phân số.

    Bài 84: Nhập vào một số nguyên dương n. Hãy in ra số nguyên tố nhỏ nhất lớn hơn n. VD: Nhập n = 10. Kết quả in ra số 11.

    Bài 85: Tìm các số tự nhiên nhỏ hơn hoặc bằng n mà sau khi làm phép phân tích ra thừa số nguyên tố có nhiều nhân tử nhất. Ví dụ n=9. Các số có nhiều nhân tử nhất sau khi làm phép phân tích là: 8 = 2.2.2

    Viết chương trình cho phép phân tích một số ra thừa số nguyên tố và ghi kết quả dưới dạng tích các lũy thừa. Ví dụ: 300 = 2^2.3.5^2

    Bài 86: Mọi số tự nhiên đều có thể viết được dưới dạng tổng của hai số nguyên tố. Viết chương trình thực hiện tách một số tự nhiên thành tổng của hai số nguyên tố.

    Bài 87: Hai số tự nhiên A, B được coi là hữu nghị nếu như số này bằng tổng các ước số của số kia và ngược lại. Lập trình tìm và in ra màn hình các cặp số hữu nghị trong phạm vi từ 1 đến 10000. (Lưu ý, số 1 được coi là ước số của mọi số còn mỗi số không được coi là ước số của chính nó).

    Bài 88: Cho dãy số gồm n số. Tìm dãy con lớn nhất các phần tử tăng (giảm) dần.

    Bài 89: Cho dãy số gồm n số. Tìm dãy con lớn nhất các phần tử có cùng dấu, (đan dấu).

    Bài 90: Cho dãy gồm n số. Tìm dãy con lớn nhất đơn điệu (liên tục tăng, giảm hoặc giảm, tăng).

    Bài 91:  Cho dãy số gồm n số nguyên. Tìm dãy con có tổng lớn nhất

    Hướng dẫn. Sử dụng kỹ thuật vét cạn các dãy con, dùng hàm tính tổng dãy con để kiểm tra.

    Bài 92: Gọi abcd là một số có 4 chữ số. Hãy lập chương trình tìm tất cả các số có 4 chữ số thỏa mãn biểu thức: abcd=(ab + cd)^2. Ví dụ 2025=(20 + 25)^2.

    Bài 93:  Viết chương trình cho nhập hai số tự nhiên Nk. Hãy cho biết chữ số thứ k tính từ trái sang phải trong số N là chữ số nào? Nếu k lớn hơn độ dài của N hoặc k bằng 0 thì thông báo không tìm được.

    Bài 94:  Một số được gọi là số bậc thang nếu biểu diễn thập phân của nó có nhiều hơn một chữ số đồng thời theo chiều từ trái qua phải, chữ số đứng sau không nhỏ hơn chữ số đứng trước. Viết chương trình in ra các số bậc thang trong đoạn [n1, n2] với n1, n2 được nhập từ bàn phím.

    Bài 95: Viết chương trình cho phép đổi một số từ cơ số 10 sang cơ số bất kỳ.

    Thuật toán:

    • Dùng mảng CS để lưu các chữ số.
    • Lặp khi n <> việc: Chia n cho s lấy phần dư. Lấy phần dư làm chỉ số để lấy và lưu chữ số. Gán n = n div s.

    Chú ý chữ số lấy sau sẽ nằm trước.

    Bài 96: Viết chương trình cho phép đổi một số từ cơ số bất kỳ sang cơ số 10.

    Bài 97: Năm 1973, nhà Toán học Neil Sloan đưa ra khái niệm độ bền của một số nguyên không âm N như sau:

    • Nếu N có một chữ số thì độ bền của N bằng 0.
    • Nếu N có từ hai chữ số trở lên thì độ bền của N bằng độ bền của số nguyên là tích các chữ số của N cộng 1.

    Cho N từ 0  đến 2.000.000.000, tìm số bé hơn N có độ bền lớn nhất.

    Ví dụ

    Persist.inp Persist.out Giải thích
    100 77 Doben(77)=Doben(49)+1=Doben(36)+1+1=Doben(18)+1+1+1=Doben(8)+1+1+1+1=0+1+1+1+1=4

    Hướng dẫn.

    • Để tìm độ bền một số cần một hàm TICH(n) tính tích các chữ số của n.
    • Cho d = 0. Lặp lại điều kiện n >9 việc tăng d lên 1 thay n = TICH(n).
  • Bài toán Tháp Hà Nội (Tower of Hanoi)

    Bài toán Tháp Hà Nội (Tower of Hanoi)

    Bài toán Tháp Hà Nội (Tower of Hanoi)

    Bài toán Tháp Hà Nội là một bài toán rất nổi tiếng và kinh điển, rất thích hợp để minh họa cho thuật toán đệ quy.

    Bài toán Tháp Hà Nội là gì?

    Có 3 chiếc cọc được đánh dấu lần lượt là A, B, C và n chiếc đĩa. Các đĩa này có kích thước (đường kính) khác nhau và mỗi đĩa đều có một lỗ ở giữa để lồng vào cọc. Ban đầu, các đĩa đều nằm ở cọc A, trong đó, đĩa có đường kính nhỏ hơn luôn ở nằm trên đĩa đường kính lớn hơn.

    bài toán tháp hà nội

    Yêu cầu : Chuyển n đĩa từ cọc A sang cọc C với các điều kiện sau:

    • Mỗi lần chỉ chuyển được 1 đĩa
    • Trong quá trình chuyển, đĩa nhỏ phải luôn nằm trên đĩa lớn hơn.
    • Cho phép sử dụng cọc B làm cọc trung gian

    Cách giải Bài toán Tháp Hà Nội

    Chúng ta sẽ xét các trường hợp của n:

    • Trường hợp đơn giản nhất, n=1, ta chỉ cần chuyển 1 đĩa từ cọc A sang cọc C.
    • Với n=2, ta chuyển đĩa nhỏ nhất sang cọc B, chuyển đĩa còn lại sang cọc C, và cuối cùng chuyển đĩa nhỏ ở cọc B sang cọc C.
    • Với n>2, giả sử ta đã có cách chuyển n-1 đĩa từ một cọc sang một cọc khác. Như vậy, để chuyển n đĩa từ cọc nguồn sang cọc đích, ta cần chuyển n-1 đĩa từ cọc nguồn sang cọc trung gian. Sau đó chuyển đĩa lớn nhất từ cọc nguồn sang cọc đích. Cuối cùng, chuyển n-1 đĩa từ cọc trung gian sang cọc đích.

    Ví dụ, với n=3, chúng ta phải chuyển 7 lần tất cả như hình sau.

    cách giải bài toán tháp hà nội

    Mã nguồn chương trình bằng Python:

    def TowerOfHanoi(n , source, destination, auxiliary):
       if n==1:
          print("Chuyển đĩa 1 từ cọc",source,"sang cọc",destination)
          return
       TowerOfHanoi(n-1, source, auxiliary, destination)
       print("Chuyển đĩa",n,"từ cọc",source,"sang cọc",destination)
       TowerOfHanoi(n-1, auxiliary, destination, source)
    
    # Ví dụ với n = 4		
    n = 4
    TowerOfHanoi(n,'A','C','B')

    Kết quả chạy chương trình:

    Chuyển đĩa 1 từ cọc A sang cọc B
    Chuyển đĩa 2 từ cọc A sang cọc C
    Chuyển đĩa 1 từ cọc B sang cọc C
    Chuyển đĩa 3 từ cọc A sang cọc B
    Chuyển đĩa 1 từ cọc C sang cọc A
    Chuyển đĩa 2 từ cọc C sang cọc B
    Chuyển đĩa 1 từ cọc A sang cọc B
    Chuyển đĩa 4 từ cọc A sang cọc C
    Chuyển đĩa 1 từ cọc B sang cọc C
    Chuyển đĩa 2 từ cọc B sang cọc A
    Chuyển đĩa 1 từ cọc C sang cọc A
    Chuyển đĩa 3 từ cọc B sang cọc C
    Chuyển đĩa 1 từ cọc A sang cọc B
    Chuyển đĩa 2 từ cọc A sang cọc C
    Chuyển đĩa 1 từ cọc B sang cọc C
  • 50 bài tập lập trình Dart cơ bản

    50 bài tập lập trình Dart cơ bản

    50 bài tập lập trình Dart cơ bản

    50 bài tập lập trình Dart cơ bản dưới đây được chúng tôi gợi ý giải bằng ngôn ngữ Dart. Tuy nhiên, bạn hoàn toàn có thể sử dụng Python, C, C#, C++, Java hoặc các ngôn ngữ lập trình khác để giải quyết. Do đó chúng tôi tổng hợp chung lại thành một bài viết. Phần lời giải, nếu có, của từng ngôn ngữ sẽ có bài viết riêng.

    Xem thêm: Giáo trình tự học Flutter/Dart

    Playlist dạy lập trình Dart:

    1. Bài tập lập trình Dart, C, Java cơ bản sử dụng if for while

    Các bài tập này sử dụng các câu lệnh điều kiện if, câu lệnh rẽ nhánh for, while (câu lệnh điều khiển luồng chương trình).

    Bài 1. Viết chương trình hỏi người dùng họ tên và tuổi (là một số nguyên). Tính và in ra màn hình còn bao nhiêu năm nữa thì người đó mừng thọ 100 tuổi 🙂

    Xem thêm: Cách đọc input từ người dùng tại https://www.youtube.com/watch?v=UH9Hs1wiIqM

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-1.html

    Bài 2. Viết chương trình hỏi người dùng nhập vào một số nguyên. In ra màn hình số nguyên đó là số chẵn hay lẻ.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-2.html

    Bài 3. In ra màn hình tất cả các số nguyên dương lẻ nhỏ hơn 100.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-3.html

    Bài 4. Viết chương trình in ra tất cả các số lẻ nhỏ hơn 100 trừ các số 5, 7, 93.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-4.html

    Bài 5. Viết chương trình tìm số lớn nhất trong ba số thực a, b, c.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-5.html

    Bài 6. Viết chương trình kiểm tra xem hai số thực a b cho trước có cùng dấu hay không.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-6.html

    Bài 7. Viết chương trình in ra cách đọc của một số nguyên n cho trước có ba chữ số. Ví dụ với n=123 thì kết quả in ra màn hình là Một trăm hai mươi ba.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-7.html

    Bài 8. Viết chương trình sinh ra một số tự nhiên n ngẫu nhiên từ 1 đến 100. Đề nghị người dùng đoán một số và nhập vào. In ra màn hình thông báo xem số người dùng đoán đúng, lớn hơn hay nhỏ hơn số n. Nếu chưa đúng thì cho phép người dùng đoán lại hai lần nữa.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-8.html

    Bài 9. Viết chương trình tìm tất cả các số chia hết cho 7 nhưng không phải bội số của 5, nằm trong đoạn 10200. Các số thu được sẽ được in thành chuỗi trên một dòng, cách nhau bằng dấu phẩy.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-9.html

    Bài 10. Viết chương trình nhập ngày, tháng, năm. Hãy cho biết tháng đó có bao nhiêu ngày.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-10.html

    Bài 11. Viết chương trình nhập ngày, tháng, năm. Hãy cho biết ngày đó là thứ mấy.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-11.html

    Bài 12. Viết chương trình in bảng cửu chương ra màn hình.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-12.html

    Bài 13. Hãy sử dụng vòng lặp for để in tất cả các ký tự A tới Z ra màn hình.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-13.html

    Bài 14. Viết một chương trình tính giai thừa của một số nguyên dương n. Với n được nhập từ bàn phím. Ví dụ, n = 8 thì kết quả đầu ra phải là

    1*2*3*4*5*6*7*8 = 40320

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-14.html

    Bài 15. Viết chương trình tìm ước số chung lớn nhất (UCLN) của hai số nguyên dương ab nhập từ bàn phím.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-15.html

    Bài 16. Viết chương trình tìm bội số chung nhỏ nhất (BCNN) của hai số nguyên dương ab nhập từ bàn phím.

    Bài 17. Viết chương trình kiểm tra một số nguyên dương n có phải là số nguyên tố hay không.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-17.html

    Bài 18. Viết chương trình liệt kê n số nguyên tố đầu tiên. Số nguyên dương n được nhập từ bàn phím.

    Hướng dẫn. Bạn có thể tham khảo về sàng số nguyên tố

    Bài 19. Tìm số nguyên dương n nhỏ nhất sao cho 1 + 2 + … + n > 10000.

    Lời giải: Bài tập Dart số 19

    Bài 20. Viết chương trình liệt kê n số hạng đầu tiên của dãy Fibonacci không sử dụng hàm.

    Hướng dẫn. Nếu sử dụng hàm và lời gọi đệ qui thì bài toán khá đơn giản, xin mời xem lời giải ở bài 54. Ở đây, chúng ta sẽ sử dụng ba biến để luôn phiên thay đổi các số hạng của dãy Fibonacci và một biến đếm. 

    Lời giải: Bài tập Dart số 20-Dãy Fibonacci

    Bài 21. Viết chương trình tính tổng các giá trị lẻ nguyên dương nhỏ hơn số nguyên dương n cho trước.

    Bài 22. Viết chương trình tìm số nguyên dương m lớn nhất sao cho 1 + 2 + 3 + … + m < N.

    Bài 23. Viết chương trình liệt kê tất cả số nguyên tố có 5 chữ số.

    Bài 24. Viết chương trình phân tích số nguyên n thành các thừa số nguyên tố. Ví dụ: 100 = 2*2*5*5.

    Bài 25. Viết chương trình tính tổng của các chữ số của môt số nguyên n trong Dart. Số nguyên dương n được nhập từ bàn phím. Với n = 1234, tổng các chữ số: 1 + 2 + 3 + 4 = 10.

    Bài 26. Viết chương trình kiểm tra một số nguyên dương n có là số thuận nghịch hay không.

    Bài 27. Viết chương trình liệt kê tất cả các số nguyên tố nhỏ hơn n. Số nguyên dương n được nhập từ bàn phím.

    Bài 28. Liệt kê tất cả ước số của số nguyên dương n.

    Bài 29. Tính tổng tất cả ước số của số nguyên dương n.

    Bài 30. Tính tích tất cả ước số của số nguyên dương n.

    Bài 31. Đếm số lượng ước số của số nguyên dương n.

    Bài 32. Liệt kê tất cả ước số lẻ của số nguyên dương n.

    Bài 33. Cho số nguyên dương n. Tính tổng các ước số nhỏ hơn chính nó.

    Bài 34. Tìm ước số lẻ lớn nhất của số nguyên dương n. Ví dụ n = 100 ước lẻ lớn nhất của 10025.

    Bài 35. Cho số nguyên dương n. Kiểm tra số dương n có phải là số hoàn thiện (số hoàn hảo) hay không.

    Bài 36. Cho số nguyên dương n. Kiểm tra số nguyên dương n có phải là số nguyên tố hay không.

    Bài 37. Cho số nguyên dương n. Kiểm tra số nguyên dương n có phải là sốchính phương hay không.

    Bài 38. Cho n là số nguyên dương. Hãy tìm giá trị nguyên dương k lớn nhất sao cho S(k) < n. Trong đó chuỗi S(k) được định nghĩa như sau:

    S(k) = 1 + 2 + 3 + … + k

    Bài 39. Hãy đếm số lượng chữ số của số nguyên dương n.

    Bài 40. Hãy tính tổng các chữ số của số nguyên dương n.

    Bài 41. Hãy tìm chữ số đảo ngược của số nguyên dương n.

    Bài 42. Tìm chữ số nhỏ nhất của số nguyên dương n.

    Bài 43. Hãy kiểm tra số nguyên dương n có toàn chữ số lẻ hay không.

    Bài 44. Hãy kiểm tra các chữ số của số nguyên dương n có tăng dần từ trái sang phải hay không.

    Bài 45. Hãy kiểm tra các chữ số của số nguyên dương n có giảm dần từ trái sang phải hay không.

    Bài 46. Giải phương trình bậc nhất ax+b=0.

    Bài 47. Giải phương trình bậc hai ax^2+bx+c=0.

    Bài 48. Giải phương trình trùng phương ax^4+bx^2+c=0.

    Bài 49. Viết chương trình nhập 3 cạnh của một tam giác là các số nguyên dương. Hãy cho biết đó là tam giác gì.

    Bài 50. Lập chương trình giải hệ: $$\begin{cases} ax+by=c\\ dx+ey=f \end{cases}$$ Các hệ số a b c d e f nhập từ bàn phím. Yêu cầu xét tất cả các trường hợp có thể. (Gợi ý: Sử dụng định thức)

    2. Bài tập lập trình Dart, C, Java cơ bản sử dụng hàm

    Bài 51. Cần có tổng 200.000đ từ 3 loại tiền 1000đ, 2000đ, và 5000đ. Lập chương tình để tìm tất cả các phương án có thể.Tìm giá trị lớn nhất trong mảng một chiều các số thực.

    Bài 52. Viết chương trình tính tổng các số tự nhiên từ 1 tới n.

    Bài 53. Viết chương trình tính giai thừa của số tự nhiên n.

    Bài 54. Viết hàm tính số hạng thứ n của dãy Fibonacci.

    Bài 55. Viết hàm kiểm tra xem số nguyên dương n có là số nguyên tố hay không.

    Bài 56. Viết hàm tìm UCLN của hai số nguyên ab sử dụng đệ quy.

  • KINH NGHIỆM PHỎNG VẤN FLUTTER

    KINH NGHIỆM PHỎNG VẤN FLUTTER

    KINH NGHIỆM PHỎNG VẤN FLUTTER

    Bài này chúng tôi xin chia sẻ một số kinh nghiệm phỏng vấn Flutter, các kiến thức liên quan chúng tôi đều để link đến bài viết tương ứng.

    I. Phỏng vấn Flutter cơ bản

    Đối với phần này, bạn cần nắm và hiểu rõ các kiến thức sau:

    1. Ưu điểm của Flutter
    2. Lifecycle của một Widget
    3. Phân biệt StatelessWidgetStatefulWidget
    4. Các widget thông dụng (Container, Text, Column, Row, Stack, GridView, ListView, SingleScrollView…)
    5. Cách quản lý trạng thái (State Management) của app, bạn có thể sử dụng StatefulWidget hoặc Provider, GetX, Bloc
    6. AOT (Ahead-of-Time) và JIT (Just-in-Time)
    7. Null Safety là gì?
    8. Xử lý bất đồng bộ async trong Dart
    9. Các loại tham số trong hàm của flutter?
    10. Cách sử dụng Key trong Flutter
    11. Cách sử dụng Animation
    12. Phân biệt Widgets, RenderObjects and Elements
    13. Giao tiếp với Backend (SQL, Firebase, Websocket, Logging…)
    14. Testing (BDD, TDD, A/B test…)
    15. Package management + Public to store (iOS + Android)
    16. Null safety để làm gì?
    17. Sự khác nhau httpdio như thế nào?
    18. BlocCubit khác nhau như thế nào?
    19. BlocConsumer dùng để làm gì?
    20. Cách cấp quyền truy cập internet, đọc và ghi dữ liệu…

    Ngoài ra, khi bạn đi phỏng vấn Flutter, người tuyển dụng sẽ chọn một app có sẵn trong điện thoại, sau đó chọn ngẫu nhiên một màn hình và yêu cầu bạn tạo ra UI của màn hình đó.

    II. Phần phỏng vấn Flutter nâng cao

    1. Stream, Isolate, Event Loop, Microtask
    2. Painting Widget
    3. Wrap native lib qua lib Flutter (từ Android hoặc iOS)
    4. Và phần khó nhất của hầu hết mọi dev – Profiling

    III. Một số câu hỏi phỏng vấn Flutter thường gặp

    #Flutter ra đời như thế nào?

    Phiên bản alpha đầu tiên của Flutter đã xuất hiện cách đây gần ba năm – vào tháng 5 năm 2017. Không ai hồi đó nghĩ rằng nó lại trở nên phổ biến trong một khoảng thời gian ngắn như vậy. Nó đã nhận được nhiều “sao” đánh giá trên GitHub hơn đối thủ cạnh tranh lớn nhất của nó là React Native kể từ khi phát hành ổn định vào tháng 12 năm 2018. Nhiều công ty bắt đầu nhận thấy tiềm năng của Flutter và đang tìm kiếm các nhà phát triển sẵn sàng viết ứng dụng.

    #Ai đã tạo ra Flutter?

    Dart được Google tạo ra vào năm 2011. Đây là một ngôn ngữ lập trình mã nguồn mở, có thể mở rộng, với các thư viện và hiệu suất chạy khá tốt, để xây dựng web, máy chủ và ứng dụng di động. Flutter là một Framework sử dụng ngôn ngữ lập trình Dart để xây dựng các ứng dụng di động.

    #Dart là gì?

    Dart là một ngôn ngữ lập trình hướng đối tượng, có mục đích chung với cú pháp kiểu C. Nó là mã nguồn mở và được phát triển bởi Google vào năm 2011. Mục đích của lập trình Dart là tạo giao diện người dùng frontend cho web và ứng dụng di động. Nó là một ngôn ngữ quan trọng để tạo ứng dụng Flutter. Ngôn ngữ Dart có thể được biên dịch cả AOT (Ahead-of-Time) và JIT (Just-in-Time).

    #Flutter có miễn phí không?

    Có. Flutter là miễn phí và mã nguồn mở.

    #Ưu điểm của Flutter là gì?

    Các ưu điểm phổ biến của Flutter framework như sau:

    • Phát triển đa nền tảng: Tính năng này cho phép Flutter viết code một lần, duy trì và có thể chạy trên các nền tảng khác nhau (mobile, desktop, web…) Nó tiết kiệm thời gian, công sức và tiền bạc của các nhà phát triển.
    • Phát triển nhanh hơn: Hiệu suất của ứng dụng Flutter rất nhanh. Flutter biên dịch ứng dụng bằng cách sử dụng thư viện nhánh C / C ++ giúp ứng dụng gần với code máy hơn và mang lại cho ứng dụng hiệu suất gốc tốt hơn.
    • Cộng đồng tốt: Flutter có hỗ trợ cộng đồng tốt, nơi các nhà phát triển có thể hỏi các vấn đề và nhận được kết quả nhanh chóng.
    • Tải lại trực tiếp và nóng: Nó làm cho quá trình phát triển ứng dụng cực kỳ nhanh chóng. Tính năng này cho phép chúng tôi thay đổi hoặc cập nhật code được phản ánh ngay sau khi các thay đổi được thực hiện.
    • code tối thiểu: Ứng dụng Flutter được phát triển bởi ngôn ngữ lập trình Dart, sử dụng biên dịch JIT và AOT để cải thiện thời gian khởi động tổng thể, hoạt động và tăng tốc hiệu suất. JIT nâng cao hệ thống phát triển và làm mới giao diện người dùng mà không cần nỗ lực thêm vào việc xây dựng hệ thống mới.
    • Tập trung vào giao diện người dùng: Nó có giao diện người dùng tuyệt vời vì nó sử dụng widget tập trung vào thiết kế, các công cụ phát triển cao, API nâng cao và nhiều tính năng khác.
    • Tài liệu: Flutter có hỗ trợ tài liệu rất tốt. Nó được tổ chức và nhiều thông tin hơn. Chúng ta có thể lấy mọi thứ mà chúng ta muốn viết ở một nơi.

    #Null Safety là gì?

    #Widget trong Flutter là gì?

    Một ứng dụng Flutter luôn được coi là một cây các material. Bất cứ khi nào bạn định viết code để xây dựng bất cứ thứ gì trong Flutter, nó sẽ nằm bên trong một widget. Các widget mô tả chế độ xem ứng dụng của bạn trông như thế nào với cấu hình và trạng thái hiện tại của chúng. Khi bạn thực hiện bất kỳ thay đổi nào trong code, widget con sẽ xây dựng lại mô tả của nó bằng cách tính toán sự khác biệt của widget con hiện tại và trước đó để xác định những thay đổi tối thiểu đối với việc hiển thị trong giao diện người dùng của ứng dụng.

    Các widget được lồng vào nhau để xây dựng ứng dụng. Nó có nghĩa là thư mục gốc của ứng dụng của bạn tự nó là một widget và tất cả các cách nhìn xuống cũng là một widget. Ví dụ: một widget có thể hiển thị một cái gì đó, có thể xác định thiết kế, có thể xử lý tương tác, v.v.

    #Sự khác biệt giữa stateless và stateful widget là gì?

    Các stateless widget chúng chỉ được tạo một lần, do đó trong phương thức build cũng chỉ được gọi một lần. Ngược lại stateful widget có thể được rebuild lại khi có giá trị thay đổi.

    #Vòng đời của StatefulWidget là gì?

    • createState() – một phương thức trong một phương thức StatefulWidget được gọi ngay lập tức và sẽ trả về một State của các đối tượng widget.
    • initState() – phương thức đầu tiên được gọi trong State widget sau khi widget được tạo.
    • didChangeDependencies() – được gọi ngay sau initState() lần đầu tiên được gọi.
    • build() – rất giống với từ StatelessWidget . Nó được gọi ngay sau đó didChangeDependencies(). Nó được gọi mỗi khi giao diện người dùng cần hiển thị và trả về widget tree.
    • didUpdateWidget() – nó được gọi khi widget đã thay đổi và cần vẽ lại giao diện người dùng của nó
    • deactivate() – được gọi trước dispose() , khi đối tượng này được xóa ra khỏi cây widget.
    • dispose() – được gọi khi widget đã bị xóa khỏi state và không thể khởi tạo lại.

    #SafeArea widget là gì?

    Đây là một widget bao ngoài tất cả widget khác, mục đích là để nó không chiếm vào thanh thông báo của thiết bị, ứng dụng sẽ nằm ở dưới thanh thông báo.

    #Flutter chỉ dành cho ứng dụng di động?

    Không, bạn cũng có thể xây dựng các ứng dụng web – mặc dù nó vẫn đang trong giai đoạn thử nghiệm và chưa được phát hành chính thức.

    #Những cách nào để tạo navigation?

    #Flutter có thực sự là native không?

    Ứng dụng Flutter được biên dịch thành một thư viện ARM và x86 native, vì vậy, về mặt kỹ thuật, nó như là native.

    #Làm cách nào để bạn đặt kích thước widget dựa trên kích thước màn hình?

    Sử dụng hàm MediaQuery.of(context).size

    #Lệnh để cập nhật tất cả các plugin là gì?

    flutter pub upgrade

    #Lập trình bất đồng bộ trong Dart (Flutter) như thế nào? Future trong Flutter là gì?

    #Factory trong Flutter là gì?

    https://api.flutter.dev/flutter/foundation/Factory-class.html

    #Các loại tham số trong hàm flutter?

    https://www.youtube.com/watch?v=n5eix5aeZvg

    #Phân biệt constfinal

    #Tệp pubspec.yml là gì?

    Đó là một tệp mà bạn có thể khai báo sử dụng tất cả các thư viện, plugin, font chữ, hình ảnh… của dự án Flutter của bạn. Đó cũng là nơi bạn định cấu hình tên và mô tả của dự án. Tệp này chứa:

    • Cài đặt chung của dự án như tên, mô tả và phiên bản của dự án.
    • Sự phụ thuộc của dự án.
    • Nội dung dự án (ví dụ: hình ảnh, âm thanh, v.v.).

    #Tập tin AndroidManifest.xml là gì?

    #Tập tin Info.plist là gì?

    #Làm cách nào để bạn đặt biểu tượng ứng dụng trong Android và iOS?

    #Làm thế nào để tạo một TextField với giá trị ban đầu?

    Chúng ta cần đặt một controller với giá trị ban đầu:

    • TextEditingController(text: ‘Giá trị ban đầu’); .
    • FocusScope.of(context).unfocus();

    #Làm thế nào để bạn tải một hình ảnh từ mạng?

    Để hiển thị hình ảnh từ một URL, chúng ta có thể sử dụng hàm Image.network()

    #Làm thế nào để bạn ghi đè nút back trên thiết bị?

    Chúng ta có thể sử dụng WillPopScope widget cho việc này.

    #Mục đích của thuộc tính reverse trên một ListView widget là gì?

    Nó hiển thị các item trong ListView theo thứ tự đảo ngược.

    #Tween Animation là gì?

    Đây là hình thức rút gọn của in-betweening. Trong hoạt ảnh tween, bắt buộc phải xác định điểm đầu và điểm cuối của hoạt ảnh. Nó có nghĩa là hoạt ảnh bắt đầu với giá trị bắt đầu, sau đó đi qua một loạt các giá trị trung gian và cuối cùng đạt đến giá trị kết thúc. Nó cũng cung cấp dòng thời gian và đường cong, xác định thời gian và tốc độ của quá trình chuyển đổi. framework công cụ cung cấp tính toán về cách chuyển đổi từ điểm đầu và điểm cuối.

    #Stream trong Flutter là gì?

    Luồng là một chuỗi các sự kiện không đồng bộ. Nó cung cấp một chuỗi dữ liệu không đồng bộ. Nó cũng giống như một đường ống mà chúng ta đặt một số giá trị vào một đầu và nếu chúng ta có một người nghe ở đầu kia, nó sẽ nhận được giá trị đó. Chúng tôi có thể giữ nhiều người nghe trong một luồng và tất cả những người nghe đó sẽ nhận được cùng một giá trị khi được đưa vào đường dẫn.

    (Các câu hỏi khác mời bạn xem trong bài Các câu hỏi phỏng vấn Flutter)

  • AppSheet là gì?

    AppSheet là gì?

    AppSheet là gì?

    AppSheet là công cụ/nền tảng tạo ứng dụng mà không cần biết mã lệnh (code). Thay vì học mã (như Flutter – một nền tảng phát triển ứng dụng di động, ứng dụng web chuyên nghiệp) hoặc tìm ai đó để tạo ứng dụng bạn cần, bạn có thể sử dụng AppSheet để tự tạo ứng dụng bằng cách kéo thả. Với AppSheet bạn có thể tập trung vào việc sử dụng nó thay vì phát triển hoặc sửa chữa nó.

    AppSheet là một phần của Google Cloud – Nền tảng tạo ứng dụng no-code cho mọi đối tượng.

    AppSheet của Google Cloud là nền tảng phát triển ứng dụng không cần mã — cho phép bạn nhanh chóng tạo các ứng dụng dành cho thiết bị di động và máy tính để bàn bằng dữ liệu hiện có của mình.
    appsheet là gì?

    Cách tạo ứng dụng AppSheet?

    1️⃣Truy cập https://www.appsheet.com/ và tạo tài khoản (sử dụng tài khoản Google).

    2️⃣Chọn Start for free để bắt đầu tạo app mới hoặc lựa chọn các mẫu app có sẵn.

    3️⃣Sử dụng chuột và kéo thả các thành phần có sẵn để tạo nên một app hoàn chỉnh.

    Bạn có thể tạo ứng dụng của riêng mình bằng AppSheet trực tiếp từ Google Trang tính (Google Sheets). Mở một Trang tính chọn Công cụ ▶AppSheet ▶ Tạo ứng dụng. Sau đó bạn sử dụng tài khoản AppSheet (hoặc tạo mới nếu bạn chưa có) để bắt đầu xây dựng ứng dụng của mình.
    tao appsheet voi google sheets

    Xem thêm Hướng dẫn Google Sheets nhanh (Google Sheets cheat sheet)

    Ứng dụng AppSheet có thể làm gì?

    Ứng dụng AppSheet chính là cách No-code giúp IT thúc đẩy sự đổi mới tại nơi làm việc. Lọai bỏ gánh nặng cho việc tạo các ứng dụng tại nơi làm việc dựa trên CNTT mà không phải lo lắng tính bảo mật và cách quản trị được phát triển ứng dụng trên nền tảng No-code từ AppSheet.

    Cho phép các nhà phát triển trong tổ chức của bạn tạo ra các giải pháp sáng tạo tại nơi làm việc mà họ cần để hoàn thành công việc tốt hơn, nhanh hơn và khả năng hiển thị cao hơn.

    Bạn có thể tự tạo ứng dụng quản lý doanh nghiệp cho riêng mình chỉ với vài click chuột!

    Ứng dụng AppSheet là các ứng dụng di động và máy tính để bàn với các tính năng mạnh mẽ:
    • Capture Images
    • Log Locations
    • Scan Barcodes
    • Deliver Notifications
    • Generate Reports
    • Send Emails
    • Build Dashboards
    • Accept Signatures
    • Work Offline
    • Install Across Devices
    • Integrate Platforms
    • Apply Logic
  • Class in Dart / Flutter

    Class in Dart / Flutter

    Class in Dart/Flutter

    What is class in Dart?

    • In object-oriented programming, a class is a blueprint for creating objects (a particular data structure), providing initial values for state (member variables or attributes), and implementations of behavior (member functions or methods).
    • We can assume a class as a sketch (prototype) or a car. It contains all the details about model name, year, features, price, etc. Based on these properties of the car, we can build the car. Here the car is an object.
    • There can be many cars so we can create many objects of cars to access all the properties.

    what is class in dart flutter

    Benefit of object-oriented programming

    • Modularity: The source code of an object can be maintained individually and can hide from the other object’s source code.
    • Data – hiding: Using oops programming, the details of the internal functionality of code are hidden from the others. For example – Users only interact with the application, but they don’t familiar with the internal implementation.
    • Reusability: We don’t need to write the same code again and again. We can use the object of class multiple times in our program.
    • Pluggability and debugging easy: If any object is creating a problem in our program, and then we can replace it in our program and plug the new object as its replacement. The oops code can be easy to debug.

    Defining a Class in Dart

    Dart provides class keyword followed by a ClassName is used to define a class; all fields and functions are enclosed by the pair of curly braces {}.

    class ClassName {
      <fields/properties>
      <getters/setters>
      <constructors>
      <functions>
    }
    • <fields/properties> any variable declared in a class, represent data pertaining to objects.
    • <getters/setters> initialize and retrieve the values of the fields of a class
    • <constructors> responsible for allocating memory for the objects of the class.
    • <functions> represent actions an object can take

    class in dart

    Creating Instance of the class

    • To create an instance of the class, use the new keyword followed by the class name.

    var object_name = new ClassName([arguments])

    • The new keyword is responsible for instantiation. Starting from Dart 2, the keyword new can be omitted.
    • The right-hand side of the expression invokes the constructor.
    • The constructor should be passed values if it is parameterized.

    Libraries and visibility

    • a library referring to the code inside a file with the .dart extension
    • to use that particular library, you have to reference its content with the import keyword
    • using the as keyword if have two different libraries have implemented a class with the same name
    • selectively import or exclude types using the show and hide keywords

    Class Constructors

    A constructor is a special function of the class that is responsible for initializing the variables of the class. Dart defines a constructor with the same name as that of the class. A constructor is a function and hence can be parameterized. However, unlike a function, constructors cannot have a return type.

    👉Named and positional parameters in Dart

    Class_name(parameter_list) {
    //constructor body
    //.............
    }
    • If your class doesn’t define a constructor, the compiler automatically adds a default constructor with no parameters and an empty body.
    • The “initializing formal” using this keyword, more readable and it initializes the variables immediately
    • With null safety, a named argument with a non-nullable type must either have a default or be marked with the new required keyword. Otherwise, it wouldn’t make sense for it to be non-nullable, because it would default to null when not passed.
    • With the “initializing formal” you can still declare a body to perform additional setup for the class, constructors cannot have a return type.
    • If you don’t declare a constructor, a default no-argument constructor is provided for you.

    Initializer list

    • When using the initializing formal approach, the names of the variables must match the ones declared in the constructor.
    • If you wanted to keep fields private but with a different name in the constructor, use an initializer list
    class Test {
    int _secret;
    double _superSecret;
    Test(int age, double wallet)
    : _secret = age,
    _superSecret = wallet;
    }

    Named Constructors

    Named constructors are generally used to implement a default behavior the user expects from your class. They are the only alternative to have multiple constructors since Dart has no method overload.

    Class_name.constructor_name(param_list)

    Redirecting constructors

    Sometimes you might have a constructor that does almost the same thing already implemented by another one. It may be the case to use redirecting constructors in order to avoid code duplication.

    Factory constructors

    • The factory keyword returns an instance of the given class that’s not necessarily a new one. It can be useful when:
      • you want to return an instance of a subclass instead of the class itself,
      • you want to implement a singleton (the Singleton pattern),
      • you want to return an instance from a cache.
    • Factory constructors are like static methods and so they don’t have access to this. There cannot be together a factory and a “normal” constructor with the same name.

    static variables and methods

    • The static keyword can be applied to the data members of a class, i.e., fields and methods. A static variable retains its values till the program finishes execution. Static members are referenced by the class name.
    • The static variables and methods are part of the class instead of a specific instance.
    • The static keyword is used for a class-level variable and method that is the same for every instance of a class, this means if a data member is static, it can be accessed without creating an object.
    • The static keyword allows data members to persist values between different instances of a class.
    • There is no need to create a class object to access a static variable or call a static method: simply put the class name before the static variable or method name to use them.

    The this keyword

    The this keyword refers to the current instance of the class. Here, the parameter name and the name of the class’s field are the same. Hence to avoid ambiguity, the class’s field is prefixed with the this keyword.

    Accessing Attributes and Functions

    A class’s attributes and functions can be accessed through the object. Use the “.” dot notation (called as the period) to access the data members of a class.

    //accessing an attribute
    obj.field_name
    //accessing a function
    obj.function_name()

    Cascade notation

    • The cascade notation (..) in Dart allows you to make a sequence of operations on the same object (including function calls and field access).
    • This notation helps keep Dart code compact and removes the need to create temporary variables to store data.

    Encapsulation (Access modifiers)

    • In Java, we can use public, protected, and private keywords to control the access scope for a property or method. However, Dart doesn’t provide that
      kind of keywords. Instead, you can use _ (underscore) at the start of the name to make a data member of a class becomes private.
    • In Dart, the privacy is at library level rather than class level. It means other classes and functions in the same library still have the access. So, a data member is either public (if not preceded by _) or private (if preceded by _)

    Getters and Setters

    • Getters and Setters, also called as accessors and mutators, allow the program to initialize and retrieve the values of class fields respectively. Getters or accessors are defined using the get keyword. Setters or mutators are defined using the set keyword.
    • A default getter/setter is associated with every class. However, the default ones can be overridden by explicitly defining a setter/ getter. A getter has no parameters and returns a value, and the setter has one parameter and does not return a value.

    Class Inheritance

    • Dart supports the concept of Inheritance which is the ability of a program to create new classes from an existing class. The class that is extended to create newer classes is called the parent class/super class. The newly created classes are called the child/sub classes.
    • A class inherits from another class using the extends keyword. Child classes inherit all properties and methods except constructors from the parent class.

    Types of Inheritance

    • Inheritance can be of the following three types:
    • Single – Every class can at the most extend from one parent class.
    • Multiple – A class can inherit from multiple classes. Dart doesn’t support multiple inheritance.
      Multi-level – A class can inherit from another child class.

    Class Inheritance and Method Overriding

    • Method Overriding is a mechanism by which the child class redefines a method in its parent class.

    super keyword

    • The super keyword is used to refer to the immediate parent of a class.
    • The super keyword can be used to refer to the super class version of a variable, property, or method.

    super and constructors

    Every subclass in Dart automatically tries to call the default constructor of the superclass. If there isn’t one, you must call the superclass constructor
    manually in the initializer list.

    Abstract class

    • The abstract keyword defines a class that cannot be directly instantiated: only its derived classes can. An abstract class can define one (or more)
      constructors as usual.
    • Usually abstract classes contain abstract methods which can be defined putting a semicolon (;) instead of the body. You cannot define an abstract
      method in a class that’s not been marked with the abstract modifier.
    • If your class contains at least one method with no body, then it must be abstract and the children must provide an implementation.

    Interfaces

    • In contrast to other programming languages, Dart does not have an interface keyword and you have to use classes to create interfaces. Your class can
      implement more than a single interface.
    • The keyword is implements and, differently from a regular subclass, here you must override every method defined by the class/interface.
    • In Dart when you use the term interface you are referring to a class that is going to be used by others along with implements because it only provides method signatures. The concept is the same you can find in Java, Delphi or C# with the only difference that Dart doesn’t have a dedicated keyword.
    • While extends can be used with only one class, implements works with one or more classes, which you should treat as interfaces (methods with no body).

    extends vs implements

    • When you use class B extends A {} you are NOT forced to override every method of class A. Inheritance takes place and you can override as many methods as you want. This is the typical OOP inheritance that can be used when you want to add some missing features in a subclass.
    • When you use class B implements A {} you must override every method of class A. Inheritance does NOT take place because methods just provide an API, a “skeleton” that the subclass must concretize.
    • Interfaces are useful when you don’t want to provide an implementation of the functions but just the API. It’s like if the interface was wall socket and the class was the plug that adapts to the holes. While multiple inheritance is not allowed, you can extends a class and implements more than one.

    Mixins

    • a mixin is simply a class with no constructor that can be “attached” to other classes to reuse the code without inheritance
    • mixins like a “copy/paste” tool to reuse methods

    override operators

    • Operator overloading gives the possibility to customize the usage of operators in your classes.
    • Arithmetic operators like +, -, *, or /.
    • Relational operators such as >=, <=, > or <.
    • Equality operators like != and ==

    callable classes

    There is a special call() method which is very closely related to an operator overload because it allows classes to be called like if they were functions with
    the () operator.