Flutter / FirebaseAuth: как я могу автоматически авторизовать пользователя при запуске приложения? - PullRequest
0 голосов
/ 27 мая 2018

У меня есть следующие методы, чтобы увидеть, если пользователь уже вошел в систему, который в этом случае я вошел в систему, и функция getCurrentUser() работает, потому что в консоли он возвращает «USER IS NOT NULL», но домашний виджетвсе еще нулевой, давая мне «ИСКЛЮЧЕНИЕ, ЗАПИСАННОЕ БИБЛИОТЕКОЙ ВИДЖЕТОВ», говорящее, что дом не может быть нулевым и прочим.

userAPI.dart

Future<FirebaseUser> getCurrentUser() async {
FirebaseUser user = await FirebaseAuth.instance.currentUser();

if (user != null) {
  return user;
} else {
  return null;
}
}

main.dart

class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
Widget home;

APIs().usersAPI.getCurrentUser().then((u) {
  if (u == null) {
    print('USER IS NULL');
    home = WelcomePage();
  } else {
    print('USER IS NOT NULL');
    home = FeedPage();
  }
});

return MaterialApp(
  title: "Jedi",
  debugShowCheckedModeBanner: false,
  home: home,
  routes: {
    '/login' : (context) => new LoginPage(),
    '/feed' : (context) => new FeedPage(),
  },
);
}
}

1 Ответ

0 голосов
/ 28 мая 2018

Вам нужно сделать приложение StatefulWidget и вызывать setState при настройке домашней страницы

setState(() {
   home = WelcomePage();
});

setState(() {
   home = FeedPage();
});

Плюс вам может потребоваться установить для домашней страницы что-то отличное от нуля, прежде чем API вернется.

Что может быть лучше, так это использовать FutureBuilder.Таким образом, вы будете возвращать правильный виджет в зависимости от состояния, в котором вы находитесь.

return MaterialApp(
  title: "Jedi",
  debugShowCheckedModeBanner: false,
  home: FutureBuilder<FirebaseUser>(
     future: APIs().usersAPI.getCurrentUser(),
     builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {

        switch (snapshot.connectionState) {
            case ConnectionState.none:
            case ConnectionState.waiting: 
               return CircularProgressIndicator();
            default: 
               if (snapshot.hasError)
                  return Text('Error: ${snapshot.error}');
               else
                 if(snapshot.data == null)
                    return WelcomePage();
                 else 
                    return FeedPage();
        }

     }
  ),
  routes: {
    '/login' : (context) => new LoginPage(),
    '/feed' : (context) => new FeedPage(),
  },
);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...