代码之家  ›  专栏  ›  技术社区  ›  Dolly Storey

Flutter:在FutureBuilder内部导航

  •  0
  • Dolly Storey  · 技术社区  · 2 年前

    如何转到Futurebuilder的下一个屏幕? 基本上,条件是: 如果快照没有数据,[return CircularProgressIndicator()] 否则,如果'keyword'='target',请转到NextScreen, else返回[ListView.builder]

         body: FutureBuilder(
              future: generatedText,
              builder: (BuildContext context, AsyncSnapshot snapshot) {
                if (snapshot.data == null) {
                  return const CircularProgressIndicator();
                } else if (widget.keyword == 'target') {
                  // Go to NextScreen instead of 'ListView.builder'
                  Navigator.push(context, MaterialPageRoute(builder: (context) => NextScreen(text: snapshot.data[7]), ),
                  );
                } else {
                  return ListView.builder(
                    itemCount: snapshot.data.length,
                    itemBuilder: (BuildContext context, int index) {
                      return InkWell(onTap: () {
                          Navigator.push(context, MaterialPageRoute(builder: (context) => NextScreen(text: snapshot.data[index]),),
                          );
                        },
                        child: Text(snapshot.data[index],
                        ),
                      ); },
                  );
                }  },  ),    
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Adhnan Eriyadan    2 年前

    要计划在当前帧完成渲染后在后续帧上执行的回调,请使用 小工具Binding.instance.addPostFrameCallback Flutter上下文中的帧是应用程序的整个渲染周期,在此期间,框架通过计算布局、绘制小部件和执行其他操作来更新用户界面。

    body: FutureBuilder(
      future: generatedText,
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          // Show a loading indicator while waiting for the data
          return CircularProgressIndicator();
        } else if (snapshot.hasError) {
          // Handle error state
          return Text('Error: ${snapshot.error}');
        } else if (widget.keyword == 'target') {
          // Use Navigator.pushReplacement to go to NextScreen instead of 'ListView.builder'
          WidgetsBinding.instance.addPostFrameCallback((_) {
            Navigator.pushReplacement(
              context,
              MaterialPageRoute(
                builder: (context) => NextScreen(text: snapshot.data[7]),
              ),
            );
          });
          return Container(); // Return an empty container while navigating
        } else {
          return ListView.builder(
            itemCount: snapshot.data.length,
            itemBuilder: (BuildContext context, int index) {
              return InkWell(
                onTap: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => NextScreen(text: snapshot.data[index]),
                    ),
                  );
                },
                child: Text(snapshot.data[index]),
              );
            },
          );
        }
      },
    ),

    试试这个代码,让我知道

    推荐文章