我需要从Flutter的Shared Preferences小部件中获取一个URL,并将其插入Image.network小部件。这是我创建的类;
class GetSharedPrefs() {
static getCurrentNameSF() async {
String currentname;
SharedPreferences prefs = await SharedPreferences.getInstance();
currentname = prefs.getString("currentname");
print(currentname);
}
}
我试着把这个方法变成一个名为"的变量;spavatar";并将其插入到构建中;
String spavatar = GetSharedPrefs.getCurrentNameSF().toString();
插入;
icon: Image.network(
spavatar,
),
但它抛出了以下错误:
I/flutter (24368): The following _TypeError was thrown attaching to the render tree:
I/flutter (24368): type 'Future<dynamic>' is not a subtype of type 'String'
那么,我如何将函数的结果输入到需要URL的Image.network小部件中呢?或者我还有别的办法吗?
此函数必须重新启动value
,因为它是异步方法,所以它必须是Future<type>
:
class GetSharedPrefs {
static Future<String> getCurrentNameSF() async {
String currentname;
SharedPreferences prefs = await SharedPreferences.getInstance();
currentname = prefs.getString("currentname");
print(currentname);
return currentname;
}
}
现在呼叫:
String spavatar = await GetSharedPrefs.getCurrentNameSF();
getCurrentNameSF()
是async
,因此不能在类似build
的同步方法中使用它。
您可能希望将SharedPreferences实例保留为一种状态。不过,要做到这一点,您必须在initState
方法中初始化它:
SharedPreferences prefs;
@override
void initState() {
super.initState();
// anonymous async function
() async {
prefs = await SharedPreferences.getInstance();
}();
}
现在你可以做:
Image.network(prefs?.getString("currentname") ?? "alternative")
??是一个null感知运算符。如果左边的值为null,则返回右边的值
我最终使用了这两个建议。首先,将变量声明为占位符;
String currentname = "https://example.com/defaultavatar.png";
然后;
SharedPreferences prefs;
@override
void initState() {
super.initState();
() async { prefs = await SharedPreferences.getInstance();
currentname = await prefs.getString("currentname");
}();
}
然后;
Image.network(
currentname ,
height: 30,
width: 30,
),