【问题标题】:How to use provider correctly while I'm tryng to set a profile management?在我尝试设置配置文件管理时如何正确使用提供程序?
【发布时间】:2021-10-24 05:08:07
【问题描述】:

我正在尝试使用提供程序来获取有关用户的不同信息(实际上是 uid),但它不起作用,因为 .auth 没有为“AuthClass”类型定义,顺便说一下,我放置了 AuthClass 因为我的代码在那里,但我不确定这是好课。我寻找解决方案,他们说我们必须使用我们的提供者身份验证类,但我不知道在哪里可以找到它。也许你可以帮助我

这是我的代码(.auth 带有红色下划线):

body: SingleChildScrollView(
        child: Column(
          children: <Widget> [
            FutureBuilder(
              future: Provider.of<AuthClass>(context).auth.inputData(),
              builder: ( context, snapshot) {
                if (snapshot.connectionState == ConnectionState.done) {
                  return Text("${snapshot.data}");
                } else {
                  return Text("Loading...");
                }
              },
            )
          ]
        )
      )

这是我的代码中包含 inputData() 的另一部分:

import 'package:firebase_auth/firebase_auth.dart';

class AuthClass {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  void inputData()  async {
    final User? user =  _auth.currentUser;
    final uid = user!.uid;
    print(uid);
  }
}

【问题讨论】:

    标签: firebase flutter dart profile provider


    【解决方案1】:

    为了使用Provider,你应该修改你的代码如下:

    1. 修改 AuthClass:
    class AuthClass extends ChangeNotifier {
      final FirebaseAuth _auth = FirebaseAuth.instance;
    
      Future<bool> inputData()  async {
        final User? user =  await _auth.currentUser;
        final uid = user!.uid;
        print(uid);
        return true;
      }
    }
    
    1. 使用它:
    Provider.of<AuthClass>(context).inputData(), // .auth is redundant
    
    1. 确保您已在主文件中定义了提供程序:
    ChangeNotifierProvider(
          create: (context) => AuthClass(),
          child: const MyApp(),
        ),
    

    您还应该将 Provider 包添加到您的依赖项中。

    【讨论】:

    • 我已经完成了所有操作,但是当我删除 .auth 时,您的第二步出现了最后一个错误:此表达式的类型为“void”,因此无法使用其值。
    • 正是由于这个事实,FutureBuilder 中的future 需要一个 Future 函数,我已经更新了我的答案(参见步骤 1)。我假设 _auth.currentUser 是一个异步方法,因为您已经为此函数使用了 async 修饰符。您可以查看结果并根据您的决定返回truefalse
    • 有效!我没有更多错误,唯一的问题是它在我的控制台上打印了 id,但在我的屏幕上打印了文本“true”。感谢您的宝贵时间
    • 这是因为我在提供程序中返回了一个布尔值,仅作为示例,您可以返回接收到的响应或其他任何内容。如果您将我的答案设置为可接受的解决方案,如果对您有帮助,我将不胜感激。 @flomitri
    • 没问题 :) !但是您如何返回收到的响应,因为我尝试了 return _auth.currentUser.uid 但它不起作用,我真的是初次亮相,我将 bool 更改为 String
    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2023-04-01
    • 2023-04-11
    • 2017-08-07
    • 1970-01-01
    相关资源
    最近更新 更多