Предоставить catchError - PullRequest
       4

Предоставить catchError

2 голосов
/ 07 января 2020

Я хотел преобразовать свое приложение в веб-флаттер, но когда я попытался запустить его локально, я получил следующую ошибку

Исключение было выброшено _MapStream, прослушиваемым StreamProvider, но не 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(),
       ),
     );
  }
}

1 Ответ

0 голосов
/ 20 января 2020

Итак, моим первым решением было использование StreamBuilder вместо StreamProvider:

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

Но теперь мне удалось заставить StreamProvider работать тоже! Я обнаружил, что существует множество пакетов Firebase ... один из которых вы должны использовать для веба: 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;
    }
  }
...