我很困惑嵌套的 ProviderScope和所有Providers會從記憶體中洗掉嗎?遵循用例是好的做法還是壞的做法?
我有idsProvider
final idsProvider = Provider((_) => List.generate(50, (i) => i));
并為idsProvider的每個 id 設定itemIdProvider
final itemIdProvider = Provider.autoDispose((_) => 0);
界面如下:
class BuildListView extends ConsumerWidget {
const BuildListView({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final ids = ref.watch(idsProvider);
return ListView.builder(
itemCount: ids.length,
itemBuilder: (context, index) {
return ProviderScope(
overrides: [
itemIdProvider.overrideWithValue(ids[index]),
],
child: const BuildItem(),
);
},
);
}
}
class BuildItem extends ConsumerWidget {
const BuildItem({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final itemState = ref.watch(itemProvider);
return itemState.when(
data: (id, data) => ListTile(
title: Text("ID: $id"),
subtitle: Text(data),
),
loading: () => const CircularProgressIndicator(),
error: (error) => Text(error.toString()),
);
}
}
然后我有stateNotifierProvider來操作 ListView 的每個專案的狀態:
final itemProvider = StateNotifierProvider.autoDispose<ItemNotifier, ItemState>(
(ref) => ItemNotifier(ref.watch(itemIdProvider)),
dependencies: [itemIdProvider],
);
class ItemNotifier extends StateNotifier<ItemState> {
ItemNotifier(this.id) : super(const ItemState.loading()) {
fetchData();
}
final int id;
Future<void> fetchData() async {
await Future.delayed(const Duration(seconds: 2));
if (mounted) {
state = ItemState.data(id: id, data: "Data for $id");
}
}
// A lot of methods to change the state
// ...
// ...
}
@freezed
class ItemState with _$ItemState {
const factory ItemState.data({required int id, required String data}) = Data;
const factory ItemState.loading() = Loading;
const factory ItemState.error([String? message]) = Error;
}
uj5u.com熱心網友回復:
我認為這是完全可以接受的。此外,您可能沒有初始值:
final itemIdProvider = Provider.autoDispose((_) => throw UnimplementedError());
這樣可以看出該值將在稍后實作。
關于記憶。ProviderScope
是一個StatefulWidget
并且在“引擎蓋”下具有以下代碼行:
@override
void dispose() {
container.dispose();
super.dispose();
}
所以你不必太擔心:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/517734.html
標籤:扑镖内存泄漏河荚颤动河荚