【Flutter】 狀態管理 | StreamBuild 、局部刷新的效果、Flutter局部刷新


ui頁面是經常要改內容的 但是如果用setState方法去刷新 每次都會重新 Build構造一遍 會造成app卡頓 資源占用高,所以可以使用StreamBuild 去訂閱 刷新需要刷新的那個UI部件 就不用重構一遍整個頁面,除了StreamBuild以外 還有很多種方式 如谷歌的親兒子Provider ,以及第三方的Bloc ,個人覺得 bloc 使用起來比較復雜,本人喜歡StreamBuild這一種,當然 bloc 也是可以和StreamBuild組合使用的,但是小項目沒有必要 比較適合大型項目進行狀態的管理

import 'dart:async';
import 'package:flutter/material.dart';
 
class StreamBuilderPage extends StatefulWidget {
  @override
  __StreamBuilderPageState createState() => _StreamBuilderPageState();
}
 
class _StreamBuilderPageState extends State<StreamBuilderPage> {
  String _str = "我會變哦";
  //步驟1:初始化一個StreamController<可以是 int string...  一般是model> 
  final StreamController<String> _streamController = StreamController<String>();
 
  @override
  void dispose(){
  //步驟2.關流,不管流會消耗資源,同時會引起內存泄漏
    _streamController.close();
    super.dispose();
  }
 
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Stream version of the ——str App')),
      body: Center(
      //步驟3.使用StreamBuilder構造器
        child: StreamBuilder<String>(  // 監聽Stream,每次值改變的時候,更新Text中的內容
          stream: _streamController.stream,
          initialData: _str,
          builder: (BuildContext context, AsyncSnapshot<int> snapshot){
            return Text('點擊的時候這個值會改變: ${snapshot.data}');
          }
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: const Icon(Icons.add),
        onPressed: (){
          // 點擊按鈕,更改_str 的值,同時通過Sink將它發送給Stream;
          // 注入一個值時,會引起StreamBuilder的監聽,StreamBuilder重建並刷新_str
          //步驟4.往StreamBuilder里添加流,數據變了,就用通知小部件
              _str = "喝喝喝";
          _streamController.sink.add(_str);
        },
      ),
    );
  }
}

 另外 需要了解Stream的更多使用方法  可以參考這位博主的博客 https://www.jianshu.com/p/846abf65cd9b 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM