我有一个页面,用户单击提交后会在其中创建“帖子”(例如twitter / ig),该帖子通过帖子请求发送到后端,然后页面路由到“主页”,这基本上是具有永久性底部导航栏的支架,可根据按下导航栏中的图标(索引)来创建主体。默认情况下,索引为0(第一个图标),因此显示了相应的正文,该正文还显示了用户通过执行对服务器的get请求所做的新创建的帖子。 但是问题是,除非我单击热重载,否则它不会显示帖子。类似地,如果我通过单击其中一个图标导航到其他页面并返回首页,则帖子会消失直到我再次按热重装。 如何确保每次创建正文/页面时都加载帖子?
页面上显示帖子的提示:
class PostPage extends StatefulWidget {
@override
_PostPageState createState() => _PostPageState();
}
class _PostPageState extends State<PostPage> {
ApiClient _client = ApiClient();
String session;
int userID;
var refreshKey = GlobalKey<RefreshIndicatorState>();
Future GetInfo() async{
session = await getSession("session");
print("from get info "+ session);
userID = await getUserID("userID");
print("from get info "+ userID.toString());
}
@override
void initState() {
// TODO: implement initState
super.initState();
GetInfo();
print("called");
}
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 2,
child: Scaffold(
appBar: AppBar(
title: Text("Posts", style: Style.AppBarStyle),
bottom: TabBar(
tabs: [
Tab(
text: "Text1",
),
Tab(
text: "Text2",
),
],
),
),
body: TabBarView(
children: [
Posts(_client.getPostsOne(userID, session)),
Posts(_client.getPostsTwo(userID, session)),
],
),
),
);
}
}
将来构建者的代码帖子:
Widget Posts(Future<List<Post>> future) {
return FutureBuilder<List<Post>>(
future: future,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
return Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [Color(0xFF585B8D), Color(0xFF252642)])),
child: CustomScrollView(
scrollDirection: Axis.vertical,
shrinkWrap: false,
slivers: <Widget>[
SliverPadding(
padding: const EdgeInsets.symmetric(vertical: 24.0),
sliver: SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) => PostCard(
snapshot.data[index], false, true, false),
childCount: snapshot.data.length,
),
),
)
],
));
}
if (snapshot.data == null) {
return Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [Color(0xFF585B8D), Color(0xFF252642)])),
child: Container());
}
if (snapshot.connectionState != ConnectionState.done) {
return Center(
child: CircularProgressIndicator(),
);
}
});
}
编辑似乎是在从共享首选项加载userID /会话密钥之前发出了GET请求,添加了setState({})修复了此问题,因为这导致小部件被重新绘制。现在检索到的用户ID /会话密钥。但是为了避免这种情况,我发出了两个获取请求,而不是一个,因此我在调用之前检查了会话是否为空,否则我显示了一个空容器。
session !=null?Posts(_client.getPostsOne(userID, session)):Container()
答案 0 :(得分:2)
获取数据后(用于重建小部件),您忘记了致电setState
:
Future GetInfo() async{
session = await getSession("session");
print("from get info "+ session);
userID = await getUserID("userID");
print("from get info "+ userID.toString());
setState(() {
});
}