Bootstrap

Flutter学习案例分享-Steram简单使用

案例简介

在项目中使用Stream在容器内循环更新颜色,本示例中使用Container来填充页面,并使用async和yield语句。

创建项目 

  1. 首先在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上运行程序

 

 

 

;