FLUTTER: Как использовать навигатор в streambuilder? - PullRequest
2 голосов
/ 14 января 2020

Я пытаюсь перемещаться внутри потокового построителя, но у меня появляется эта ошибка: "setState () или markNeedsBuild () вызваны во время сборки.". Если я вызываю навигацию внутри нажатой кнопки, она работает, а не просто использует ее внутри условия. Я застрял. Есть некоторый код, чтобы показать вам.

Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
        stream:
            Firestore.instance.collection('rooms').document(pinid).snapshots(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (snapshot.hasData) {
            if ((snapshot.data['Votes'][0] + snapshot.data['Votes'][1]) >=
                snapshot.data['joueurs']) {
              Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => Results(),
                  ));
            }
          }
          return Center(
            child: Text('VOUS AVEZ VOTE'),
          );
        },
      ),
    );
  }

1 Ответ

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

Это потому, что Flutter запускает сборку фрейма, когда вы пытаетесь перейти на другой экран, поэтому это невозможно.

Вы можете запланировать обратный вызов после фрейма, чтобы вы могли перемещаться, как только Flutter завершится. с перестройкой дерева для этого виджета.

import 'package:flutter/foundation.dart';

  WidgetsBinding.instance.addPostFrameCallback(
     (_) => Navigator.push(context,
       MaterialPageRoute(
         builder: (context) => Results(),
       ),
     ),
   );
...