Flutter Riverpod Example | State Management

Flutter Riverpod Example | State Management

We will use four simple steps to create a Riverpod state management counter app

Wrap your app using ProviderScope

Create a provider using StateProvider

Extend ConsumerWidget for a class

Read and edit the value of StateProvider ref.read()

 

Wrap your app using ProviderScope

To work with Flutter Riverpod, go ahead and install it.

dependencies:
  riverpod: ^1.0.3

Let's start with a new project. You can name it anything. In the main.dart file, replace the main() function using the code below

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
void main() {
  runApp(ProviderScope(
    child: MyApp(),
  ));
}

See how we inject ProviderScope() inside the main() function and we put MyApp() as a child of it.

Now look at MyApp() class. It doesn't change a lot. It looks like below

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(

        primarySwatch: Colors.blue,
      ),
      home:  MyHomePage(),
    );
  }
}

 

Create a provider using StateProvider

Now we need to create a Provider, because we want to return a value in this counter app and make it reactive. So instead of using pure Provider we will StateProvider

final counterStateProvider = StateProvider<int>((ref) {
  return 0;
});

So whatever StateProvider returns would be reactive. For now, It will return an integer value and it would be reactive. So counterStateProvider is our provider.

Put the above code before MyApp().

Extend ConsumerWidget for a class

Now let's take a look at our MyHomePage class. 

class MyHomePage extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    // 1. watch the counterStateProvider
    final counter = ref.watch(counterStateProvider);
    return Scaffold(
      body: Center(
        child:  Text(
              'Value: $counter',
              style: Theme.of(context).textTheme.headline4,
            )
      ),
    );
  }
}

This class extends ConsumerWidget. Because this class extends ConsumerWidget, we can access the value of StateProvider inside any widget of this class.

So if a class extends ConsumerWidget, you would be able to access the StateProvider value inside this class. At the same time the value, we wanna listen for change we need to wrap that using ref.watch().

 

Read and edit the value using ref.read()

Ok now it's time to create a floating action button

Put the code below body section of Scaffold

floatingActionButton: FloatingActionButton(
        // access the provider via ref.read(), then increment its state.
        onPressed: () => ref.read(counterStateProvider.state).state++,
        child: Icon(Icons.add),
      )

See inside the floating action button, we are using ref.read() to read the value and change it at the same time as we click the button.

ref.watch() is used for watching or observing a value from a provider

ref.read() also does the same thing, but it's used inside a callback function more.

Recent posts