thắc mắc Riverpod, Flutter - Parents của ListView không rebuild

  • Người tạo chủ đề Người tạo chủ đề cldson
  • Ngày bắt đầu Ngày bắt đầu

cldson

Junior Member
Chào mọi người, mình đang tự học Flutter, mình có case như sau:

Mình có một provider xử lý danh sách gas và một ListView. Mình xử lý vuốt qua item trên list thì sẽ Delete item đó -> hiện snackBar để undo, lúc làm nút undo trên SnackBar và xử lý bằng Riverpod thì mình không tìm được cách để setState như StatefulWidget để Parents của cái gas_list.dart rebuild lại. Mình đã research nhưng không thể thông được. Bên dưới là source code, rất mong được mọi người góp ý và hướng dẫn.

Xin cảm ơn.

JavaScript:
gas_provider.dart
class GasNotifier extends StateNotifier<List<Gas>>{
  GasNotifier() : super (gasTempList);

  void addGas(Gas gas){
    state = [...state, gas];
  }

  void removeGas(Gas gas){
    state = state.where((e) => e.maGas != gas.maGas).toList();
  }

  void insertGas(int index, Gas gas) {
    state.insert(index, gas);
  }
}

final gasListProvider = StateNotifierProvider<GasNotifier, List<Gas>>((ref) {
  return GasNotifier();
},);

gas_list.dart

class GasList extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final gasList = ref.watch(gasListProvider);
    return ListView.builder(
      itemCount: gasList.length,
      itemBuilder: (context, index) {
        final gas = gasList[index];
        return Dismissible(
          key: ValueKey(gas),
          onDismissed: (direction) {
            final removedGas = gasList[index];
            ref.read(gasListProvider.notifier).removeGas(index);

            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                content: Text('Deleted Successfully'),
                action: SnackBarAction(
                  label: 'Undo',
                  onPressed: () {
                    ref.read(gasListProvider.notifier).insertGas(index, removedGas);
                  },
                ),
              ),
            );
          },
        );
      },
    );
  }
}

Edit1: Lúc copy code format vẫn bình thường nhưng đăng lên lại bị mất format, mong mọi người thông cảm
Mod: bỏ vào thẻ code
Edit2: thank mod
Edit3: cảm ơn bạn Conghechua - gọi state thì sẽ rebuild lại cái gas_list.dart
 
Sửa lần cuối:
Chào mọi người, mình đang tự học Flutter, mình có case như sau:

Mình có một provider xử lý danh sách gas và một ListView. Mình xử lý vuốt qua item trên list thì sẽ Delete item đó -> hiện snackBar để undo, lúc làm nút undo trên SnackBar và xử lý bằng Riverpod thì mình không tìm được cách để setState như StatefulWidget để Parents của cái gas_list.dart rebuild lại. Mình đã research nhưng không thể thông được. Bên dưới là source code, rất mong được mọi người góp ý và hướng dẫn.

Xin cảm ơn.

JavaScript:
gas_provider.dart
class GasNotifier extends StateNotifier<List<Gas>>{
  GasNotifier() : super (gasTempList);

  void addGas(Gas gas){
    state = [...state, gas];
  }

  void removeGas(Gas gas){
    state = state.where((e) => e.maGas != gas.maGas).toList();
  }

  [B]void insertGas(int index, Gas gas) {
    state.insert(index, gas);
  }[/B]
}

final gasListProvider = StateNotifierProvider<GasNotifier, List<Gas>>((ref) {
  return GasNotifier();
},);

}
Ko rành Flutter và Riverpod lắm, nhưng t nghĩ vấn đề của b ở chỗ [B]insertGas[/B]
đa số các stateProvider kiểu này đều dùng dạng immutable data, nên mỗi khi edit, cần set lại state = 1 object mới giống như trong addGasremoveGas
 
Ko làm flutter, nhưng quả return very deep như này là bình thường hả mấy anh?
iPlS5ux.png
 
Sửa lần cuối:
Ko rành Flutter và Riverpod lắm, nhưng t nghĩ vấn đề của b ở chỗ [B]insertGas[/B]
đa số các stateProvider kiểu này đều dùng dạng immutable data, nên mỗi khi edit, cần set lại state = 1 object mới giống như trong addGasremoveGas
ừm để mình thử, thank bạn.
 

Thống kê chủ đề

Ngày tạo
cldson,
Người trả lời cuối
cldson,
Trả lời
6
Lượt xem
759
Quay lại
Lên đầu trang