Bài đăng

Đang hiển thị bài đăng từ tháng 10 11, 2021

Flutter 7.1 - Navigating to a new page, GridView, Pass data by routes, Pop data

Hình ảnh
 1, Grid view: @override Widget build (BuildContext context) { return Scaffold ( appBar: AppBar ( title: const Text ( 'DeliMeal' ) , ) , body: GridView ( // cross ngang, main d ọ c. N ế u có quá nhi ề u item thì dùng GridView.buider s ẽ t ố i ư u performance h ơ n children: DUMMY_CATEGORIES .map((catData) => CategoriesItem ( catData. title , catData. color , )) .toList() , padding: const EdgeInsets . all ( 20 ) , gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent ( // xác đ ị nh chi ề u r ộ ng t ố i đa c ủ a gridview maxCrossAxisExtent: 200 , // chi ề u r ộ ng t ố i đa c ủ a 1 item childAspectRatio: 3 / 2 , // t ỉ l ệ 2 c ạ nh item crossAxisSpacing: 20 , // kho ả ng cách gi ữ a các item theo chi ề u ngang mainAxisSpacing: 20 , // kho ả ng cách gi ữ a các item theo chi ề u d ọ c ) , ) , ) ; } 2, Navigating to ...

Flutter 6.3 - Constructor key ?

Hình ảnh
Constructor key: const TransactionItem({ Key? key , required this . transaction , required this . deleteTx , }) : super (key: key) ; Mọi StatefulWidget trong flutter đều cần có key, Stateless có thể k cần. Trong một số trường hợp, key luôn phải có. Ví dụ: Nếu k có key, khi xóa 1 item trong list view, Widget tree sẽ hiểu là đã xóa 1 item, nhưng element tree thì ko, nó sẽ so sánh các item cùng hạng tree, sau đó đẩy item ở vị trí số 2 lên đầu => set value của item 2 trong widget tree cho item đầu trong element tree (ko set lại màu mè,...). Sau khi set lại value widget tree sang element tree thì element tree sẽ xóa các item, state thừa của nó => xóa sai item. Khi có key, flutter sẽ dựa vào key để xóa, update,.. item trong element tree => xóa đúng item. Ví dụ: const TransactionItem({ Key? key , required this . transaction , required this . deleteTx , }) : super (key: key) ; *Chỉ nên dùng key khi dùng ListView, StatefulWidget. Ko nên dùng nếu k cần vì nếu dùng khi k cần ...

Flutter 6.2 - Widget lifecycler, App lifecycler, Context ?

Hình ảnh
1, Widget Lifecycler Stateful Widgets:  initState() : chỉ chạy 1 lần đầu tiên, khi widget rebuild, initState() ko đc chạy lại. Dùng để gán dữ liệu ban đầu. setState() : dùng để update và rebuild widget  didUpateWidget() : khi widget đc rebuild xong. Dùng để update lại các value thay đổi. dispose() : khi widge gone. Dùng để clean data, close connection,... tránh leak memory. Khi UI thay đổi : ví dụ khi show/hide BottomSheet constructor của widget sẽ đc gọi lại để check sự thay đổi. Vì state ko thay đổi nên ko đc gọi lại. Sau khi call constructor widget thì sẽ đến hàm didUpdateWidget. 2, App lifecycler inactive : Ko hoạt động, user ko nhìn thấy app. App rơi vào trạng thái này khi chuẩn bị running in background (paused) và chuẩn bị quay trở lại hoạt động (resumed). paused : Khi app running in background. resumed : Khi app bắt đầu visible vào chuẩn bị ng dùng có thể thao tác tới app. suspending : Khi clear app in background. class _MyHomePageState extends State<MyHomePage> w...