【发布时间】:2020-03-18 20:32:54
【问题描述】:
我使用多次获取从 API 获取一些页面和相关内容。
这里,getClass() 和 getValue() 从另一个类调用 API,返回未来。
List<dynamic> pIds, ps;
apiStart() async {
pageIds = new List();
siteCls = await _baseApi.getClass(siteCName);
siteCId = siteCls.data.classId.toString();
pageCls = await _baseApi.getClass(pageCName);
pageCId = pageCls.data.classId.toString();
siteIns = await _baseApi.getValue(siteCId);
pageIns = await _baseApi.getValue(pageCId);
pageIds = getPageIds();
pages = getPagesData();
}
List getPageIds() {
//Doing some work here
return pIds;
}
List getPagesData() {
//Doing some work here
return ps;
}
现在我想从其他/多个类访问变量,如“页面”,而不重复这些函数。我该怎么做?
更新:
这是一个示例代码。它返回“欢迎 test1!”。当我从apiStart() 中删除content = "test1"; 时,返回“welcome h!”。使用await 有什么问题吗?
class AppData {
factory AppData() {
return _singleton;
}
static final AppData _singleton = AppData._internal();
AppData._internal() {
print("Instance created App-Data");
}
BaseApi _baseApi = new BaseApi();
var content = "hi";
Future body() {
return Future.value(content);
}
void apiStart() async{
content = "test1";//OK when I put content here
print(content);
_ids = await _baseApi.fetchIds();
//Does not change when I put content here
//I need to use await because I need ids for next function
content = "test2";
print(content);
//Doing some work with result and get ids as list
List id = idList();
_pages = await _baseApi.fetchPages(id[0]);
//Doing some work with result and get page content
contents = contentList();
}
}
如果我执行以下操作,它会返回“test2”。但我不知道如何检查工作是否完成;我应该在函数末尾添加一个布尔变量并每秒钟检查一次吗?那效率高吗?
Future body() {
return Future.delayed(Duration(seconds: 10)).then((value) => content);
}
我在哪里运行单例
void main() {
runApp(MyApp());
AppData().apiStart();
}
我这样展示部分结果:
class ContentWidget extends StatefulWidget {
ContentWidget({Key key}) : super(key: key);
@override
_ContentWidgetState createState() => _ContentWidgetState();
}
class _ContentWidgetState extends State<ContentWidget> {
Future<dynamic> futureContent;
@override
void initState() {
super.initState();
futureContent = AppData().body();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<dynamic>(
future: futureContent,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text("Welcome ${snapshot.data}!", style: plainTextStyle);
} else {
//return Text("Welcome ${snapshot.error}!", style: plainTextStyle);
}
// By default, show a loading spinner.
return CircularProgressIndicator();
},
);
}
}
【问题讨论】:
标签: flutter dart async-await future