- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前,我们正在使用 Firebase 在我们的应用程序上实现简单的聊天。
我们使用 Riverpod 处理应用程序的启动和身份验证。
启动过程如下:
@override
Widget build(BuildContext context) {
LocalNotificationService()
.handleApplicationWasLaunchedFromNotification(_onSelectNotification);
LocalNotificationService().setOnSelectNotification(_onSelectNotification);
_configureDidReceiveLocalNotification();
// final navigator = useProvider(navigatorProvider);
final Settings? appSettings = useProvider(settingsNotifierProvider);
final bool darkTheme = appSettings?.darkTheme ?? false;
final LauncherState launcherState = useProvider(launcherProvider);
SystemChrome.setEnabledSystemUIOverlays(
<SystemUiOverlay>[SystemUiOverlay.bottom],
);
return MaterialApp(
title: 'Thesis Cancer',
theme: darkTheme ? ThemeData.dark() : ThemeData.light(),
navigatorKey: _navigatorKey,
debugShowCheckedModeBanner: false,
home: Builder(
builder: (BuildContext context) => launcherState.when(
loading: () => SplashScreen(),
needsProfile: () => LoginScreen(),
profileLoaded: () => MainScreen(),
),
),
);
}
目前,我们只允许从主屏幕和房间屏幕退出,如下所示:
ListTile(
leading: const Icon(Icons.exit_to_app),
title: const Text('Çıkış yap'),
onTap: () =>
context.read(launcherProvider.notifier).signOut(),
),
signOut
的作用:
Future<void> signOut() async {
tokenController.state = '';
userController.state = User.empty;
await dataStore.removeUserProfile();
_auth.signOut();
state = const LauncherState.needsProfile();
}
问题是,每次我们进入 RoomsPage
并从它或主页面注销(从房间返回)时,我们都会遇到与 firebase< 相同的问题/强>: 调用者没有执行指定操作的权限。
。当然,signout
会关闭 Firebase,因此 Firebase 会抛出此错误;但是,它应该在从 RoomsScreen 出来之后(即使返回主屏幕也会发生),这个小部件被处置因此连接应该被关闭,处置,但它似乎仍然是在内存上。
房间页面界面如下:
class RoomsPage extends HookWidget {
@override
Widget build(BuildContext context) {
final AsyncValue<List<fc_types.Room>> rooms =
useProvider(roomsListProvider);
return Scaffold(
appBar: Header(
pageTitle: "Uzmanlar",
leading: const BackButton(),
),
endDrawer: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 275),
child: SideMenu(),
),
body: rooms.when(
data: (List<fc_types.Room> rooms) {
if (rooms.isEmpty) {
return Container(
alignment: Alignment.center,
margin: const EdgeInsets.only(
bottom: 200,
),
child: const Text('No rooms'),
);
}
return ListView.builder(
itemCount: rooms.length,
itemBuilder: (
BuildContext context,
int index,
) {
final fc_types.Room room = rooms[index];
return GestureDetector(
onTap: () => pushToPage(
context,
ChatPage(
room: room,
),
),
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
child: Row(
children: <Widget>[
Container(
height: 40,
margin: const EdgeInsets.only(
right: 16,
),
width: 40,
child: ClipRRect(
borderRadius: const BorderRadius.all(
Radius.circular(20),
),
child: Image.network(room.imageUrl ?? ''),
),
),
Text(room.name ?? 'Room'),
],
),
),
);
},
);
},
loading: () => const Center(
child: CircularProgressIndicator(),
),
error: (Object error, StackTrace? stack) => ErrorScreen(
message: error.toString(),
actionLabel: 'Home',
onPressed: () => Navigator.of(context).pop(),
),
),
);
}
}
提供者很简单:
final AutoDisposeStreamProvider<List<fc_types.Room>> roomsListProvider =
StreamProvider.autoDispose<List<fc_types.Room>>(
(_) async* {
final Stream<List<fc_types.Room>> rooms = FirebaseChatCore.instance.rooms();
await for (final List<fc_types.Room> value in rooms) {
yield value;
}
},
name: "List Rooms Provider",
);
我想 AutoDispose 构造函数会在删除小部件时自动处理此提供程序,因此,它应该关闭与 Firebase 的连接(如文档所述)。
这里有什么问题?
我错过了什么?
我应该打开一个关于这个的问题吗?
最佳答案
在documentation ,该示例使用基于 StreamController
Stream
final messageProvider = StreamProvider.autoDispose<String>((ref) async* {
// Open the connection
final channel = IOWebSocketChannel.connect('ws://echo.websocket.org');
// Close the connection when the stream is destroyed
ref.onDispose(() => channel.sink.close());
// Parse the value received and emit a Message instance
await for (final value in channel.stream) {
yield value.toString();
}
});
在您的例子中,您的方法返回一个 Stream
。这改变了游戏规则。只需返回 Stream
。
final AutoDisposeStreamProvider<List<fc_types.Room>> roomsListProvider =
StreamProvider.autoDispose<List<fc_types.Room>>(
(_) => FirebaseChatCore.instance.rooms(),
name: "List Rooms Provider",
);
关于firebase - 注销时未处理 AutoDispose StreamProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68225873/
我正在使用 Google Cloud Firestore 作为 Flutter 应用程序的后端。目前我正在使用 StreamProvider 从云 firestore 构建数据流。现在,我需要维护 2
我正在尝试使用 StreamProvider(来自 this awesome package),但我一直在努力让特定的流工作。 我创建了一个 StreamController,我用它通过它的 Sink
我从 StreamProvider 获取的数据不完整。 下一个最小的小部件树重现了我的问题:选项卡式屏幕上的 SreamProvider。 我的用户对象包含多个值(以及其他属性)的映射,我通过调用 f
目前,我们正在使用 Firebase 在我们的应用程序上实现简单的聊天。 我们使用 Riverpod 处理应用程序的启动和身份验证。 启动过程如下: @override Widget build(
我想知道是否有人可以告诉我如何实现 Flutter StreamProvider“catchError”属性? 下面的示例代码添加到: StreamProvider.value( initia
我是 flutter 的新手。我实现了这个示例应用程序以了解 SQLite 和提供程序状态管理。这是一个简单的任务管理系统。我使用 MOOR 来处理 SQLite 数据库。我遇到的问题是任务列表在添加
我使用 StreamProvider将图像提供给其他应用程序。一切正常,但有一种情况除外:当我尝试将多张图像共享到我的三星 S6 设备(Android 5.1.1)上的消息传递应用程序时,消息传递应用
StreamProvider.value 使用相同的值多次构建小部件。 StreamProvider.value( value: FirebaseAuth.instance.onAuthS
我有一个像这样的 StreamBuilder: StreamBuilder>( stream: myDatabase.authInfosDao.watch(),
我正在 Flutter 中开发一个应用程序(我还是个新手),但遇到以下错误: Error: Could not find the correct Provider> above this Exerci
我有两个流: Stream FirebaseAuth.instance.onAuthStateChanged Stream userService.streamUser(String uid) 我的
当我尝试在 firestore 中获取不存在的数据时,我遇到了 StreamProvider 的问题。 Stream streamCollectedItem(String id,int categor
我有一个实现 firebase 身份验证的 flutter 应用程序。关注this后教程我的 main.dart 文件如下所示: class MyApp extends StatelessWidget
我有一个实现 firebase 身份验证的 flutter 应用程序。关注this后教程我的 main.dart 文件如下所示: class MyApp extends StatelessWidget
我正在使用 Flutter 开发一个应用程序,我正在使用 Cloud Firestore。是否有任何理由更喜欢 StreamBuilder 之间的一个和 StreamProvider ? 最佳答案 有
我正在尝试设置一个个人资料类型页面,用户可以在其中查看他们的信息,最终我将添加功能,以便他们可以更改他们的数据。我正在使用 Provider 访问 Firebase 流 它返回当前用户的 UID(这工
我试图通过将简单的 FireStore auth Provider 示例迁移到 RiverPod 来了解 RiverPod。 这是我的身份验证服务: import 'package:firebase_
有时我想我得到了提供者的逻辑,然后我被难住了几个小时试图做下面的事情。 我需要从 Firestore 集合流中获取连接 ID 列表。简单。 但是,我需要将此连接 ID 的流列表提供给另一个 fires
我注意到自从我使用 StreamProvider 添加一个新的 Stream 以来,我的读取请求显着增加。 ,我设法通过删除流和没有重复请求来确认这一点。但我似乎无法追查为什么它重复。 注意:代码运行
我正在尝试根据 Firebase 的身份验证状态创建一个简单的导航,但出于某种原因Provider.of(context)始终返回 null 作为小部件构建方法中的第一个值。所以我的应用程序总是导航到
我是一名优秀的程序员,十分优秀!