页面创建时未调用异步函数

时间:2018-12-19 19:50:51

标签: dart flutter

我有一个页面,用户单击提交后会在其中创建“帖子”(例如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()

1 个答案:

答案 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(() {

          });

     }