async_var 1.1.1 copy "async_var: ^1.1.1" to clipboard
async_var: ^1.1.1 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
160
points
26
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

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

async, flutter

More

Packages that depend on async_var