【问题标题】:Using Flutter ChangeNotifierProvider for authentication使用 Flutter ChangeNotifierProvider 进行身份验证
【发布时间】:2020-12-23 12:57:18
【问题描述】:

我正在使用 ChangeNotifierProvider 来处理我的 Flutter 应用的应用状态。

我的 main.dart 文件

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_app/services/auth.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<AuthService>(
        create: (context) => AuthService(), // initializes auth.dart file here
        child: MaterialApp(
          initialRoute: '/',
          onGenerateRoute: RouteGenerator.generateRoute,
          debugShowCheckedModeBanner: false,
          title: '...',
          home: WelcomeScreen(),
        ));
  }
}

我正在尝试更改 auth.dart

uid 字段的值

auth.dart 文件

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';

class AuthService with ChangeNotifier {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  String uid = ""; //initial value of uid

  UserM _userFromFirebaseUser(User user) {
    return user != null ? UserM(uid: user.uid) : null;
  }

  Stream<UserM> get user {
    return null;
  }

  Future signInWithEmail(String email, String password) async {
    try {
      UserCredential result = await _auth.signInWithEmailAndPassword(
          email: email, password: password);
      User user = result.user;
      uid = user.uid; //trying to change uid here
      print('user id: $uid'); //new value is printed here
      notifyListeners();
      return _userFromFirebaseUser(user);
    } catch (e) {
      print(e.toString());
      return null;
    }
  }

uid 发生了变化,但是当我尝试在另一个文件中获取新值时,我仍然得到旧值,即顶部声明的空字符串。 这就是我尝试访问它的方式

final auth = Provider.of<AuthService>(context, listen: true).uid;
print(auth);

请问我做错了什么?

【问题讨论】:

  • 你为什么不直接通过你的类模型访问你的uid UserM 你已经保存了结果在那里
  • 我希望在其他屏幕上使用它

标签: firebase flutter authentication dart provider


【解决方案1】:

我不明白为什么需要使用Provider 来获取Firebase 中用户的uid。你可以通过currentUser.uid同步获取uid
这是一个例子:

print(FirebaseAuth.instance.currentUser.uid);

【讨论】:

  • 好的。我明白了,但我需要知道为什么这不起作用
  • 您以错误的方式使用了提供程序。设置值后,您必须调用 notifyListners()。看看这个对提供者有更深入的了解:youtube.com/watch?v=d_m5csmrf7I
猜你喜欢
  • 2020-01-05
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 2021-04-14
  • 2020-12-04
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多