import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; typedef LoadingWidgetBuilder = Widget Function( BuildContext context, WidgetRef ref, ); typedef ValueWidgetBuilder = Widget Function( BuildContext context, WidgetRef ref, T value, ); class AsyncValueWidget extends ConsumerWidget { final AsyncValue asyncValue; final ValueWidgetBuilder valueBuilder; final LoadingWidgetBuilder? loadingBuilder; final bool standaloneHolders; const AsyncValueWidget( this.asyncValue, { required this.valueBuilder, this.standaloneHolders = false, this.loadingBuilder, super.key, }); @override Widget build(BuildContext context, WidgetRef ref) { return switch (asyncValue) { AsyncError(:final error) => !standaloneHolders ? Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [Text('Error getting data: $error')], ), ) : Text('Error getting data: $error'), AsyncData(:final value) => valueBuilder(context, ref, value), _ => loadingBuilder != null ? loadingBuilder!(context, ref) : !standaloneHolders ? const Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ CircularProgressIndicator(), ], ), ) : const CircularProgressIndicator(), }; } }