MỤC LỤC
Từ giữa thập niên 2000 cho tới nay, CSS3 ra đời mà giới thiệu nhiều tính năng mới, tính năng nâng cao như bo góc cho viền, màu gradients, cung cấp từ khoá định nghĩa các hoạt hoạ chuyển động trên trang web, cung cấp các từ khoá để định nghĩa các media-query phục vụ cho việc phát triển trang web có thể hiển thị trên nhiều trình duyệt với độ rộng màn hình khác nhau, cũng như giới thiệu grid-layout, flexbox layout. JQuery cung cấp các phương thức ở mức nâng cao, trừu tượng để lập trình viên xử lí các tác vụ nêu trên, trừu tượng hoá sự khác biệt giữa các trình duyệt, nhờ đó mà các dòng lệnh Javascript giữa các lập trình viên, giữa các mã nguồn trở nên đồng bộ hơn, các lập trình viên cũng không cần quan tâm các trình duyệt xử lí các dòng lệnh theo các cách khác nhau khi mà thư viện jQuery đã hỗ trợ việc đó cho họ.
AJAX là kỹ thuật giúp trang web được cập nhật dữ liệu thông qua việc giao tiếp bất đồng bộ với server, cập nhật dữ liệu mà không phải tải lại trang. Các công nghệ mới như PWA, kiến trúc serverless nhằm giảm công sức tiền bạc của các nhà phát triển ứng dụng, mang đến ứng dụng ổn định cho người dùng, mang lại các tính năng hiện đại như đẩy thông báo, khả năng sử dụng ứng dụng khi không có mạng, caching trang web,.
Các nền tảng và công cụ phát triển low code phổ biến bao gồm Microsoft Power Platform (Power Apps, Power Automate, Power BI), Mendix, OutSystems, Appian và Salesforce Lightning Platform. Các nền tảng này cung cấp nhiều chức năng, từ tạo ứng dụng cơ bản đến phát triển ứng dụng cấp doanh nghiệp, đáp ứng các yêu cầu kinh doanh khác nhau. Việc áp dụng công nghệ phát triển phần mềm low-code tiếp tục phát triển khi các tổ chức tìm cách đẩy nhanh quá trình phân phối ứng dụng, giảm chi phí phát triển và chi phí nhân sự khi không cần phải xây dựng một đội xây dựng phần mềm. Micro Front End Architecture. Kiến trúc Micro Front End là một cách tiếp cận xây dựng các ứng dụng web bằng cách chia tầng Frontend thành các đơn vị nhỏ hơn, có thể triển khai và quản lý độc lập được gọi là micro Frontend tương tự như microservice trong phát triển Backend. Kiến trúc Micro Frontend có thể được triển khai bằng nhiều chiến lược khác nhau như:. a) IFrames: Sử dụng iframe để nhúng và tách biệt các phần khác nhau của ứng dụng. b) JavaScript framework: Tận dụng các JavaScript framework như Web Components, Angular Elements, hoặc các micro Frontend frameworks tuỳ biến. Việc áp dụng Kiến trúc Micro Frontend cho phép các tổ chức:. a) Cải thiện tốc độ phát triển: Các nhóm độc lập có thể làm việc đồng thời, đẩy nhanh tiến độ phát triển ứng dụng. c) Tính linh hoạt và lựa chọn công nghệ: tổ chức có thể tự do lựa chọn các công cụ. và công nghệ tốt nhất, phù hợp cho nhu cầu cụ thể của từng Micro Frontend. Tuy nhiên, việc quản lý việc tích hợp nhiều Micro Frontend, đảm bảo tính nhất quán trong trải nghiệm người dùng và xác định các giao thức liên lạc giữa các Micro Frontend là những thách thức cần được xem xét và lập kế hoạch cẩn thận khi áp dụng kiến trúc này. GraphQL là ngôn ngữ truy vấn và thời gian chạy dành cho các API được Facebook phát triển và có nguồn mở vào năm 2015. Nó cung cấp một giải pháp thay thế linh hoạt, hiệu quả và mạnh mẽ cho các API REST truyền thống bằng cách cho phép khách hàng chỉ yêu cầu dữ liệu họ cần và nhận chính xác dữ liệu đó ở dạng có thể dự đoán được. Các tính năng và khái niệm chính của GraphQL bao gồm:. a) Định nghĩa lấy kiểu dữ liễu: Client có thể chỉ định chính xác dữ liệu mà họ yêu cầu bằng cách xác định các truy vấn theo một quy chuẩn. Điều này hạn chế việc truy vấn dữ liệu quá mức hoặc truy vấn dữ liệu dưới mức cần thiết trong API REST. b) Một endpoint duy nhất: GraphQL thường hiển thị một điểm cuối duy nhất đóng vai trò là điểm đầu vào cho tất cả các hoạt động dữ liệu. Điều này trái ngược với nhiều điểm cuối trong API RESTful. c) Cấu trúc phân cấp: Các truy vấn trong GraphQL giống với cấu trúc dữ liệu được yêu cầu. Khách hàng có thể duyệt qua các mối quan hệ lồng nhau để truy xuất dữ liệu liên quan trong một câu truy vấn duy nhất. d) Schema: GraphQL sử dụng schema để xác định loại, trường dữ liệu và mối quan hệ giữa dữ liệu. Schema này đóng vai trò như một cầu nối giữa client và server, cung cấp kiểu định nghĩa dữ liệu rõ ràng. e) Thay đổi dữ liễu: Ngoài việc truy vấn dữ liệu, GraphQL còn hỗ trợ các yêu cầu thay đổi dữ liệu, cho phép client sửa đổi dữ liệu trên server bằng cách xác định các thao tác và dữ liệu để thao tác. f) Công cụ đa dạng: GraphQL có một hệ sinh thái gồm các công cụ, thư viện và framework (ví dụ: Apollo Client, Relay) tạo điều kiện thuận lợi cho việc triển khai nó bằng nhiều ngôn ngữ và framework khác nhau. GraphQL thường được sử dụng khi:. a) Cần có khả năng truy xuất dữ liệu linh hoạt, đặc biệt là trong các cấu trúc dữ liệu phức tạp. b) Client có băng thông hạn chế yêu cầu truy vấn dữ liệu hiệu quả. c) Nhiều clients có yêu cầu truy vấn dữ liệu khác nhau sử dụng cùng một API endpoint. Nếu trạng thái của Model thay đổi (do dữ liệu người dùng hoặc các yếu tố khác), nó thông báo cho các View đã đăng ký. Thông báo này thông báo cho View rằng chúng cần cập nhật bản thể để phản ánh những thay đổi trong dữ liệu. e) View Truy Xuất Dữ Liệu từ Model:. View, sau khi nhận thông báo, truy xuất dữ liệu đã được cập nhật từ Model. View cập nhật bản thể của mình để phản ánh những thay đổi trong dữ liệu. Trong một số trường hợp, Controller có thể trực tiếp cập nhật View để phản ánh những thay đổi trong Model mà không đợi thông báo. Ví dụ: một người dùng cuối gửi một yêu cầu đến một máy chủ để nhận danh sách sinh viên đang học trong một lớp. Sau đó, máy chủ sẽ gửi yêu cầu đó đến Controller cụ. thể quản lý sinh viên. Controller đó sau đó sẽ yêu cầu Model quản lý sinh viên trả về một danh sách của tất cả sinh viên đang học trong một lớp. Mô phỏng luồng hoạt động của MVC. Model sẽ truy vấn cơ sở dữ liệu để lấy danh sách tất cả sinh viên và sau đó trả lại danh sách đó cho Controller. Nếu phản hồi từ Model thành công, Controller sẽ yêu cầu View liên quan đến sinh viên trả lại một bản trình bày về danh sách sinh viên. View này sẽ lấy danh sách sinh viên từ Controller và hiển thị danh sách thành HTML có thể được sử dụng bởi trình duyệt. Controller sau đó sẽ lấy bản trình bày đó và trả lại cho người dùng, kết thúc yêu cầu. Nếu trước đó Model trả về một lỗi, Controller sẽ xử lý lỗi đó bằng cách yêu cầu View xử lý lỗi tạo một bản trình bày cho lỗi cụ thể đó. Bản trình bày lỗi đó sau đó sẽ được trả lại cho người dùng thay vì bản trình bày danh sách sinh viên. Như chúng ta có thể thấy từ ví dụ trên, Model xử lý tất cả dữ liệu. View xử lý tất cả bản trình bày và Controller chỉ thông báo cho Model và View về những gì cần làm. Đây là kiến trúc cơ bản và cách làm việc của framework MVC. Lợi ích của việc sử dụng mô hình MVC. b) Các thành phần của mô hình MVC có thể được kiểm thử một cách độc lập. c) Các thành phần của MVC có thể được phát triển đồng thời. d) Nó giảm độ phức tạp bằng cách chia ứng dụng thành ba đơn vị: Model-View- Controller. e) Hỗ trợ Test Driven Development (TDD). f) Hoạt động tốt cho ứng dụng web được hỗ trợ bởi đội ngũ lớn nhà thiết kế và nhà phát triển web. g) Kiến trúc này giúp kiểm thử các thành phần độc lập vì tất cả các lớp và đối tượng đều độc lập với nhau. h) Thân thiện với Search Engine Optimization (SEO). Các ngôn ngữ và framework sử dụng mô hình MVC a) Ruby on Rails.
Mô hình này không chỉ cải thiện khả năng bảo trì, khả năng mở rộng và khả năng kiểm thử, mà còn khuyến khích giao tiếp trong suốt giữa các lớp khác nhau của ứng dụng. Mô hình MVVM đặc biệt hữu ích cho những nhà phát triển đang tìm kiếm một cách tiếp cận có cấu trúc và linh hoạt đối với phát triển phần mềm, giúp tối ưu hóa các phiên bản linh hoạt, sự mở rộng dễ dàng và sự hợp tác hiệu quả giữa các khía cạnh khác nhau của ứng dụng.
Giao tiếp được hỗ trợ bởi một trình điều phối yêu cầu đối tượng(object request broker), đôi khi được gọi là "software bus" vì nó cung cấp một mặt bằng giao tiếp duy nhất mà tất cả các thành phần đều sử dụng. Sự tập trung vào khả năng tái sử dụng và cô lập của các thành phần trong CBA đóng góp vào quy trình phát triển hiệu quả hơn, giảm thời gian đưa sản phẩm ra thị trường và khả năng thích ứng và mở rộng ứng dụng theo yêu cầu thay đổi.
Chúng có thể đến từ các nơi khác như mã khởi tạo (init code), nơi dữ liệu có thể được lấy từ một Web API và hành động được kích hoạt để cập nhật các view. Hành động cũng có thể đến từ một bộ đếm thời gian yêu cầu cập nhật màn hình. Hoạt động của kiến trúc Flux. Luồng dữ liệu trong Flux tuân theo một con đường một chiều:. a) Người dùng tương tác với view, kích hoạt một hành động. b) Hành động được phân phối bởi Dispatcher. c) Các stores nhận hành động và cập nhật trạng thái của mình. d) Các views được thông báo về các thay đổi trạng thái trong stores và cập nhật giao diện tương ứng. Bằng cách buộc một luồng dữ liệu theo chiều một hướng và cung cấp một dispatcher tập trung để quản lý hành động, Flux nâng cao tính dự đoán, khả năng bảo trì và khả năng gỡ lỗi của ứng dụng, tạo nên một phương pháp quan trọng để xây dựng các ứng dụng web có quy mô lớn và có tổ chức tốt.
Mặc dù độ khó ban đầu của nó có thể cao đối với người mới học, nhưng những lợi ích về khả năng bảo trì, khả năng debug và một mô hình quản lý trạng thái nhất quán làm cho Redux trở thành lựa chọn ưa thích cho nhiều nhà phát triển làm việc trên các ứng dụng có quy mô lớn và phức tạp. Giao diện người dùng (UI) và nội dung trong ứng dụng di động được tối ưu hóa cho một nền tảng cụ thể bằng cách sử dụng các thành phần giao diện người dùng native (native UI components) do hệ điều hành cung cấp (ví dụ: UIKit cho iOS, Android UI cho Android). React Components là đơn vị xây dựng giao diện người dùng cơ bản của React. Một ứng dụng React được tạo nên bởi nhiều React Components, mỗi component bao. hàm một tính năng cụ thể hoặc một đối tượng có thể tái sử dụng trong tương tác người dùng. Một component có những thuộc tính chính:. a) Props: được sử dụng để truyền dữ liệu có từ component cha đến component con. Props không thể thay đổi, cho component khả năng tùy chỉnh và tái sử dụng. b) State: State là thuộc tính chỉ trạng thái của React Component.
Quy trình render Widget của Flutter. Giao diện người dùng trong Flutter được biểu diễn dưới dạng cây Widget, trong đó mỗi Widget đóng gói một phần của cấu trúc UI. Các Widget được sắp xếp theo cấu trúc cây, với một Widget gốc duy nhất ở đầu. Mỗi Widget có thể có các Widget con, tạo thành một cấu trúc phân cấp. Khi Flutter cần hiển thị một Widget, nó tạo ra một element cho mỗi Widget trong cây Widget. Những elements này là một phần của cây element và chúng đóng vai trò là biểu diễn trung gian của cây Widget. Cây element sau đó được sử dụng để tạo ra cây render. Mỗi element trong cây element tương ứng với một đối tượng render trong cây render. Các đối tượng render là biểu diễn cấp thấp hơn mô tả cách UI nên được vẽ và được xếp đặt. Trong quá trình xếp đặt, Flutter tính toán kích thước và vị trí của mỗi đối tượng render trong cây render. Trong giai đoạn vẽ, framework vẽ các thành phần UI lên màn hình bằng cách sử dụng động cơ đồ họa Skia. Quá trình xếp đặt và vẽ này là hiệu quả và sử dụng tăng tốc phần cứng để cải thiện hiệu suất. f) Cách tương tác khó hiểu. g) Thông báo lỗi mơ hồ. Do đó, đòi hỏi các thư viện front-end của cung cấp nhà phát triển những công cụ.
Các thư viện như React-Responsive có thể được sử dụng để xử lý tính năng đáp ứng một cách hiệu quả hơn.
Các gói này bao gồm nhiều trường hợp sử dụng và giúp giải quyết các thách thức cụ thể với giao diện người dùng.
Yup được sử dụng để định nghĩa các schema kiểm tra, và Formik được sử dụng để quản lý trạng thái form và xử lý việc submit form. React Hook Form là một thư viện React được thiết kế để quản lý và xử lý các form trong ứng dụng React bằng cách sử dụng React hooks.
Bạn có thể sử dụng TextEditingController với các form và kiểm tra input một cách thủ công. Ví dụ, gói flutter_form_bloc hoặc provider có thể được sử dụng để quản lý trạng thái form và kiểm tra.
Phiên bản 3.10 đánh dấu nhiều thay đổi, trong đó việc thay đổi engine của Flutter sang Impeller cho các ứng dụng xây dưng trên nền iOS, giúp giảm dung lượng bộ nhớ mà ứng dụng sử dụng từ đó giảm được thời gian tải trên CPU và GPU. Phiên bản này của Flutter còn áp dụng SLSA cấp 1 nhằm đảm bảo sự bảo mật trong chuỗi cung ứng gồm một số tính năng như bảo mật quá trình build, cho phép nhiều bên cùng tham gia để chấp thuận vào quá trình phát hành của Flutter app và các lần thực thi đều tạo ra một bản ghi để không ai có thể xen vào và đưa ra những thay đổi giữa mã nguồn và sản phẩm.
Engine cung cấp khả năng triển khai các API chính của Flutter, gồm các API về đồ hoạ (thông qua engine kết xuất hình ảnh Impeller đang được dùng trên iOS và đang được nghiên cứu áp dụng trên Adnroid, và Sika cho những nền tảng khác), đọc và ghi file, các thao tác trên tầng network, kiến trúc hỗ trợ cho các plugin, runtime cho ngôn ngữ Dart và công. cũ hỗ trợ biên dịch mã nguồn. Vì thiết kế của kiến trúc, để tầng framework có thể kết nối với engine, engine cung cấp dart:ui đóng gói những dòng mã C++ bên trong các lớp. Thư viện dart:ui cung cấp những lớp nguyên thuỷ nhất, trừu tượng và gần với mã nguồn nhất như nhập xuất, đồ hoạ và các hệ thống nhỏ hơn để xuất chữ viết. Thông thường, lập trình viên chỉ tương tác với Flutter framework cung cấp giao diện hiện đại và thân thiện với lập trình viên thông qua ngôn ngữ Dart. Framework bao gồm nhiều platform, thư viện thể hiện thông qua kiến trúc lớp:. a) Các lớp foundational, dịch vụ như animation, paiting và gestures cung cấp những các dùng trừu tượng đối với các lớp bên dưới. b) Lớp rendering cung cấp các phương thức trừu tượng để xử lý giao diện. Lập trình viên có thể thay đổi các object này (thông qua thay đổi trạng thái của object chẳng hạn) và cây object sẽ tự động cập nhật giao diện để ánh xạ thay đổi. c) Lớp Widget là một lớp gồm những thành phần trừu tượng, cụ thể hơn là mỗi object trong lớp rendering sẽ có một lớp (class) trong lớp (layer) Widgets.
Các nền tảng được hỗ trợ bởi Flutter dần được mở rộng, không chỉ tập trong vào việc xây dưng các ứng dụng gốc đa nền tảng, Flutter còn hỗ trợ xây dựng ứng dụng web và cả game, đồng thời là những nền tảng khác đang được nghiên cứu. Với định hướng phát triển như hiện tại, Flutter đang đóng một vai trò thiết thực trong quá trình phát triển của những công nghệ mới nổi như AR, VR, IoT, những ứng dụng.
Bên cạnh đó còn là những khái niệm nâng cao của ngôn ngữ Dart như Higher-Order Functions, dữ liệu toàn vẹn không bị thay đổi, lambdas, closure, các kiểu dữ liệu nâng cao như Collections (stack, queue,..).. i) Cuối cùng trong quá trình phát triển là phát hành ứng dụng, cần biết được cách từ mã nguồn, xử dựng các câu lệnh để phát hành ra ứng dụng dành cho các hệ điều hành khác nhau.
Khi ứng dụng trở nên lớn, các Widget lồng nhau thì chúng ta nên cân nhắc sử dụng các state management ví dụ như StreamProvider để chia sẻ trạng thái giữa các Widget với nhau, tránh việc phải truyền các trạng thái xuống Widget con thông qua hàm khởi tạo thông qua quá nhiều Widget trung gian khiến cho mã nguồn ứng dụng trở nên xấu và khó bảo trì, dò tìm và sửa lỗi. Trong trường hợp chúng ta chỉ xét 1 vế của điều kiện (đúng hoặc sai), việc sử dụng if thay vì condition expression (toán tử điều kiện 3 ngôi) giúp tiết kiệm chi phí xây dựng Widget khi chúng ta không cần phải build một Widget giả thế cho vị trí của Widget chưa đạt điều kiện hiển thị. Toán tử ?? là một cách việc ngắn gọn của câu lệnh điều kiện kiểm tra xem một biến có giá trị null hay không. giúp cho Dart biết rằng giá trị của biến có thể là giá trị null, tránh gây ra các lỗi trong quá trình chạy ứng dụng khiến ứng dụng phải thoát đột ngột, ảnh hưởng người dùng. Nếu cần điều chỉnh hiệu suất của ứng dụng hoặc nếu giao diện người dùng không mượt mà như mong đợi, chúng ta có thể sử dụng DevTools Performance view có thể. giúp ích để biết được đâu là nguyên ngân chính. Ngoài ra, plugin Flutter cho IDE có thể hữu ích. Trong cửa sổ Flutter Performance, bật lựa chọn “Show Widget rebuild information”. Tính năng này giúp bạn phát hiện khi khung hình được hiển thị và hiển thị trong hơn 16 mili giây. Nếu có thể, plugin sẽ cung cấp liên kết đến mẹo có liên quan. Ngoài ra, các hành vi sau đây có thể tác động tiêu cực đến hiệu suất ứng dụng:. a) Tránh sử dụng Widget Opacity và đặc biệt tránh sử dụng Widget này trong hiệu ứng đọng. Thay vào đó hãy sử dụng AnimatedOpacity hoặc FadeInImage. Opacity Widget sẽ khiến cho Widget và cả những Widget con build lại từng frame giao diện. b) Khi sử dụng AnimatedBuilder, hãy tránh đặt cây con (Widget con) vào hàm xây dựng để xây dựng các tiện ích không phụ thuộc vào hoạt ảnh vì cây con này được xây dựng lại cho mỗi frame của hoạt ảnh. Thay vào đó, hãy chuyển cây con vào AnimatedBuilder thông qua tham số childs. Lúc này cây con sẽ được build một lần duy nhất, rồi được đưa vào trong hoạt ảnh. c) Tránh việc cắt bớt (clip) trong hoạt ảnh. Nếu có thể, hãy cắt trước hình ảnh trước khi tạo hiệu ứng động cho nó. d) Tránh sử dụng các Widget tạo danh sách các Widget con cụ thể (chẳng hạn như Column() hoặc ListView()) nếu hầu hết các con không hiển thị trên màn hình để tránh chi phí xây dựng. e) Tránh ghi đè toán tử == trên các đối tượng Widget.
Với những ứng dụng có chức năng phụ thuốc đến những API cụ thể mà chỉ có một số hệ điều hành có, Embeder của Flutter chưa hỗ trợ đến những API này, điều này khiến cho các tính năng này của ứng dụng không thể hiện thực hoá được. Flutter cho web bị hạn chế về mặt SEO khi chưa hỗ trợ cho SSR, bên cạnh đó web application được phát triển bằng Flutter sẽ khiến cho ứng dụng có kích thước lớn hơn thông thường vì phải bao gồm cả Flutter engine.
Dù cho Flutter đã hỗ trợ việc áp dụng AR vào ứng dụng, tuỳ nhiên khả năng hỗ trợ cũng như hệ sinh thái plugin dành cho AR vẫn còn hạn chế, chưa thật sự đầy đủ để phục vụ cho những yêu cầu của ứng dụng. Với việc sử dụng Flutter, Tencent Cloud giúp tăng doanh thu lên tới 34%, giảm thời gian phát triển và triển khai dịch vụ nhanh hơn trước.
Ứng dụng được hoàn thành rất nhanh chóng, trong vòng 3 tháng phiên bản beta đã được ra mắt và vài tháng sau ứng dụng đã được ra mặt với người dùng với nhiều phản hồi tích cực về giao diện đẹp, trải nghiệm mượt mà. Bên cạnh đó, các thành viên trong nhóm phát triển cũng phản hồi tích cực với Flutter khi đã giúp cho nhóm tăng tốc độ phát triển gần như gấp 2 lần chỉ với một bộ mã nguồn duy nhất.
Kiến trúc của React Native bao gồm 2 luồng (Thread) chạy bằng JavaScript:. Mô tả kiến trúc 2 luồng của React Native. a) Main Thread : Sử dụng để chạy ứng dụng trên nền tảng native. b) JavaScript Thread : Sử dụng để chạy các logic doanh nghiệp của ứng dụng. c) Bridge : 2 threads này chạy song song và độc lập với nhau, nhưng đôi khi chúng cần phải tương tác. Khác với React, khi ứng dụng web bị đóng gói thành ứng dụng di động, React Native có khả năng giao tiếp với nền tảng native và hiển thị các thành phần native của nền tảng đó.
React Native cho phép nhà phát triển sử dụng các module native viết bằng Java, Swift, hoặc Objective-C để thực hiện các chức năng không được bao gồm trong các thành phần cốt lõi. Mặc dù React Native có thể đạt được hiệu suất tốt, đặc biệt là với việc sử dụng các module native và các tối ưu hóa, cầu nối JavaScript có thể tạo ra những trục trặc hiệu suất đôi khi trong các hoạt ảnh phức tạp.
Hiệu suất của nhà phát triển trên Flutter và React Native phụ thuộc vào các yếu tố như kinh nghiệm của nhà phát triển, sự quen thuộc với ngôn ngữ và framework, và yêu cầu của dự án. Cả hai công cụ đều cung cấp các tính năng như Hot Reload để tăng tốc độ phát triển, và sự lựa chọn giữa chúng thường phụ thuộc vào kĩ năng cá nhân và đặc điểm cụ thể của từng dự án.
Những sự kiện hàng năm dành cho các nhà phát triển React Native cung cấp cơ hội cho việc gặp gỡ, học hỏi và cập nhật về những phát triển mới nhất. React Native là một dự án mã nguồn mở, và nhà phát triển được khuyến khích đóng góp vào sự phát triển của nó. Kho GitHub cho phép nhà phát triển báo cáo vấn đề, gửi yêu cầu pull và tham gia vào các cuộc thảo luận. Hỗ trợ Testing. d) End-to-End Testing: Đối với kiểm thử end-to-end trong React Native, các công cụ. Kiểm thử Widget trong Flutter tập trung vào việc kiểm thử các thành phần giao diện người dùng một cách độc lập, trong khi kiểm thử snapshot của React Native ghi lại đầu ra được hiển thị của một thành phần để so sánh.
Nhờ sự trợ giúp của Flutter mà việc phát triển ứng dụng đa nền tảng dựa trên một bộ mã nguồn duy nhất giờ đây đã trở nên dễ dàng hơn trong khi vẫn đảm bảo được hiệu năng của ứng dụng cũng như khả năng tích hợp với các dịch vụ bên thứ 3 cho mục đích lưu trữ, AI,…. Tuy vậy, đây không phải là một việc gì đó quá khó khăn khi mà Dart được tạo cảm hứng từ nhiều ngôn ngữ phổ biến hiện nay như C#, Javascript,… đồng thời là kiến trúc được ứng dụng rộng rãi trong thực tế như kiến trúc component-based của React.
Việc xây dựng và bảo trì nhiều bộ mã nguồn khác nhau là một vấn đề khá lớn với nhiều nhóm phát triển phần mềm khi tiêu tốn nhân lực, tiền bạc và thời gian rất lớn. Tính đến hiện tại, đã có nhiều giải pháp đa nền tảng được giới thiệu để giải quyết vấn đề trên, điển hình như framework Flutter được phát triển bời Google.
Kích hoạt (trigger) Ngưởi dùng nhấn vào nút ‘Sign in with Google’. Tiền điều kiện Người dùng đã tạo tài khoản thành công với Google. Hậu điều kiện Tài khoản Google của người dùng. được liên kết với hệ thống. Luồng sự kiện cơ bản. a) Người dùng truy cập vào ứng dụng. b) Người nhấn vào nút ‘Sign in with Google’. c) Người dùng được chuyển đến trang d) đăng nhập với Google. e) Google trả về tài khoản đã đăng nhập thành công. f) Hệ thống ghi nhận thông tin tài khoản Google của người dùng và đăng nhập người dùng. g) Người dùng được chuyển đến trang chính của ứng dụng. Luồng sự kiện phụ. a) Người dùng truy cập vào ứng dụng. b) Người nhấn vào nút ‘Sign in with Google’. c) Người dùng được chuyển đến trang đăng nhập với Google. d) Google trả về tài khoản đã đăng nhập thất bại. e) Người dùng được chuyển về trang đăng nhập của ứng dụng. Luồng sự kiện ngoại lệ. a) Nếu hệ thông gặp lỗi trong quá trình xử lí logic ở tầng Frontend, thông báo lỗi cho người dùng. b) Nếu hệ thống gặp lỗi trong quá trình lấy dữ liệu từ Firebase, thông báo cho người dùng thông qua snackbar. Kích hoạt (trigger). a) Người dùng mở ứng dụng. b) Nhấn vào nút đầu tiên ở thanh điều hướng ở cạnh dưới màn hình. Tiền điều kiện Người dùng đã đăng nhập thành công và. có thông tin cá nhân trên mạng xã hội. Hậu điều kiện Người dùng nhìn thấy danh sách các bài. đăng có trên mạng xã hội. Luồng sự kiện cơ bản. a) Người dùng truy cập vào ứng dụng. b) Tầng Frontend đưa người dùng đến trang chủ. c) Tầng Frontend tải dữ liệu bài đăng từ. cơ sở dữ liệu Firebase và hiển thị lên màn hình. d) Với từng bài đăng, tầng Frontend tải dữ liệu về người dùng là chủ sở hữu của bài đăng và hiện thị lên phía trên của nội dung bài đăng. Đồng thời tải dữ liệu về. số lượng bình luận và hiện thị ở phía dưới nội dung bài đăng. Luồng sự kiện phụ. a) Người dùng nhấn vào nút đầu tiên ở. thanh điều hướng ở cạnh dưới màn hình. b) Thực hiện luồng sự kiện cơ bản từ. Luồng sự kiện ngoại lệ. a) Nếu hệ thông gặp lỗi trong quá trình xử lí logic ở tầng Frontend, thông báo lỗi cho người dùng. b) Nếu hệ thống gặp lỗi trong quá trình lấy dữ liệu từ Firebase, thông báo cho người dùng thông qua snackbar.
5 Menu mở rộng để chọn ảnh đính kèm cho bài đăng gồm các lựa chọn từ trên xuống dưới: chụp ảnh, chọn ảnh từ thư viện và huỷ.
[2] Mike ShannonMike is the creator of Go With Code and a coder at heart ?, “21 most popular programming languages in the world (and where to learn them),” //Go With Code/, https://gowithcode.com/top-programming-languages (accessed Nov. Alemayehu, “Demystifying ‘final’ and ‘const’ in flutter and Dart:,” Medium, https://medium.com/@yetesfadev/demystifying-final-and-const-in-flutter-and-dart- 4d6dbc4cbbb8#:~:text=%2D%20Code%20Optimization%3A%20Using%20%E2%80.