| 
									
										
										
										
											2021-10-31 17:24:55 +08:00
										 |  |  | import 'package:flutter/material.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-20 17:17:06 +08:00
										 |  |  | abstract class Comparable<T> { | 
					
						
							|  |  |  |   bool compare(T? previous, T? current); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ObjectComparable<T> extends Comparable<T> { | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   bool compare(T? previous, T? current) { | 
					
						
							|  |  |  |     return previous == current; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-31 17:24:55 +08:00
										 |  |  | class PublishNotifier<T> extends ChangeNotifier { | 
					
						
							|  |  |  |   T? _value; | 
					
						
							| 
									
										
										
										
											2022-03-20 17:17:06 +08:00
										 |  |  |   Comparable<T>? comparable = ObjectComparable(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   PublishNotifier({this.comparable}); | 
					
						
							| 
									
										
										
										
											2021-10-31 17:24:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   set value(T newValue) { | 
					
						
							| 
									
										
										
										
											2022-03-20 17:17:06 +08:00
										 |  |  |     if (comparable != null) { | 
					
						
							|  |  |  |       if (comparable!.compare(_value, newValue)) { | 
					
						
							|  |  |  |         _value = newValue; | 
					
						
							|  |  |  |         notifyListeners(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2021-11-11 19:56:30 +08:00
										 |  |  |       _value = newValue; | 
					
						
							|  |  |  |       notifyListeners(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-10-31 17:24:55 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   T? get currentValue => _value; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-30 20:54:11 +08:00
										 |  |  |   void addPublishListener(void Function(T) callback, | 
					
						
							|  |  |  |       {bool Function()? listenWhen}) { | 
					
						
							| 
									
										
										
										
											2021-11-11 19:56:30 +08:00
										 |  |  |     super.addListener( | 
					
						
							|  |  |  |       () { | 
					
						
							| 
									
										
										
										
											2022-04-16 20:20:00 +08:00
										 |  |  |         if (_value == null) { | 
					
						
							|  |  |  |           return; | 
					
						
							| 
									
										
										
										
											2022-08-31 11:15:35 +08:00
										 |  |  |         } else {} | 
					
						
							| 
									
										
										
										
											2022-04-16 20:20:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (listenWhen != null && listenWhen() == false) { | 
					
						
							|  |  |  |           return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-31 11:15:35 +08:00
										 |  |  |         callback(_value as T); | 
					
						
							| 
									
										
										
										
											2021-11-11 19:56:30 +08:00
										 |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2021-10-31 17:24:55 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | } |