async_var 1.1.0 copy "async_var: ^1.1.0" to clipboard
async_var: ^1.1.0 copied to clipboard

Async Data, Loading notifier, Error all in one variable, reducing boilerplate code and making your code more concise

example/example.md

Example Usage #

class EventListViewModel extends ChangeNotifier {
  final NetworkServiceProtocol service;

  late final AsyncVar<List<EventGet>> _hostedEvents;
  List<EventGet> get hostedEvents => _hostedEvents;
  Future<void> getEvents() => _hostedEvents.executeTask(() => service.getHostedEvents());

  late final AsyncVar _createEvents;
  AsyncVar get createEvents => _createEvents;
  Future<void> createEvents(String name) => _createEvents.executeTask(() => service.postCreateEvent(name));
  
  EventListViewModel(this.service) {
    _hostedEvents = AsyncVar<List<EventGet>>(parentNotifier: this);
    getEvents();
  }
}

/// If you want to display error on screen, you can use .error on a if else like in `(viewModel.hostedEvents.error != null)`
/// If you want to display error on a Snackbar, you can use the string returned back from executeTask() like in `final error = await viewModel.createEvents("New Event");`

class EventListView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final viewModel = context.watch<EventListViewModel>();

    return Scaffold(
      appBar: AppBar(title: Text('Hosted Events')),
      body: Column(
        children: [
          Expanded(
            child: viewModel.hostedEvents.loading
                ? Center(child: CircularProgressIndicator())
                : (viewModel.hostedEvents.error != null)
                ? const Text(viewModel.hostedEvents.error)
                : ListView.builder(
                    itemCount: viewModel.hostedEvents.data.length,
                    itemBuilder: (context, index) {
                      final event = viewModel.hostedEvents.data[index];
                      return ListTile(title: Text(event.name));
                    },
                  ),
          ),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: viewModel.createEvents.loading
                ? Center(child: CircularProgressIndicator())
                :  ElevatedButton(
                    onPressed: () async {
                      final error = await viewModel.createEvents("New Event");
                      if (error != null && context.mounted) {
                        ScaffoldMessenger.of(context).showSnackBar(
                          SnackBar(content: Text(error)),
                        );
                      } else {
                        viewModel.getEvents();
                      }
                    },
                    child: Text('Create Event'),
                  ),
          ),
        ],
      ),
    );
  }
}
void main() {
  runApp(
    ChangeNotifierProvider(
      create: (_) => EventListViewModel(NetworkService()),
      child: MaterialApp(home: EventListView()),
    ),
  );
}
1
likes
0
points
289
downloads

Publisher

verified publisherflexxxlab.com

Weekly Downloads

Async Data, Loading notifier, Error all in one variable, reducing boilerplate code and making your code more concise

Homepage
Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

flutter

More

Packages that depend on async_var