Аутентификация Flutter с потоками

видимо, я делаю здесь что-то принципиально неправильное... После входа в систему я отправляю новое логическое значение (T) в поток isAuthorized. StreamBuilder перезапускается и в конечном итоге выполняет правильную ветвь if-else, но по какой-то причине виджет входа остается отображаемым на экране?

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'App',
      theme: appTheme,
      initialRoute: '/',
      home: StreamBuilder<bool>(
        stream: getIt.get<SessionBloc>().isAuthorized,
        initialData: false,
        builder: (context, snapshot) {
          if (snapshot.data) {
            return Home();
          } else {
            return Login();
          }
        },
      ),
      routes: {
          '/': (context) => Home(),
          '/profile': (context) => Profile(),
          '/login': (context) => Login(),
          '/register': (context) => Register(),
        },
      ),
    );
  }
}

person dakt    schedule 02.09.2019    source источник


Ответы (1)


Поскольку я не знаю, что делает ваш блок, я создал простой поток, имитирующий блок. Он отлично работает с этим фрагментом кода. Если блок дает вам то, что вы хотите, и соответствует блоку if-else, вам следует рассмотреть возможность удаления '/': (context) => Home().

Это было исключением, которое я имел, когда у меня был домашний маршрут: Если указано свойство home, таблица маршрутов не может включать запись для "/", так как это было бы избыточно.

 class Authorization {
      final _authorization = StreamController<bool>();
      StreamSink<bool> get send => _authorization.sink;
      Stream<bool> get isAuthorized => _authorization.stream;
      get close => _authorization.close();
    }

class MyApp extends StatelessWidget {
  Authorization a = new Authorization();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'App',
      home: StreamBuilder<bool>(
        stream: a.isAuthorized,
        initialData: false,
        builder: (context, snapshot) {
          if (snapshot.data) {
            return Home(auth: a);
          } else {
            return Login(auth: a);
          }
        },
      ),
      routes: {
        '/login': (context) => Login(auth: a),
      },
    );
  }
}

class Home extends StatelessWidget {
  final Authorization _auth;

  Home({@required Authorization auth})
      : assert(auth != null),
        _auth = auth;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[Text("Home"), RaisedButton(
          onPressed: ()  {
            _auth.send.add(false);
          },
        )],
      ),
    );
  }
}

class Login extends StatelessWidget {

  final Authorization _auth;

  Login({@required Authorization auth})
      : assert(auth != null),
        _auth = auth;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[Text("Login"), RaisedButton(
          onPressed: ()  {
            _auth.send.add(true);
          },
        )],
      ),
    );
  }
}
person Erkin Kurt    schedule 02.09.2019