当前位置: 首页 > 知识库问答 >
问题:

使用颤振和飞镖,我怎样才能让这个未来发挥作用?

商兴朝
2023-03-14

我知道还有其他方法可以实现这一点,但我想通过initState()使用Future来使用SharedPreVP获取List。下面说明了我想要实现的目标,但它不能按要求工作,因为Future在完成任务之前立即返回

这应该如何组织?


import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class _MyHomePageState extends State<MyHomePage> {
  SharedPreferences _prefs;
  String _sMessage = "No response from getting params";
  List<String> _lsCategories;

  @override
  void initState() {
    super.initState();
    _initPreferences().then((_) {
      try {
        _lsCategories = _prefs.getStringList("categories") ?? [];
        debugPrint("Categories = $_lsCategories");
        _sMessage = "Categories loaded OK";
      } catch (vError) {
        _sMessage = ("Error loading categories = $vError");
      }
      setState(() {});
    });
  }

  Future<void> _initPreferences() async {
    SharedPreferences.getInstance().then((prefs) {
      _prefs = prefs;
      debugPrint("Preferences initialized OK");
    }).catchError((vError) {
      debugPrint("Error initializing preferences = ${vError.toString()}");
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(_sMessage,
                style: TextStyle(
                    color: Colors.red[500],
                    fontWeight: FontWeight.bold,
                    fontSize: 20)),
          ],
        ),
      ),
    );
  }
}

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Future Test',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: "Flutter Future Test"),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState();
}


共有2个答案

龙景澄
2023-03-14

试试吧。

Future<void> _initPreferences() async {
    _prefs = await SharedPreferences.getInstance().catchError((vError) { 
          debugPrint("Error initializing preferences = ${vError.toString()}");
    };
    debugPrint("Preferences initialized OK");
}
阴靖
2023-03-14

\u initPreferences方法更改为以下内容:

Future<void> _initPreferences() async {
  try {
    final prefs = await SharedPreferences.getInstance();
    _prefs = prefs;
    debugPrint("Preferences initialized OK");
  } catch (e) {
    debugPrint("Error initializing preferences = ${e.toString()}");
  }
}

问题是在Future上使用. then()时,您不是在等待该未来完成,而是使用wait确实在等待。

 类似资料:
  • [![Plugins installed][1][1]我已经在android studio中安装了这些插件,并将C:\flatter\bin添加到系统环境变量中,但当我在PowerShell中运行flatter doctor时,它显示这些插件没有安装。我用的是Windows操作系统。

  • 在flutter示例页面中,有一个名为“将数据发送到新屏幕”的项目。我对第65行的构造函数有一个重新保护的问题。

  • 我已经在我的服务器上创建了一个RSA密钥对,只有服务器才会有私钥。客户端(Flatter应用程序)将访问公钥。因此,当服务器收到加密消息时,它将知道消息来自正确的客户端,并将使用其私钥解密通过公钥加密的消息。 当服务器(php7.3)向客户端发送回复时,我想在服务器端通过私钥加密消息,以便客户端可以用公钥解密消息。 非对称加密有其自身的局限性,如最大字符长度。但如果能送来就好了 Flutter包加

  • 我对flutter和dart非常陌生,正在尝试使用全局状态的单例实例(?).这是从后端服务器获得的公司信息。当flutter app启动时,向服务器发送请求并获得响应,然后基于响应构建一个singleton实例。所以我创造了阶级 在main.dart中 我做错了什么?

  • 有什么方法可以简化这段代码吗?我正好有一个白色的一块,想要得到它的位置 代码: 瓦片类: 件类:

  • 我试图改变从API返回的日期字符串的格式。下面的日期格式输入字符串在java中工作正常,但在Dart中则不行。