我想我现在至少有一个模糊的想法,
如何在我的应用程序中使用BLoC,Stream Builder
和继承的小部件(或模型)
(没有什么特别的,但对我来说需要时间),
但玩Scoped模型
我有一个存在的危机:
我觉得他们大多数可以做同样的事情,或者
至少我可以
用它们中的任何一个获得相同的明显效果,
但我没有能力去理解
何时 以及为什么一个比另一个好.
我故意保持开放的问题不要因为我而讨厌我,
但我希望能更好地理解我正在做的事情
以及使用这一个或另一个事件在幕后发生的事情.
谢谢你的耐心等待.弗朗切斯科
Ps:我不能添加'范围模型'标签,如果可以的话,
它可能与像我这样的新手有关
我正在使用 Flutter 开发一个应用程序,并在物理 iOS 设备 (iPhone 7) 上测试该应用程序。
iOS版本是:15.3.1
Flutter版本是:2.10.3
当我测试我的应用程序时,偶尔会发生崩溃。崩溃给出以下错误。它并不总是在同一个地方崩溃,所以我不知道在这里分享什么代码。错误消息本身对我来说并没有说明太多,而且我在网上找不到有关此错误的任何有用信息。
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x443b8000443b8000)
frame #0: 0x0000000198405048 libobjc.A.dylib`objc_msgSend + 8
libobjc.A.dylib`objc_msgSend:
-> 0x198405048 <+8>: ldr x13, [x0]
0x19840504c <+12>: and x16, x13, #0xffffffff8
0x198405050 <+16>: mov x15, x16
0x198405054 <+20>: ldr x11, [x16, #0x10]
Target 0: (Runner) stopped.
Lost connection to device.
Exited (sigterm)
Run Code Online (Sandbox Code Playgroud)
接下来我可以检查什么?
我想知道我的 Stream Builder 是否做错了什么。这是我的代码的缩短版本:
class PrepareList extends StatefulWidget {
final String place;
const PrepareList({
Key? …Run Code Online (Sandbox Code Playgroud) dart firebase firebase-realtime-database flutter stream-builder
我想删除一些 firebase 并且当 Streambuilder(gridview.builder) 到达它的索引将为空时它会忽略它并且不要在该插槽中添加任何小部件并将其保留给其他人
这是它的样子
我希望左侧和右侧的空白区域消失,其他小部件取而代之
Firebase 数据库映像
classList(userUid) {
print("user uid: $userUid");
return StreamBuilder(
stream: FirebaseDatabase.instance
.reference()
.child("user")
.child(userUid)
.child("classData")
.onValue,
builder: (BuildContext context, AsyncSnapshot<Event> snapshot) {
if (snapshot.hasData) { // Map<dynamic, dynamic> map = snapshot.data.snapshot.value; // snapshot.data.snapshot.value.forEach((dynamic, v) => print(v["className"]));
if (snapshot.data.snapshot.value != null) {
return GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3),
itemCount: snapshot.data.snapshot.value.toList().length,
padding: EdgeInsets.all(2.0),
scrollDirection: Axis.vertical,
itemBuilder: (BuildContext context, int index) {
RandomColor _randomColor = RandomColor();
Color _color = _randomColor.randomColor(
colorBrightness: ColorBrightness.veryLight);
Color _color2 = _randomColor.randomColor( …Run Code Online (Sandbox Code Playgroud) 我在应用程序的主页/根页面中有一个流构建器。每当我在别处进行页面导航时,就会触发此流构建器,这与流本身无关。
根据here和here,我的理解是,当在导航器中弹出/推送页面时,它会触发应用程序的重建,因此流构建器会重新连接并触发。然而,这似乎效率低下,那么有没有办法防止流构建器在弹出/推送页面时触发?
此外,根据日志,当我推送页面时,页面首先被构建并显示,然后流构建器被触发。然而,流构建器的小部件/页面根本不显示,即使日志/调试器清楚地显示流构建器的小部件已返回。它去了哪里?它在 Flutter 框架中是如何工作的?
下面是完整的代码和日志。该代码使用 Firebase 身份验证作为流构建器。
代码:
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: AppHomePage(),
);
}
}
class AppHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final FirebaseAuth auth = FirebaseAuth.instance;
return StreamBuilder<FirebaseUser>(
stream: auth.onAuthStateChanged,
builder: (_, AsyncSnapshot<FirebaseUser> snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
final FirebaseUser user = snapshot.data; …Run Code Online (Sandbox Code Playgroud) dart firebase-authentication flutter flutter-layout stream-builder
我有一个流构建器在监听 Firestore,它有点工作。主要问题是streambuilder不断重建(如果它不花费我额外的读取,那么不用担心,但如果它这样做了,那么这是一个我假设它确实存在的问题)。当主页第一次构建时,当我转到另一个页面时,它会再次构建,当我弹回主页时,它会第三次重建。
代码:
class _RequestsListState extends State<RequestsList> with AutomaticKeepAliveClientMixin {
final Map<String, List<Post>> posts = {};
final List<String> postsUserIDs = [];
@override
bool get wantKeepAlive => true;
@override
Widget build(BuildContext context) {
super.build(context);
print('RequestsList');
User cUser = InheritedUser.of(context).user;
return StreamBuilder<List<Post>>(
initialData: cUser.posts,
stream: APIs().posts.auPostsStream(cUserID: cUser.userID),
builder: (context, snap) {
if (snap.hasError) {
print('AUPostsList.dart StreamBuilder Error: ${snap.error}');
return null;
} else {
print('POSTS LENGTH');
print(snap.connectionState);
print(cUser.posts.length);
this.posts.clear();
this.postsUserIDs.clear();
snap.data.forEach((post) {
if (this.posts[post.user.documentID] == null) {
this.posts[post.user.documentID] = [post];
} else { …Run Code Online (Sandbox Code Playgroud) 你好,我正在尝试在我的列表中使用分页。并且列表数据来自firebase。我不确定如何使用流构建器对数据进行分页。现在我通过在 didChangeDependencies() 函数中调用 getdocuments 来进行分页。但在添加新数据后,列表不会更新。如果有人可以提供帮助,那么这对我来说会很棒。这是我现在在做什么..
didChangeDependencies() {
super.didChangeDependencies();
getProducts();
_scrollController.addListener(() {
double maxScroll = _scrollController.position.maxScrollExtent;
double currentScroll = _scrollController.position.pixels;
double delta = MediaQuery.of(context).size.height * 0.20;
if (maxScroll - currentScroll <= delta) {
getProducts();
}
});
}
getProducts() async {
if (!hasMore) {
return;
}
if (isLoading) {
return;
}
setState(() {
isLoading = true;
});
QuerySnapshot querySnapshot;
if (lastDocument == null) {
querySnapshot = await firestore
.collection('products')
.limit(documentLimit)
.orderBy('timestamp', descending: true)
.getDocuments();
} else {
querySnapshot = await firestore
.collection('products') …Run Code Online (Sandbox Code Playgroud) pagination firebase flutter google-cloud-firestore stream-builder
嗨,我正在尝试将 Firebase 文档中的数据动态显示到我的 Flutter 中,并在其中使用循环进行渲染,因此我创建了一个List<Widget> Cards并添加了makeItem()包含卡片的函数,并将它们放入循环中,所以问题是当我运行它输出的代码print(snapshot.connectionState);为ConnectionState.waiting所有的时间,它应该是异步快照但它拒绝为需要加载的数据,我应该提到的是,数据显示被通缉时,我打“Android Studio中热负荷”。所以我不知道如何解决这个问题。提前致谢
我正在尝试构建一个简单的报价 Flutter 应用程序,在其中显示报价列表并允许用户“喜欢”报价。为此,我正在使用 Streambuilder。我的问题是 Firestore 使用仪表板显示的读取次数非常多(每个用户几乎 300 次),即使我最多有 50 个引号。我有一种预感,我的代码中的某些内容导致 Streambuilder 多次触发(可能用户“喜欢”引用),而且 Streambuilder 正在加载所有引用,而不是仅加载用户视口中的引用。任何有关如何解决此问题以减少读取次数的帮助将不胜感激。
import 'dart:convert';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:positivoapp/utilities.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:share/share.dart';
class QuotesScreen extends StatefulWidget {
@override
QuotesScreenLayout createState() => QuotesScreenLayout();
}
class QuotesScreenLayout extends State<QuotesScreen> {
List<String> quoteLikeList = new List<String>();
// Get Goals from SharedPrefs
@override
void initState() {
super.initState();
getQuoteLikeList();
}
Future getQuoteLikeList() async {
if (Globals.globalSharedPreferences.getString('quoteLikeList') == null) {
print("No quotes liked yet");
return;
}
String quoteLikeListString =
Globals.globalSharedPreferences.getString('quoteLikeList');
quoteLikeList = …Run Code Online (Sandbox Code Playgroud) 我有一个 Bloc 类,需要基于同一流控制器的三个流。
class TodoBloc {
final _todoController = StreamController<List<TodoModel>>();
get allTodoStream => _todoController.stream;
get activeTodoStream => _todoController.stream
.map<List<TodoModel>>(
(list) => list.where((item) => item.state == 0));
get completedTodoStream => _todoController.stream
.map<List<TodoModel>>(
(list) => list.where((item) => item.state == 1));}
Run Code Online (Sandbox Code Playgroud)
这是一个有状态的待办事项列表。我想在与检索其他状态的流分开的流中检索具有活动状态的待办事项。
我有一个方法负责过滤并根据过滤器值返回一个流。这是方法:
Stream<List<TodoModel>> filterTodoLs(String filter) {
if (filter == 'all') {
return todoStream;
} else if (filter == 'completed') {
return completedStream;
} else if (filter == 'active') {
return activeStream;
}
return todoStream;
}
Run Code Online (Sandbox Code Playgroud)
稍后在小部件中使用,如下所示:
return StreamBuilder<List<TodoModel>>(
stream: bloc.filterTodoLs(filter),
builder:(BuildContext context, …Run Code Online (Sandbox Code Playgroud) 使用“flutter clean”和“flutter run”将任何 Flutter 应用程序从我的 Linux 计算机运行到我的 Galaxy Tab S6 时,我遇到了“更新持久存储”失败。这是在我向我目前正在开发的应用程序添加更多 StreamBuilders 后才开始发生的事情,即使我注释掉这些流,它也会继续发生。任何有关正在发生的事情的帮助或想法将不胜感激!
F/OIC_SRM_DOXM(14551): UpdatePersistentStorage failed!
Run Code Online (Sandbox Code Playgroud) flutter ×10
stream-builder ×10
dart ×5
firebase ×4
bloc ×2
stream ×2
async-await ×1
gridview ×1
pagination ×1
scoped-model ×1