Flutter tutorial: Lập trình Flutter với Server API

Tiếp theo trong Flutter tutorial này, Báo Flutter xin gửi đến các bạn bài viết chi tiết về Lập trình Flutter với Server API.

Rất nhiều dự án Flutter sử dụng Server APIs để lấy dữ liệu thông qua http communication, ví dụ dưới đây là một thể loại điển hình.

Bài viết mới nhất về hướng dẫn chi tiết làm việc với API : click tại đây

Có thể rất nhiều khái niệm mà bạn không biết trong lập trình Flutter với Server APIs nhưng bạn sẽ sáng tỏ sau khi làm theo Báo Flutter trong bài viết này:

Bài viết này sẽ hướng dẫn bạn tạo ra một ứng dụng hiển thị các bộ phim được xem nhiều nhất và chi tiết từng bộ phim đó.

Các bước chính khi làm việc với Server APIs trong Flutter:

+ Lấy Api Url( Server API link), lấy file JSON
+ Tạo file model.dart từ cấu trúc của file JSON
+ Tạo file APIProvider.dart
+ Tạo file repository.dart
+ Tạo file bloc
+ Thiết lập : UI

Bạn không hiểu phải không ? Vậy là đúng ý của Báo Flutter rồi. Tôi muốn các bạn có thật nhiều thắc mắc và làm theo hướng dẫn của tôi bạn sẽ vỡ ra nhiều thứ và hiểu hơn.

Lấy Api Url( Server API link), lấy file JSON
Để có 1 link Server API và thì không quá khó, bạn có thể dùng Jsonplaceholder để có thể có một file JSON từ thư mục Resources. Nhưng trong bài này Báo Flutter muốn bạn làm quen với thực tế – lấy API key sau khi đăng kí để lấy Server API của một Website.

– Truy cập TheMovieDB – để đăng kí tài khoản.
– Sau khi đăng kí xong, chọn mục Setting để đăng kí nhận API key :

Sau đó click vào API bên trái và click mục đăng kí : Request an API key

Các mục trong phần đăng kí, bạn có thể điền tự do, trừ email: điền đúng email của bạn.

Sau khi đăng kí xong, click vào mục API bên tay trái và kéo xuống mục API Key (v3 auth). Vậy là bạn có API key và có thể lấy Data từ Server.

Để có thể test API key của bạn bằng việc mở đường link từ mục: Example API Request, chứa nội dung của các field trong 1 file JSON.

+ Tạo file model.dart từ cấu trúc của file JSON

Sau khi đã lấy được API key và mở link : https://api.themoviedb.org/3/movie/popular?api_key=”api key của bạn”, bạn có thể thấy file JSON như bên dưới:

– Vậy là chúng ta đã lấy được data, bây giờ là thời gian viết ứng dụng : Hiển thị những phim phổ biến gần đây.

– tạo Flutter project mới, có tên : basic_server_api
– Trong file main.dart, xoá hết và nhập đoạn code bên dưới dù báo lỗi:

– tiếp theo tạo các packages, như bên dưới :

– trong package: models, tạo file item_model.dart. Xuất phát từ form JSON trên, chúng ta tạo các class như bên dưới:

* Tạo file APIProvider.dart

– Sau khi tạo xong model, tạo file : movie_api_provider.dart trong package: resource, để tạo phương thức để lấy data (ItemModel) từ Server.
– Để làm việc này, chúng ta sẽ sử dụng thư viện: http => mở file pubspec.yaml , thêm : http: ^0.12.0+1, sau đó nhấn : “Packages get”.
– Thêm đoạn code bên dưới :

* Tạo file repository.dart

Trong package : resource, tạo file : repository.dart để load ItemModel- sử dụng provider : MovieApiModel.

* Tạo bloc
Từ package : blocs, tạo movies_bloc.dart, file này giúp load data lên UI. Bloc sử dụng rx dart để sử lý các stream data.
Trong file: pubspec.yaml , add : rxdart: ^0.24.0

* Thiết lập: UI

Tạo file movie_list.dart, để tạo giao diện hiển thị data :

Dưới đây là kết quả :

Đó là kết quả sau khi lấy dữ liệu từ server và hiển thị. Còn click vào từng ảnh và hiển thị thông tin thì sao ?

Tương tự như những bước trên, ta cũng cần phải làm các bước:
+ Lấy mẫu form JSON
+ Tạo model
+ Tạo provider
+ Tạo repository
+ Tạo bloc
+ Tạo Ui

+ Lấy mẫu form JSON
Server Api link của các film : http://api.themoviedb.org/3/movie/”id của item_model”?api_key=”api key của bạn”
Form của Json :

* Tạo model cho detail item
– Trong package: models, tạo file : movie_detail_model.dart

+ Tạo provider
Trong file : movie_api_provider.dart, chúng ta thêm hàm fetchMovieDetail():

+ Tạo repository
Thêm line trong file repository.dart:

+ Tạo bloc
Trong package: blocs, tạo thêm file : movie_detail_bloc.dart

+ Tạo file Movie Detail UI:
Trong file : movie_detail.dart

– tiếp theo đó , chúng ta cần tích hợp trong màn hình chính , để có thể click vào từng item để xem chi tiết.
Trong file: movie_list.dart, trong hàm : buildList , mục onTap , thêm dòng code :

và viết hàm : openDetailPage ();

Vậy là đã xong, dưới đây là kết qủa sau khi click vào item :

Quá dài phải không các bạn ? Lại còn khó hiểu nữa ? Tôi muốn các bạn có thật nhiều thắc mắc.
Và sẽ đặt nhiều câu hỏi, khi đó bạn có thể hiểu đầy đủ về bloc ,kết nối API Server.
Tất cả đều được giải thích trong blog này của tôi.

Để hiểu thêm về các khái niệm, các bạn có thể đọc lại kiến thức về Bloc – trong chương IV, kiến thức về: lập trình bất đồng bộ trong chương I.

Nếu các bạn có lỗi khi chạy , bạn có thể tham khảo source code trong file Github của tôi .

Chúc các bạn có được nhiều kiến thức từ bài viết của tôi !

* Có một số nội dung được tham khảo từ các bài báo nước ngoài.

8 Replies to “Flutter tutorial: Lập trình Flutter với Server API”

  1. anh ơi, em lấy trên github của anh về. Run lên thì nó chỉ chạy vào trường hợp trả về circular thôi ạ. Nó k show list, em cám ơn

    1. Chào em, dấu hiệu như vậy có nghĩa là : em chưa load data được từ internet
      Code a đưa lên Github chưa có API Key nên không thể load data được.

      Vì vậy, em cần đăng kí trên trang đó và lấy API Key và thử lại nhé

      Chúc em may mắn !

  2. Exception: Bad state: Insecure HTTP is not allowed by platform

    Unhandled Exception: type ‘Future’ is not a subtype of type ‘Future’

    Của em báo 2 lỗi như này và app chỉ nhảy vào đoạn load chứ không hiện phim lên

  3. Non-nullable instance field ‘_total_pages’ must be initialized.
    Try adding an initializer expression, or add a field initializer in this constructor, or mark it ‘late’.dartnot_initialized_non_nullable_instance_field
    <<< Hi anh, ở model item bị lỗi như thế này ạ ? Anh có gặp lỗi này chưa ?

  4. Em đang học về cách ghép api và em bị lỗi này:
    type ‘PublishSubject’ is not a subtype of type ‘Stream’
    Em phải sửa như nào ạ, em cảm ơn.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *