案例简介
在项目中使用Stream在容器内循环更新颜色,本示例中使用Container来填充页面,并使用async和yield语句。
创建项目
-
首先在lib目录下创建一个stream.dart文件
import 'package:flutter/material.dart';
class MyColorStream {
final List<Color> colors = [
Colors.red,
Colors.blue,
Colors.green,
Colors.yellow,
Colors.orange,
Colors.purple,
Colors.pink,
Colors.cyan,
];
Stream<Color> getColor() async* {
//这里我们设置每2秒更新
yield* Stream.periodic(const Duration(seconds: 2), (int t) {
int index = t % colors.length;
return colors[index];
});
}
}
-
在main.dart文件中创建stream页面
-
在state类中添加一个changeColor的方法用来监听MyColorStream中的getColor并更新_color
- initState方法中初始化MyColorStream,并调用changeColor
-
最后在build中读取_color更新Container
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Stream Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: const StreamHomePage(),
);
}
}
class StreamHomePage extends StatefulWidget {
const StreamHomePage({super.key});
@override
State<StreamHomePage> createState() => _StreamHomePageState();
}
class _StreamHomePageState extends State<StreamHomePage> {
Color _color = Colors.red;
late MyColorStream _stream;
void changeColor() async {
await for (var eventColor in _stream.getColor()) {
setState(() {
_color = eventColor;
});
}
}
@override
void initState() {
super.initState();
_stream = MyColorStream();
changeColor();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Stream Demo'),
),
body: Container(
decoration: BoxDecoration(
color: _color,
),
),
);
}
}
-
在stream.dart中我们使用了async,并使用yield返回,可以把它看作是一个return但它不会结束函数,它的返回方式是每接收一个值就会马上返回,这样会更快。
在IOS上运行程序