[英]Riverpod in a class or outside of build Method?
I want to make a class and put similar methods together.我想制作一个 class 并将类似的方法放在一起。
Riverpod works using ref which is only available through extending but how to use it in bare class which doesn't have any extends and build methods. Riverpod 使用 ref 工作,它只能通过扩展使用,但如何在没有任何扩展和构建方法的 bare class 中使用它。
Model Model
class User {
final String uid;
final String username;
final String email;
User({required this.uid, required this.username, required this.email});}
StateNotifier状态通知器
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../models/user.dart';
class UserProvider extends StateNotifier<User> {
UserProvider()
: super(User(
email: '',
username: 'default',
uid: '',
));
addUser(User user) {
state = user;
}}
Place of use / a class使用地点/a class
import 'package:cloud_firestore/cloud_firestore.dart';
import '../providers/user_provider.dart';
import '../models/user.dart' as model;
class FirestoreMethods {
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
// HOW TO USE RIVERPOD HERE IN PLACE OF PROVIDER.
// EXAMPLE OF PROVIDER-
// final user = Provider.of<UserProvider>(context, listen: false);
// print(user.email);
// print(user.uid);
// print(user.username);
// Example of Riverpod
// final userProvider = StateNotifierProvider<UserProvider,
// model.User>((ref) => UserProvider());
// ABOVE RIVERPOD DOES NOT WORK HERE
}
@AnmolSingh While creating StateNotifierProvider you can directly pass User model class. I have modified your code. @AnmolSingh 在创建 StateNotifierProvider 时,您可以直接传递用户 model class。我修改了您的代码。 If you tap the fab button it will update userProvider provider state and it will refresh the UI.
如果你点击 fab 按钮,它会更新 userProvider provider state 并且会刷新 UI。 You can run this code in dartpad itself.
您可以在 dartpad 本身中运行此代码。
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
const Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(ProviderScope(child: MyApp()));
}
class MyApp extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final user = ref.watch(userProvider);
return MaterialApp(
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: darkBlue,
),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: Text("UserName: ${user.username}"),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
ref.read(userProvider.notifier).addUser(User(
email: "krishnakumar@riverpod.com",
uid: "1",
username: "MSARKrish",
));
},
),
));
}
}
class User {
final String uid;
final String username;
final String email;
User({required this.uid, required this.username, required this.email});
}
class UserProvider extends StateNotifier<User> {
UserProvider()
: super(User(
email: '',
username: 'default',
uid: '',
));
addUser(User user) {
state = user;
}
}
final userProvider =
StateNotifierProvider<UserProvider, User>((ref) => UserProvider());
You can pass ref as parameter for any class您可以将 ref 作为参数传递给任何 class
class FirestoreMethods
{
FirestoreMethods(this.ref)
final Ref ref;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.