Compare commits

...

6 Commits

Author SHA1 Message Date
8e58ae5503 The "dart fix --apply" command applied. 2024-07-20 12:53:59 +03:30
f6d218b18a Remove unnecessary imports.
Remove unnecessary if condition.
2024-07-19 23:57:23 +03:30
45f055cc5d Add a random widget.
Fix variable names about counter.
2024-07-19 23:50:11 +03:30
e9d74e2326 Add counter and notifier for a value. 2024-07-19 21:25:38 +03:30
36e5156660 Nothing just refresh Me added to a widget.
Invalidate getMyRandomProvider then create new MyRandom from getMyRandomProvider.

It is simple, it can work with a thread to update random values, and widgets rebuild when a new data is provided.
2024-07-18 12:41:40 +03:30
0676de8316 Add new ConsuemerWidget with same business of RandomWidget.
Add widget to homepage.

Two widgets shows same (random) data, and just one request recorded on API server. It's good.
2024-07-17 15:43:52 +03:30
8 changed files with 172 additions and 10 deletions

View File

@ -1,7 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:riverpod_flutter_tuts/widgets/notifier/counter_widget.dart';
import '../widgets/consumer/random.dart';
import '../widgets/notifier/random_widget.dart';
import '../widgets/simples/random.dart'; import '../widgets/simples/random.dart';
part 'gt.g.dart'; part 'gt.g.dart';
@ -40,7 +43,10 @@ class MyApp extends ConsumerWidget {
children: <Widget>[ children: <Widget>[
const Expanded(child: Text('1')), const Expanded(child: Text('1')),
Expanded(child: Text(value)), Expanded(child: Text(value)),
const Expanded(child: RandomWidget()) const Expanded(child: RandomWidget()),
const Expanded(child: Random2Widget()),
const Expanded(child: CounterWidget()),
const Expanded(child: Random3Widget()),
], ],
) )

View File

@ -14,7 +14,7 @@ part 'getRandomData.g.dart';
@riverpod @riverpod
Future<MyRandom> getMyRandom(GetMyRandomRef ref) async { Future<MyRandom> getMyRandom(GetMyRandomRef ref) async {
// Using package:http, we fetch a random activity from the Bored API. // Using package:http, we fetch a random activity from the Bored API.
var ur = Uri.http('192.168.160.207:3000', '/p/random'); var ur = Uri.http('127.0.0.1:3000', '/p/random');
final response = await http.get(ur); final response = await http.get(ur);
// Using dart:convert, we then decode the JSON payload into a Map data structure. // Using dart:convert, we then decode the JSON payload into a Map data structure.
final json = jsonDecode(response.body) as Map<String, dynamic>; final json = jsonDecode(response.body) as Map<String, dynamic>;

View File

@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_flutter_tuts/outerapi/auth/call/getRandomData.dart';
import 'package:riverpod_flutter_tuts/outerapi/auth/model/my_random.dart';
class Random2Widget extends ConsumerWidget {
const Random2Widget({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
// TODO: implement build
final AsyncValue<MyRandom> myRandom = ref.watch(getMyRandomProvider);
return Center(
child: switch (myRandom) {
AsyncData(:final MyRandom value ) => Text(
'myRandom: $value'
),
AsyncError() => const Text('Oops, something unexpected happened'),
_ => const CircularProgressIndicator(),
},
);
}
}

View File

@ -0,0 +1,26 @@
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'counter.g.dart';
@riverpod
class CounterNotifier extends _$CounterNotifier {
int x = 0;
@override
Future<int> build() async{
return x;
}
void plus() {
x++;
ref.invalidateSelf();
// state = AsyncData(x);
}
void minus() {
x--;
// ref.invalidateSelf();
state = AsyncData(x);
}
}

View File

@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'counter.dart';
class CounterWidget extends ConsumerWidget {
const CounterWidget({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
// TODO: implement build
var counter = ref.watch(counterNotifierProvider);
return Column(
children: [
Center(
child: switch (counter) {
AsyncData(:final value ) => Text(
'data: $value'
),
AsyncError() => const Text('Oops, something unexpected happened'),
_ => const CircularProgressIndicator(),
}),
ElevatedButton(onPressed:() {
ref.read(counterNotifierProvider.notifier).plus();
}, child: const Text("plus")),
ElevatedButton(onPressed: () {
ref.read(counterNotifierProvider.notifier).minus();
}, child: const Text("minus")),
]
);
}
}

View File

@ -0,0 +1,29 @@
import 'dart:convert';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:riverpod_flutter_tuts/outerapi/auth/model/my_random.dart';
import 'package:http/http.dart' as http;
part 'random.g.dart';
Future<MyRandom> fetchData() async {
var ur = Uri.http('127.0.0.1:3000', '/p/random');
final response = await http.get(ur);
// Using dart:convert, we then decode the JSON payload into a Map data structure.
final json = jsonDecode(response.body) as Map<String, dynamic>;
// Finally, we convert the Map into an Activity instance.
return MyRandom.fromJson(json);
}
@riverpod
class randomNotif extends _$randomNotif {
@override
Future<MyRandom> build() async{
return fetchData();
}
Future<void> again() async {
state = const AsyncLoading();
// ref.invalidateSelf();
ref.invalidateSelf();
}
}

View File

@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'random.dart';
class Random3Widget extends ConsumerWidget {
const Random3Widget({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
// TODO: implement build
var myRandom = ref.watch(randomNotifProvider);
return Row(
children: [
Center(
child: switch (myRandom) {
AsyncData(:final value ) => Text(
'data: $value'
),
AsyncError() => const Text('Oops, something unexpected happened'),
_ => const CircularProgressIndicator(),
}),
!myRandom.isLoading ? ElevatedButton(onPressed:() {
ref.read(randomNotifProvider.notifier).again();
}, child: Text(myRandom.isLoading ? "wait":"new"))
:
const Text("loading")
,
]
);
}
}

View File

@ -1,3 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_flutter_tuts/outerapi/auth/call/getRandomData.dart'; import 'package:riverpod_flutter_tuts/outerapi/auth/call/getRandomData.dart';
@ -16,15 +17,24 @@ class RandomWidget extends StatelessWidget {
final AsyncValue<MyRandom> myRandom = ref.watch(getMyRandomProvider); final AsyncValue<MyRandom> myRandom = ref.watch(getMyRandomProvider);
return Center( return Row( children: <Widget>[
child: switch (myRandom) { Center(
AsyncData(:final MyRandom value ) => Text( child: switch (myRandom) {
'myRandom: $value' AsyncData(:final MyRandom value ) => Text(
), 'myRandom: $value'
AsyncError() => const Text('Oops, something unexpected happened'), ),
_ => const CircularProgressIndicator(), AsyncError() => const Text('Oops, something unexpected happened'),
_ => const CircularProgressIndicator(),
}, },
),
ElevatedButton(
onPressed: () {
ref.invalidate(getMyRandomProvider);
},
child: const Text("Refresh ME"),
),
]
); );
}, },
); );