Riverpod在班级或构建方法的外部?

发布于 2025-02-04 17:32:19 字数 1314 浏览 5 评论 0原文

我想上一堂课,并将类似的方法放在一起。

RiverPod使用REF进行工作,该REF仅通过扩展可用,但是如何在没有任何扩展和构建方法的裸班上使用它。

模型

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;
}}

使用场所/A类

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
}

I want to make a class and put similar methods together.

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.

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

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
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

許願樹丅啲祈禱 2025-02-11 17:32:20

这是通用解决方案。

  1. 创建挡泥板,该保护器从dummyProvider获得ref参考。我称它为虚拟koz,它并没有真正提供任何东西。

     类dummynotifier扩展了Notifier&lt; bool&gt; {
     @Override
     bool build(){
       挡泥板=挡泥板._(参考);
       返回true;
     }
    }
    
    final dummyProvider = notifierProvider&lt; dummynotifier,bool&gt;((){
      返回dummynotifier();
     });
    
    晚期挡泥板托克持有人;
    
    班级挡泥板{
     最终参考_ref;
     扶持者._(this._ref);
    
     获取参考{
      返回_ref;
     }
    }
     
  2. 从MainApp构建方法中读取提供商,以确保创建挡泥器Singleton。

      widget build(buildContext上下文,widgetref ref){
        Ref.Read(DummyProvider);
     
  3. 从任何地方使用。例如,来自本地通知方法:

      future _shownotificationwithDefaultSound(notifplugin)async {
    
      ref ref =挡泥板; ref;
    
      //使用ref从提供商那里获取所需的信息
     

github

Here is the general-purpose solution.

  1. Create RefHolder which obtains Ref reference from DummyProvider. I called it Dummy koz it does not really provides anything.

    class DummyNotifier extends Notifier<bool> {
     @override
     bool build() {
       refHolder = RefHolder._(ref);
       return true;
     }
    }
    
    final dummyProvider = NotifierProvider<DummyNotifier, bool>(() {
      return DummyNotifier();
     });
    
    late RefHolder refHolder;
    
    class RefHolder {
     final Ref _ref;
     RefHolder._(this._ref);
    
     get ref {
      return _ref;
     }
    }
    
  2. Read the provider from the MainApp build method to ensure the RefHolder singleton is created.

     Widget build(BuildContext context, WidgetRef ref) {
        ref.read(dummyProvider);
    
  3. Use from anywhere. For example, from the local notifications method:

    Future _showNotificationWithDefaultSound(notifPlugin) async {
    
      Ref ref = refHolder.ref;
    
      //use ref to get required info from providers
    

Github

笑叹一世浮沉 2025-02-11 17:32:19

@anmolsingh创建StatenotifierProvider时,您可以直接通过用户模型类。我修改了您的代码。如果点击FAB按钮,它将更新UserProvider提供商状态,并将刷新UI。您可以在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: "[email protected]",
                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());

您可以将REF作为任何类别的参数传递

class FirestoreMethods
{
  FirestoreMethods(this.ref)
  final Ref ref;
}

@AnmolSingh While creating StateNotifierProvider you can directly pass User model class. I have modified your code. If you tap the fab button it will update userProvider provider state and it will refresh the UI. You can run this code in dartpad itself.

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: "[email protected]",
                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

class FirestoreMethods
{
  FirestoreMethods(this.ref)
  final Ref ref;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文