Flutter - 資料共享,通訊,狀態管理 - 02 - ValueNotifier

_樟清_發表於2019-09-07

1. 效果圖

通過點選右下角的按鈕,更改 ValueNotifiervalue ,會自動觸發監聽,然後更新UI

Flutter - 資料共享,通訊,狀態管理 - 02 -  ValueNotifier

2. 程式碼

具體步驟已經在程式碼裡面,寫好了註釋 1 、2、 3 、4、

程式碼位置:github.com/LZQL/flutte…

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'ValueNotifier通訊',
      home: ValueNotifierCommunication(),
    );
  }
}

/// ValueNotifier通訊
///
/// ValueNotifier是一個包含單個值的變更通知器,當它的值改變的時候,會通知它的監聽。

/// 1. 定義ValueNotifierData類,繼承ValueNotifier
class ValueNotifierData extends ValueNotifier<String> {
  ValueNotifierData(value) : super(value);
}

/// 2. 定義_WidgetOne,包含一個ValueNotifierData的例項。
class _WidgetOne extends StatefulWidget {
  _WidgetOne({this.data});

  final ValueNotifierData data;

  @override
  _WidgetOneState createState() => _WidgetOneState();
}

/// 3. _WidgetOneState中給ValueNotifierData例項新增監聽。
class _WidgetOneState extends State<_WidgetOne> {
  String info;

  @override
  initState() {
    super.initState();
    // 監聽 value 的變化,會觸發
    widget.data.addListener(_handleValueChanged);
    info = 'Initial mesage: ' + widget.data.value;
  }

  void _handleValueChanged() {
    setState(() {
      info = 'Message changed to: ' + widget.data.value;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(info),
    );
  }

  @override
  dispose() {
    widget.data.removeListener(_handleValueChanged);
    super.dispose();
  }
}

/// 4. 在ValueNotifierCommunication元件中例項化_WidgetOne,
/// 可以通過改變ValueNotifierData例項的value來觸發_WidgetOneState的更新。
class ValueNotifierCommunication extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    ValueNotifierData vd = ValueNotifierData('Hello World');
    return Scaffold(
      appBar: AppBar(
        title: Text('ValueNotifier通訊'),
      ),
      body: _WidgetOne(data: vd),
      floatingActionButton: FloatingActionButton(
          child: Icon(Icons.refresh),
          onPressed: () {
            vd.value = 'Yes';
          }),
    );
  }
}

複製程式碼

3. 實際應用

目前我寫的ZekingRefresh 就是通過ValueNotifier來做UI的 切換

傳送門: Flutter - 自定義外掛 - 01 - zeking_refresh

不好意思的是現在,example目前還沒寫完整,後面我會抽時間 把demo寫完整的,而且現在不支援 自定義 下拉重新整理頭,後面,寫了動畫相關的demo 會新增支援

掃一掃,關注我的微信公眾號
都是一些個人學習筆記

Flutter - 資料共享,通訊,狀態管理 - 02 -  ValueNotifier

點選下面閱讀原文,用電腦看,有目錄,更舒服哦

相關文章