Почему CircularProgressIndicator () не вращается? - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь отобразить CircularProgressIndicator() под StreamBuilder(). Этот CircularProgressIndicator() должен отображаться только тогда, когда snapshot.connectionState != ConnectionState.active.

Вот в чем проблема. Мое приложение пытается показать вращающийся круг, но по какой-то причине зависает. Не крутится. Кроме того, StreamBuilder перестанет создавать какие-либо новые события. Он застревает на ConnectionState.waiting. Единственное, что я могу сделать, чтобы это исправить, - это нажать Hot Restart . Когда я это делаю, все работает! Круг вращается, и, в конце концов, ConnectionState становится активным, и приложение продолжает работу! Это сводит меня с ума.

Вот фотография замороженного круга (по сути, это просто розовая точка в центре экрана). Я предполагаю, что нарисован только первый кадр, но, честно говоря, я не уверен, что здесь происходит. Я слышал, что это называется «эффект точек».

Интересно то, что когда я заменяю CircularProgressIndicator() на Text('Loading...'), чтобы указать пользователю, что приложение загружается, все работает отлично. Проблемы возникают только из-за круга.

введите описание изображения здесь

Flutter Doctor
[√] Flutter (Channel beta, 1.19.0-4.3.pre, on Microsoft Windows [Version 10.0.18363.900], locale en-US)
    • Flutter version 1.19.0-4.3.pre at C:\Programs\flutter
    • Framework revision 8fe7655ed2 (13 days ago), 2020-07-01 14:31:18 -0700
    • Engine revision 9a28c3bcf4
    • Dart version 2.9.0 (build 2.9.0-14.1.beta)

[√] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
    • Android SDK at C:/Users/Kraken/AppData/Local/Android/Sdk
    • Platform android-29, build-tools 29.0.2
    • ANDROID_HOME = C:/Users/Kraken/AppData/Local/Android/Sdk
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)
    • All Android licenses accepted.

[√] Chrome - develop for the web
    • Chrome at C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

[√] Android Studio (version 4.0)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin version 47.1.2
    • Dart plugin version 193.7361
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)

[√] VS Code, 64-bit edition (version 1.47.0)
    • VS Code at C:\Program Files\Microsoft VS Code
    • Flutter extension version 3.11.0

[√] Connected device (3 available)
    • AOSP on IA Emulator • emulator-5554 • android-x86    • Android 9 (API 28) (emulator)
    • Web Server          • web-server    • web-javascript • Flutter Tools
    • Chrome              • chrome        • web-javascript • Google Chrome 83.0.4103.116

• No issues found!

Мне удалось создать простой фрагмент, который воссоздает эту проблему на эмуляторе Android на Windows. Можете попробовать сами. Проблема возникает после нажатия кнопки «Выполнить». И щелчок по горячей перезагрузке исправит это.

import 'package:flutter/material.dart';
import 'dart:async';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: MyWidget());
  }
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<int>(
        stream: StreamController<int>().stream,
        builder: (context, snapshot) {
          print('$snapshot');
          return Scaffold(
            body: Center(
              child: CircularProgressIndicator(),
            ),
          );
        });
  }
}

Проблема возникает в этом виджете:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:time_tracker_flutter_course/app/home/jobs/jobs_page.dart';
import 'package:time_tracker_flutter_course/app/sign_in/sign_in_page.dart';
import 'package:time_tracker_flutter_course/services/auth.dart';
import 'package:time_tracker_flutter_course/services/database.dart';

class LandingPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final auth = Provider.of<AuthBase>(context, listen: false);
    return StreamBuilder<User>(
        stream: auth.onAuthStateChanged,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.active) {
            final User user = snapshot.data;
            if (user == null) {
              return SignInPage.create(context);
            }
            return Provider<Database>(
              create: (_) => FirestoreDatabase(uid: user.uid),
              child: JobsPage(),
            );
          } else {
            return Scaffold(
              body: Center(
                child: CircularProgressIndicator(),
              ),
            );
          }
        });
  }
}

1 Ответ

0 голосов
/ 15 июля 2020

Обычно я так делаю

return StreamBuilder(
  stream: ,
  builder: (ctx, snapshots) {
    if (snapshots.connectionState == ConnectionState.waiting)
      return Center(
        child: CircularProgressIndicator(),
      );

    final docs = snapshots.data.documents;
    return ListView.builder();
  },
);

И работает, как будто нет проблем с индикатором прогресса.

Попробуйте, надеюсь, у вас это сработает.

...