gpt4 book ai didi

Flutter - 在 FutureBuilder 完成之前,页面似乎不会推送

转载 作者:行者123 更新时间:2023-12-05 08:05:01 26 4
gpt4 key购买 nike

我有一个显示项目列表的页面。单击上一页的按钮可到达此页面。检索完成后,我使用 FutureBuilder 填充项目列表。当 ConnectionState 处于“等待”状态时,我会显示一个循环进度指示器。但是,在 FutureBuilder 完成之前,进度指示器永远不会出现,并且列表页面似乎不会推送。如果我在“if (snapshot.connectionState == ConnectionState.waiting)” block 中放置一个断点,它会命中该断点,但返回时屏幕不会改变。屏幕确实按预期出现,但随着项目列表的增加,屏幕出现的时间越来越长。我在这里遗漏了什么吗:

class MyListScreen extends StatelessWidget {
RelevantObject relevantObject;

MyListScreen(this.relevantObject, {Key key}) : super(key: key);

@override
Widget build(BuildContext context) {
final bloc = MyListBloc(relevantObject);

return FutureBuilder<Widget>(
future: _buildList(bloc, context),
builder: (BuildContext context, AsyncSnapshot<Widget> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Scaffold(
appBar: AppBar(
centerTitle: false,
title: Text(
"My Title",
),
),
body: Center(child: CircularProgressIndicator()),
);
} else {
return BlocProvider<MyListBloc>(
bloc: bloc, child: snapshot.data);
}
},
);
}

Future<Widget> _buildList(
MyListBloc bloc, BuildContext myContext) async {
//await bloc.init();
List<Widget> listView = await bloc.getListItems(myContext);
return StreamBuilder<List<MyListItem>>(
stream: bloc.drawingCanvasListStream,
builder: (context, snapshot) {
return Scaffold(
appBar: AppBar(
title: Text('My Title'),
centerTitle: false,
),
body: SingleChildScrollView(
child: Column(mainAxisSize: MainAxisSize.min, children: listView),
),
);
});
}
}

更新:

我改变了我的方法并试图让它更简单一些。这是我更新的“列表屏幕”。

class MyListScreen extends StatefulWidget{

final bloc = MyListBloc();
@override
_MyListState createState() => _MyListState();

}

class _MyListState extends State<MyListScreen>{
@override
void initState() {
widget.bloc.getListItems(context);
super.initState();
}

@override
Widget build(BuildContext context) {
// TODO: implement build
return StreamBuilder<List<Widget>>(
stream: widget.bloc.myListStream,
builder: (context, snapshot) {
return Scaffold(
appBar: AppBar(
title: Text('My App'),
centerTitle: false,
),
body:
SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min, children: snapshot.data == null ? [Center(child: CircularProgressIndicator())] :
snapshot.data
)
,
),
);

});
}
}

MyListBloc 类有一个 Stream of List ,它最初是一个空列表。当 getListItems 完成时,它会将这些小部件添加到流中。在异步 getListItems 完成之前,MyListScreen 仍然没有显示。希望这个新代码能让我更容易指出我的误解。

更新 2:

我也试过了,没用:

import 'package:flutter/material.dart';

class MyListScreen extends StatefulWidget{

final bloc = MyListBloc();
@override
_MyListState createState() => _MyListState();

}

class _MyListState extends State<MyListScreen>{
@override
void initState() {
widget.bloc.getListItems(context);
super.initState();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('My App'),
centerTitle: false,
),
body: StreamBuilder<List<Widget>>(
stream: widget.bloc.myListStream,
builder: (context, snapshot) {
if(snapshot.connectionState == ConnectionState.waiting){
return Center(child: CircularProgressIndicator());
}
else {
return SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min, children: snapshot.data
)
,
);
}
})
);
}
}

widget.bloc.getListItems(context) 是我不等待的异步方法。然而,屏幕仍然没有出现,直到 snapshot.data != null。

最佳答案

试试这个以获得数据的正确状态。

  switch(snapshot.connectionState){
case ConnectionState.none:
return Text('none');
case ConnectionState.active:
case ConnectionState.waiting:
return Text('Active and may be waiting');
case ConnectionState.done:
return Text('Done');
default:
return Text('Default');
}

关于Flutter - 在 FutureBuilder 完成之前,页面似乎不会推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66321872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com