Flutter Stream-Builder 仅在应用程序启动时返回空白屏幕
Flutter Stream-Builder returning blank screen at app launch only
我正在学习 Flutter,我正在尝试创建一个示例待办事项应用程序来练习我目前所学的知识。
我遇到 StreamBuilder 总是显示 snapshot.data null 的问题(基本上是空白页),但仅在应用程序 首次启动 时显示,这意味着尽快当我做任何动作时,比如打开抽屉,数据出现并且不再为空。我不知道我做错了什么,所以我寻求一些帮助,以便我能理解它是怎么回事。
这是问题的截图
开机时:
image of the app at boot with only loading but has data
刚刚打开抽屉之后:
opening the drawer you see the element appearing
当然,现在我已经完成了 blah blah 和图像,这是代码,如果您需要更多,我可以提供(它也在 GitHub 上发布)
Widget _buildTodoList(BuildContext context) {
return StreamBuilder<List<Todo>>(
stream: Provider.of<ITodoRepository>(context, listen: true).watchTodos(),
builder: (context, AsyncSnapshot<List<Todo>> snapshot) {
if ((snapshot.connectionState == ConnectionState.active || snapshot.connectionState == ConnectionState.done) && snapshot.data != null) {
debugPrint("SB Initialized");
final todos = snapshot.data ?? [];
return ListView.builder(
itemCount: todos.length,
itemBuilder: (BuildContext context, int index) {
final todo = todos[index];
return Padding(
padding: const EdgeInsets.only(right: 16.0, left: 16.0),
child: SizedBox(
height: 70,
child: _buildSlidable(context, todo),
),
);
},
);
} else {
return const Center(child: CircularProgressIndicator(),);
}
},
);
}
这里是存储库:
@override
Stream<List<Todo>> watchTodos() {
return db.watchTodos().map((event) => event.map((e) => e.asTodoModel).toList());
}
这里是 Drift 数据库代码:
Stream<List<DriftTodo>> watchTodos() {
return select(driftTodos).watch();
}
我做错了什么吗?
非常感谢你
最好在 else if then return progress indicator()
中 return 出错
if (snapshot.hasData) {
return Text(snapshot.data!.title);
} else if (snapshot.hasError) {
return Text('${snapshot.error}');
}
// By default, show a loading spinner.
return const CircularProgressIndicator();
},
),
我正在学习 Flutter,我正在尝试创建一个示例待办事项应用程序来练习我目前所学的知识。
我遇到 StreamBuilder 总是显示 snapshot.data null 的问题(基本上是空白页),但仅在应用程序 首次启动 时显示,这意味着尽快当我做任何动作时,比如打开抽屉,数据出现并且不再为空。我不知道我做错了什么,所以我寻求一些帮助,以便我能理解它是怎么回事。
这是问题的截图
开机时: image of the app at boot with only loading but has data
刚刚打开抽屉之后: opening the drawer you see the element appearing
当然,现在我已经完成了 blah blah 和图像,这是代码,如果您需要更多,我可以提供(它也在 GitHub 上发布)
Widget _buildTodoList(BuildContext context) {
return StreamBuilder<List<Todo>>(
stream: Provider.of<ITodoRepository>(context, listen: true).watchTodos(),
builder: (context, AsyncSnapshot<List<Todo>> snapshot) {
if ((snapshot.connectionState == ConnectionState.active || snapshot.connectionState == ConnectionState.done) && snapshot.data != null) {
debugPrint("SB Initialized");
final todos = snapshot.data ?? [];
return ListView.builder(
itemCount: todos.length,
itemBuilder: (BuildContext context, int index) {
final todo = todos[index];
return Padding(
padding: const EdgeInsets.only(right: 16.0, left: 16.0),
child: SizedBox(
height: 70,
child: _buildSlidable(context, todo),
),
);
},
);
} else {
return const Center(child: CircularProgressIndicator(),);
}
},
);
}
这里是存储库:
@override
Stream<List<Todo>> watchTodos() {
return db.watchTodos().map((event) => event.map((e) => e.asTodoModel).toList());
}
这里是 Drift 数据库代码:
Stream<List<DriftTodo>> watchTodos() {
return select(driftTodos).watch();
}
我做错了什么吗? 非常感谢你
最好在 else if then return progress indicator()
中 return 出错 if (snapshot.hasData) {
return Text(snapshot.data!.title);
} else if (snapshot.hasError) {
return Text('${snapshot.error}');
}
// By default, show a loading spinner.
return const CircularProgressIndicator();
},
),