【问题标题】:FutureBuilder always refreshFutureBuilder 总是刷新
【发布时间】:2026-01-25 15:30:01
【问题描述】:

我有一个功能可以询问你是否有令牌 apikey。但是当我试图在那里获取一些文本字段时,我无法在其中发短信(总是刷新导致我认为的未来构建器)。 下面是函数。

Future<String> getApiKey() async {
  WidgetsFlutterBinding.ensureInitialized();
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  return prefs.getString("apikey");
}
FutureBuilder<String>(
    future: getApiKey(),
    builder: (context, snapshot) {
      switch (snapshot.connectionState) {
        case ConnectionState.waiting:
          return Center(
            child: CupertinoActivityIndicator(),
          );
        default:
          if (snapshot.hasError) {
            print("has error");
            return Center(child: Text('Error: ${snapshot.error}'));
          } else if (snapshot.data == null) {
            print("not login");
            // return Container();
            return Center(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.center,
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  SvgPicture.asset("assets/image/images/nodata.svg",
                      height: 150),
                  SizedBox(height: 15),
                  Text(
                    "no data",
                    style: TextStyle(
                        color: baseColor,
                        fontSize: 18,
                        fontWeight: FontWeight.w500,
                        fontFamily: "Sofia"),
                  ),
                ],
              ),
            );
          } else {
            return FutureBuilder<List<LineUpListModel>>(
              future: prov.setLineUpList(prov),
              builder: (context, snapshot) {
                switch (snapshot.connectionState) {
                  case ConnectionState.waiting:
                    return Center(
                      child: CupertinoActivityIndicator(),
                    );
                  default:
                    if (snapshot.hasError)
                      return Center(
                          child: Text('Error: ${snapshot.error}'));
                    else if (snapshot.data == null)
                      // return Container();
                      return Center(
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.center,
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: [
                            SvgPicture.asset(
                                "assets/image/images/nodata.svg",
                                height: 150),
                            SizedBox(height: 15),
                            Text(
                              "no data",
                              style: TextStyle(
                                  color: baseColor,
                                  fontSize: 18,
                                  fontWeight: FontWeight.w500,
                                  fontFamily: "Sofia"),
                            ),
                          ],
                        ),
                      );
                    else {
                      print(prov.getMyProfileModel.apiKey.toString());
                      return TextField();
                    }
                }
              },
            );
          }
      }
    },
  ),

如何在没有来自 Futurebuilder 的刷新中断的情况下输入 TextField?我应该解决什么问题?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您可以为所有未来的构建者采用这种方法。

    Future _future;
    
    @override
    @initState() {
       _future = getApiKey();
    }
    

    现在在你的 FutureBuilder 中使用这个 _future 变量。

    FutureBuilder<String>(
        future: _future,
    

    【讨论】:

      【解决方案2】:

      问题可能来自您的future: getApiKey(),因为您没有保存未来值的实例,因此每次调用build() 方法时都会重新加载它(这种情况经常发生)。一种解决方案可能是将您的未来实例保存在一个变量中并仅对其进行一次初始化(您将需要一个StatefulWidget):

      Future<String> _futureString;
      
      @override
      void initState() {
         super.initState();
         _futureString = getApiKey();
      }
      
      @override
      Widget build(BuildContext context) {
         return FutureBuilder<String>(
            future: _futureString,
         );
      }
      

      通过这样做,_futureString 变量将保留您的异步操作的值,并且不会每次都重新加载。

      【讨论】: