Flutter: анимация перехода виджетов с использованием потоков (без навигатора) - PullRequest
0 голосов
/ 02 марта 2020

Мое приложение управляет Authentication статусами, используя Streams. Основная идея c заключается в том, что я создаю StreamBuilder, который возвращает определенный виджет при определенном состоянии аутентификации.

Как загрузить эти виджеты с анимацией, подобной, снизу вверх, непрозрачность и т. Д. c. Я знаю, что это может быть достигнуто с помощью Navigator, но я не могу использовать это в этом случае. Так как StreamBuilders требует вернуть виджет. Вот псевдокод:

void main() {
  runApp(App());
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Home(),      
    );
  }
}

Виджет Home, который загружает другой виджет на основе AuthStatus:

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<AuthStatus>(
      stream: Provider.of<AuthService>(context).stream(),
      builder: (ctx, snapshot) {
        if (!snapshot.hasData) {
          return LoadingPage();
        }

        if (snapshot.data == AuthStatus.authenticated) {
          return DashboardPage();
        } else if (snapshot.data == AuthStatus.unauthenticated) {
          return LoginPage();
        } else {
          return LoadingPage();
        }
      },
    );
  }
}

Я хотел бы загрузить LoginPage (), DashboardPage () с анимация. Но я не уверен, как это сделать.

Я пытался слушать поток и нажимать sh на навигатор в приемнике, но этот виджет постоянно продолжал собираться и переходить к навигатору. Вот псевдо-код:

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Provider.of<AuthStatus>(context).listen((data) {
      switch (data) {
        case AuthStatus.authenticated:
          Navigator.push(context, MaterialPageRoute(builder: (ctx) => DashboardParge()));
          break;
        case AuthStatus.unauthenticated:
          Navigator.push(context, MaterialPageRoute(builder: (ctx) => LoginPage()));
          break;
        default:
          Navigator.push(context, MaterialPageRoute(builder: (ctx) => LoadingPage()));
          break;          
      }
    });

    return LoadingPage();
  }
}

Это постоянно восстанавливает. Поток rxdart BehaviorSubject(). Методы build () вызываются многократно, даже если в поток не добавлены данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...