經過點擊右下角的按鈕,更改 ValueNotifier
的value
,會自動觸發監聽,而後更新UI
git
具體步驟已經在代碼裏面,寫好了註釋 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';
}),
);
}
}
複製代碼
目前我寫的ZekingRefresh
就是經過ValueNotifier
來作UI
的 切換markdown
傳送門: Flutter - 自定義插件 - 01 - zeking_refreshapp