0

我正在尝试在 initstate 中初始化一个变量。在我的脚手架中使用了在初始化空值之前。我如何等待一个变量然后加载构建?我正在使用 shared_preference 插件。这是我的初始化状态:

void initState() {
    super.initState();

    _createInterstitialAd();

    Future.delayed(Duration.zero, () async {
      prefs = await SharedPreferences.getInstance();

      future = Provider.of<Titles>(context, listen: false).fetchAndSetPlaces();
      identifier = await getimages();
    });

在这里,我正在检查它是否为空并且始终为空:

@override
  Widget build(BuildContext context) {
    print(prefs);
4

4 回答 4

1

为什么要在 init state 中初始化变量。在您的上下文中使用 Future Builder 并首先获取变量数据,然后您的构建将执行。

class FutureDemoPage extends StatelessWidget {



Future<String> getData() {
    return Future.delayed(Duration(seconds: 2), () {
      return "I am data";
      // throw Exception("Custom Error");
    });
  }
  
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        appBar: AppBar(
          title: Text('Future Demo Page'),
        ),
        body: FutureBuilder(
          builder: (ctx, snapshot) {
            // Checking if future is resolved or not
            if (snapshot.connectionState == ConnectionState.done) {
              // If we got an error
              if (snapshot.hasError) {
                return Center(
                  child: Text(
                    '${snapshot.error} occured',
                    style: TextStyle(fontSize: 18),
                  ),
                );
  
            // if we got our data
          } else if (snapshot.hasData) {
            // Extracting data from snapshot object
            final data = snapshot.data as String;
            return Center(
              child: Text(
                '$data',
                style: TextStyle(fontSize: 18),
              ),
            );
          }
        }

        // Displaying LoadingSpinner to indicate waiting state
        return Center(
          child: CircularProgressIndicator(),
        );
      },

      // Future that needs to be resolved
      // inorder to display something on the Canvas
      future: getData(),
    ),
  ),
);

} }

于 2022-01-05T11:24:26.587 回答
0

如果您稍后想要initialize一个变量,那么我们有late用于该目的的关键字。declaring当变量时,您可以像下面这样使用它:

late String prefs;
于 2022-01-05T11:19:14.753 回答
0

首先你要了解flutter的生命周期。我为你简单..

  1. 创建状态()
  2. 初始化状态()
  3. didChangeDependencies()
  4. 建造()
  5. 更新小部件()
  6. 设置状态()
  7. 处置()

所以每个覆盖函数都有固定的功能。例如 initState 只能用于正常初始化。它不能多次保持/等待流量。这就是为什么任何异步方法都不适用于 initState。

对于解决方案,您必须使用 FutureBuilder 等待数据或在导航到下一页之前初始化首选项然后继续。

于 2022-01-05T14:36:31.463 回答
0

我假设您有 3 个不同的条件:首先等待首选项的数据,从该首选项中获取未来的数据,然后渲染结果。

试试这个:集团模式

它基本上是应用程序 ui 的不同状态和逻辑部分的流

于 2022-01-06T03:26:48.063 回答