Lundin
Lundin

Reputation: 311

Riverpod showing snackbar on Error and also last known list using statenotifier

I am using riverpod ^1.0.0. I have created a StateClass which extends Equatable. In my StateNotifier i set state depending on events and outcomes. One being an async http request which upon success sets

state=SalesOrderListSuccess(salesOrderListItems: _items);

Upon http client failure however i set state to:

state = SalesOrderListError(error: response.data);

This works, upon success it renders the list in below UI builder. And it also using ref.listen and shows the snackbar. However, because the state changes from SalesOrderListSuccess and i am using ref.watch it seems that it cant keep the former known list and UI. How can i show the snackbar above the last known SalesOrderListSuccess/UI without rendering an entire new Error Page that is empty of all the items i have already managed to render in the list ?

Basically i dont want the list to change, just show a snackbar above last known list before the http client error happend.

Here the current widget: (this requires the SalesOrderListSuccess state in order to show the list).

  @override
  Widget build(BuildContext context, WidgetRef ref) {    

    final todos = ref.watch(todoListProvider);
    final selectedtrack = ref.read(selectedProductIdProvider2.notifier);

    ref.listen(todoListProvider, (previous, count) {
      print(previous);
      print(count);
      switch (count.runtimeType) {
        case SalesOrderListError:
          ScaffoldMessenger.of(context).showSnackBar(
            const SnackBar(content: Text('Ohh no some error happend')),
          );
      }
    });

    return ListView.builder(
      shrinkWrap: true, // 1st add
      physics: ClampingScrollPhysics(),
      itemCount: (todos as SalesOrderListSuccess).salesOrderListItems.length,
      itemBuilder: (context, index) {
        final current=
            (todos as SalesOrderListSuccess).salesOrderListItems[index];
        return ListTile(
            title: Text('${current.title}'),
            onTap: () {
              selectedtrack.state = index;
              Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => DetailScreen(),
                ),
              );
            });
      },
    );

  }

Upvotes: 2

Views: 1379

Answers (1)

Fabrizio Tognetto
Fabrizio Tognetto

Reputation: 481

Hi have a look at riverpod_messages. I had your same problems and I have written a package for this

https://pub.dev/packages/riverpod_messages/versions/1.0.0

Let me know!

Upvotes: 0

Related Questions