Starlight Sync
如果你想将 Future 用作 Stream,并想使用该结果多次调用一个方法,你可以使用此包。
特点
| 名称 | 状态 |
|---|---|
| execute | ✅ |
| repeat | ✅ |
预览
安装
将 starlight_sync 添加到您的 pubspec 文件作为依赖项。
starlight_sync:
git:
url: https://github.com/YeMyoAung/starlight_sync.git
设置
Android 和 iOS 不需要额外的集成步骤。
用法
首先,您需要导入我们的包。
import 'package:starlight_sync/starlight_sync.dart';
然后您就可以轻松使用了。
注册一个进程
StarlightSync.register(id:"process 1");
终止一个进程
StarlightSync.terminate(id:"process 1");
终止所有进程
StarlightSync.terminateAll();
执行一个Future
StarlightSync.register(id:"process 1");
StarlightSync.stream(id:"process 1").listen((event){
print("future stream is ${event['body']}");
});
Timer.periodic(Duration(seconds:1), (){
StarlightSync.execute(id:"process 1",task:()async{
await http.get('/get/random-images');
})
});
使用该结果再执行一次 Future
StarlightSync.register<String?, ResponseModel>(id: 'all user');
int i = 0;
StarlightSync.stream<String?, ResponseModel>(id: 'all user')
.listen((event) {
i += (event.body['users'] as List).length;
print("listen body ${event.body}");
print("listen data is $i");
});
StarlightSync.repeat<String?, ResponseModel>(
id: 'all user',
next: (result) => result.body['next_page'],
stop: (next) => next == null,
task: ([next]) async {
return appInstance<ApiService>().getMethod(
query: "/get/users/$next",
);
},
);
示例
import 'dart:convert';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:starlight_sync/starlight_sync.dart';
import 'package:http/http.dart' as http;
import 'package:starlight_utils/starlight_utils.dart';
void main(){
StarlightSync.register(id: "dog.ceo");
StarlightSync.register(id: "dog.ceo/repeat");
runApp(MaterialApp(home:ExecuteExampleScreen()));
}
class ExecuteExampleScreen extends StatelessWidget {
const ExecuteExampleScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("StarlightSync.execute Method"),
actions: [
IconButton(
onPressed: () {
StarlightUtils.push(RepeatExampleScreen());
},
icon: Icon(Icons.arrow_circle_right_outlined))
],
),
body: Center(
child: StreamBuilder(
stream: StarlightSync.stream(id: 'dog.ceo'),
builder: (_, AsyncSnapshot snap) {
if (snap.connectionState == ConnectionState.waiting)
return Text("Waiting a Future....");
if (snap.hasError) return Icon(Icons.error);
return CachedNetworkImage(
imageUrl: jsonDecode(snap.data!.body)["message"],
placeholder: (_, e) => CircularProgressIndicator(),
);
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
StarlightSync.execute(
id: 'dog.ceo',
task: () async => http.get(
Uri.parse('https://dog.ceo/api/breeds/image/random'),
),
);
},
child: Icon(Icons.refresh),
),
);
}
}
class RepeatExampleScreen extends StatelessWidget {
const RepeatExampleScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("StarlightSync.repeat Method"),
),
body: Center(
child: StreamBuilder(
stream: StarlightSync.stream(id: 'dog.ceo/repeat'),
builder: (_, AsyncSnapshot snap) {
if (snap.connectionState == ConnectionState.waiting)
return Text("Wating For a Future ");
if (snap.hasError) return Icon(Icons.error);
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"Execute Last Value is ${StarlightSync.last(id: 'dog.ceo')?.body}",
),
SizedBox(
height: 20,
),
Expanded(
child: CachedNetworkImage(
imageUrl: jsonDecode(snap.data!.body)["message"],
placeholder: (_, e) =>
Center(child: CircularProgressIndicator()),
),
),
],
);
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
StarlightSync.repeat(
id: 'dog.ceo/repeat',
next: (result) => result,
stop: (index) => index == 10,
task: ([_]) async => http.get(
Uri.parse(
'https://dog.ceo/api/breeds/image/random',
),
),
delay: Duration(seconds: 3),
);
},
child: Icon(Icons.play_arrow),
),
);
}
}