首页 > 解决方案 > 提供'catchError'

问题描述

我想将我的应用程序转换为 Flutter Web,但是当我尝试在本地运行它时出现以下错误

StreamProvider 监听的 _MapStream 抛出异常,但没有catchError提供。

异常:NoSuchMethodError:null 上的无效成员:'providerId'

我将不胜感激有关如何解决此问题的建议。

这是我的 main.dart 文件,以防相关:

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {   
  @override   
  Widget build(BuildContext context) {
     return StreamProvider<User>.value(
       value: AuthService().user,
       child: MaterialApp(
         debugShowCheckedModeBanner: false,
         theme: ThemeData(
           primarySwatch: Colors.blue,
         ),
         home: Wrapper(),
       ),
     );
  }
}

标签: flutterfirebase-authenticationflutter-web

解决方案


所以我的第一个解决方案是使用 StreamBuilder 而不是 StreamProvider:

return StreamBuilder(
  stream: AuthService().currentUser,
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return AdminDashboardScreen();
    } else {
      return SignInScreen();
    }
  },
);

但现在我也设法让 StreamProvider 工作了!我发现那里有很多 Firebase 包......你应该用于 web 的是: https ://pub.dev/packages/firebase

但不是作为一个类导入和使用,您应该能够像这样引用它:

  import 'package:firebase/firebase.dart' as fb;

  final fb.Auth _firebaseAuth = fb.auth();

  // create user object based on firebase user
  User _userFromFirebaseUser(fb.User user) {
    return user != null ? User(uid: user.uid) : null;
  }

  // auth change user stream
  Stream<User> get currentUser {
    return _firebaseAuth.onAuthStateChanged.map(_userFromFirebaseUser);
  }

  // sign in anon
  Future<User> signInAnon() async {
    try {
      fb.UserCredential result = await _firebaseAuth.signInAnonymously();
      fb.User user = result.user;
      return _userFromFirebaseUser(user);
    } catch (e) {
      print('[AuthService] error signInAnon: ${e.toString()}');
      return null;
    }
  }

推荐阅读