在颤振中构建之前初始化变量?

initializing variables before build in flutter?

我正在尝试在 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);

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

late String prefs;

为什么要在初始状态初始化变量。 在您的上下文中使用 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(),
    ),
  ),
);

} }

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

  1. 创建状态()
  2. initState()
  3. didChangeDependencies()
  4. 构建()
  5. didUpdateWidget()
  6. setState()
  7. 处置()

所以每个覆盖函数都有固定的功能。例如 initState 只能用于正常初始化。不能hold/await流几次。这就是为什么任何异步方法在 initState 中都不适用的原因。

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

我假设您有 3 种不同的情况: 首先等待首选项的数据, 从该首选项中获取未来数据, 并渲染结果。

试试这个:bloc pattern

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