flutter - Flutter:如何在多个类中使用函数结果作为var而不重复函数
问题描述
我使用多次获取从 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!”。当我从 中删除content = "test1";
时apiStart()
,返回“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();
},
);
}
}
解决方案
您可以使用单例模式来创建服务类:它使您可以从代码中的任何位置访问此类。
不要过度使用它,因为它会变成一个非常混乱的全局变量,就像缺乏封装一样。
注意:这是一个巨大的简化,但会起作用。阅读 aroudn 单例和服务以了解更多信息。
class ApiService {
// next 5 lines is a typical singleton pattern
static ApiService _singleton;
factory ApiService() {
return _singleton ??= new ApiService._internal();
}
ApiService._internal();
//here you'll keep your data
List<dynamic> pageIds, pages; //store your data in these variables
//run this on the beginning of your app to get your data. Don't forget this!
void apiStart() async {
// your code here where you hit the API and get all your data,
// eg methods getPageIdsFromAPI and getPagesDataFromAPI that you need to write. They return your data
// pageIds = getPageIdsFromAPI();
// pages = getPagesDataFromAPI();
}
}
然后从代码中的任何地方,您都可以访问此类中的变量和函数
ApiService().pageIds
ApiService().pageIds.length
ApiService().pageIds.contains(some_id)
- -编辑 - -
您需要决定等待何时发生。要么在显示屏幕之前等待数据,要么以空/等待模式(就像 facebook 那样)显示屏幕,然后等待。
做第二个:
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) {
futureContent = await AppData().body();
setState(() {
// refresh whatever changed. it's a good practice to specify what
});
});
}
推荐阅读
- python - 如何打印给定特征的类别出现次数?
- angular - TypeError:无法读取茉莉花单元测试用例中未定义的属性“nativeElement”
- python - 如何在 python 警告模块中抑制堆栈级别
- python-3.x - 如何使用 python 刷新一个 http GET 请求
- python - 使用 python ftplib 下载但得到 ConnectionRefusedError: [Errno 111] Connection denied
- node.js - 是什么导致我的电报机器人出现此 404 错误
- python - SQLite executemany 要求比预期更多的值
- matlab - 在Matlab大纲条中使用不同颜色的条非常宽
- amazon-web-services - aws 自动缩放组,缩小条件
- python - 来自两个数据框的两行的产品总和并将总和添加到新列