简体   繁体   English

Riverpod 在 class 中还是在构建方法之外?

[英]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.

相关问题 Flutter Riverpod - 在构建方法中使用 read() - Flutter Riverpod - using read() inside build method Flutter Riverpod:在构建 Function 之外使用 ref.watch - Flutter Riverpod: Using ref.watch Outside of Build Function 如何在没有 ConsumerWidget 或 HookWidget 的情况下访问 Riverpod StateNotifier state? - How to access Riverpod StateNotifier state outside build without ConsumerWidget or HookWidget? 如何在小部件树/小部件 class 之外调用riverpod 提供程序? - How to call a riverpod provider outside of widget tree/widget class? 构建方法中的 Flutter Riverpod context.read vs Provider - Flutter Riverpod context.read vs Provider in the build method 如何在 Widget 构建(BuildContext 上下文)方法之外从父 class 调用 BaseViewModel class 中的方法 - How to call method in BaseViewModel class from parent class just outside the Widget build(BuildContext context) method StreamBuilder 可以在构建方法之外吗? - Can a StreamBuilder be outside the build method? "如何在构建方法之外访问 State 类中的 Stateful 小部件变量?" - How to access Stateful widget variable inside State class outside the build method? Riverpod:initState 方法中的访问提供程序 - Riverpod : Access Provider in initState method Riverpod,在 BuildContext 和 Provider 之外读取 state - Riverpod, reading state in outside BuildContext and Provider
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM