FutureBuilder 总是刷新

时间:2021-01-14 09:24:26

标签: flutter dart

我有一个功能来询问你是否有令牌 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?我应该修复什么?

2 个答案:

答案 0 :(得分:0)

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

Future _future;

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

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

FutureBuilder<String>(
    future: _future,

答案 1 :(得分:0)

问题可能来自您的 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 变量将保留异步操作的值,并且不会每次都重新加载。