From 18c3596af2531d4c6366840e0985d6dc3e470867 Mon Sep 17 00:00:00 2001 From: Adrien Bonnin <adbonnin@ippon.fr> Date: Tue, 13 Sep 2022 12:02:23 +0200 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Ajout=20des=20examples=20pour=20la?= =?UTF-8?q?=20pr=C3=A9sentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main.dart | 7 +++ .../smaller_stateful_example.dart | 55 +++++++++++++++++++ test/presentation/listener_test.dart | 27 +++++++++ 3 files changed, 89 insertions(+) create mode 100644 lib/presentation/smaller_stateful_example.dart create mode 100644 test/presentation/listener_test.dart diff --git a/lib/main.dart b/lib/main.dart index d4a19fe..9445485 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:article_flutter_riverpod/article_02/consumer_example.dart'; import 'package:article_flutter_riverpod/article_02/parent_example.dart'; import 'package:article_flutter_riverpod/article_02/stateful_example.dart'; import 'package:article_flutter_riverpod/article_02/stateless_example.dart'; +import 'package:article_flutter_riverpod/presentation/smaller_stateful_example.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; @@ -25,6 +26,12 @@ final examples = [ path: 'stateful', builder: (_) => const StatefulExample(), ), + Example( + title: 'Stateful (smaller)', + icon: Icons.add_circle_outline, + path: 'smaller-stateful', + builder: (_) => const SmallerStatefulExample(), + ), Example( title: 'Parent ProviderScope', icon: Icons.child_care, diff --git a/lib/presentation/smaller_stateful_example.dart b/lib/presentation/smaller_stateful_example.dart new file mode 100644 index 0000000..a6d4217 --- /dev/null +++ b/lib/presentation/smaller_stateful_example.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +final countServiceProvider = StateNotifierProvider<CountService, int>((ref) => CountService(42)); // <1> + +class CountService extends StateNotifier<int> { + CountService(int firstValue) : super(firstValue); + + void increment() { + state++; + } +} + +class SmallerStatefulExample extends StatelessWidget { + const SmallerStatefulExample({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const ProviderScope( + child: Counter(), + ); + } +} + +class Counter extends ConsumerStatefulWidget { // <2> + const Counter({Key? key}) : super(key: key); + + @override + ConsumerState<Counter> createState() => _CounterState(); // <3> +} + +class _CounterState extends ConsumerState<Counter> { // <4> + late int firstValue; + + @override + void initState() { + super.initState(); + firstValue = ref.read(countServiceProvider); // <5> + } + + @override + Widget build(BuildContext context) { // <6> + final currentValue = ref.watch(countServiceProvider); // <7> + + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ElevatedButton( // <8> + onPressed: () => ref.read(countServiceProvider.notifier).increment(), // <9> + child: Text("Increment $firstValue -> $currentValue"), + ), + ], + ); + } +} diff --git a/test/presentation/listener_test.dart b/test/presentation/listener_test.dart new file mode 100644 index 0000000..8caefbb --- /dev/null +++ b/test/presentation/listener_test.dart @@ -0,0 +1,27 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../utils.dart'; + +final intProvider = StateProvider<int>((_) => 13); // <1> + +void main() { + test('doit écouter un état', () { + const defaultValue = -1; + + // given: + final container = createContainer(); + + var intValue = defaultValue; // <2> + container.listen<int>(intProvider, (_, next) => intValue = next); + + // expect: + expect(intValue, equals(defaultValue)); // <3> + + // when: + container.read(intProvider.notifier).state = 42; // <4> + + // then: + expect(intValue, equals(42)); // <5> + }); +} -- GitLab