Я пытаюсь отобразить 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(),
),
);
}
});
}
}