Flutter - 數據共享,通訊,狀態管理 - 02 - ValueNotifier

1. 效果圖

經過點擊右下角的按鈕,更改 ValueNotifiervalue ,會自動觸發監聽,而後更新UIgit

2. 代碼

具體步驟已經在代碼裏面,寫好了註釋 1 、二、 3 、四、github

代碼位置: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的 切換markdown

傳送門: Flutter - 自定義插件 - 01 - zeking_refreshapp

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

點擊下面閱讀原文,用電腦看,有目錄,更舒服哦
相關文章
相關標籤/搜索