1. 效果圖
通過點選右下角的按鈕,更改 ValueNotifier
的value
,會自動觸發監聽,然後更新UI
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
會新增支援
掃一掃,關注我的微信公眾號
都是一些個人學習筆記
點選下面閱讀原文,用電腦看,有目錄,更舒服哦