如何自定义pagefacade的数据转换逻辑?go语言
2026/5/7 8:49:04
// 定义状态模型 class CounterModel extends ChangeNotifier { int _count = 0; int get count => _count; void increment() { _count++; notifyListeners(); } void decrement() { _count--; notifyListeners(); } } // 提供状态 void main() { runApp( ChangeNotifierProvider( create: (context) => CounterModel(), child: MyApp(), ), ); } // 消费状态 class CounterWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Consumer<CounterModel>( builder: (context, counter, child) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Count: ${counter.count}'), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton( onPressed: counter.decrement, child: Text('-'), ), SizedBox(width: 20), ElevatedButton( onPressed: counter.increment, child: Text('+'), ), ], ), ], ); }, ); } }// 定义状态提供者 final counterProvider = StateNotifierProvider<CounterNotifier, int>((ref) { return CounterNotifier(); }); // 状态通知器 class CounterNotifier extends StateNotifier<int> { CounterNotifier() : super(0); void increment() { state++; } void decrement() { state--; } } // 消费状态 class CounterWidget extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final count = ref.watch(counterProvider); final counterNotifier = ref.read(counterProvider.notifier); return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Count: $count'), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton( onPressed: counterNotifier.decrement, child: Text('-'), ), SizedBox(width: 20), ElevatedButton( onPressed: counterNotifier.increment, child: Text('+'), ), ], ), ], ); } }// 定义事件 abstract class CounterEvent {} class IncrementEvent extends CounterEvent {} class DecrementEvent extends CounterEvent {} // 定义状态 class CounterState { final int count; CounterState(this.count); } // 定义Bloc class CounterBloc extends Bloc<CounterEvent, CounterState> { CounterBloc() : super(CounterState(0)) { on<IncrementEvent>((event, emit) { emit(CounterState(state.count + 1)); }); on<DecrementEvent>((event, emit) { emit(CounterState(state.count - 1)); }); } } // 提供Bloc class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return BlocProvider( create: (context) => CounterBloc(), child: MaterialApp( home: CounterPage(), ), ); } } // 消费Bloc class CounterPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Counter')), body: BlocBuilder<CounterBloc, CounterState>( builder: (context, state) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Count: ${state.count}'), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton( onPressed: () => context.read<CounterBloc>().add(DecrementEvent()), child: Text('-'), ), SizedBox(width: 20), ElevatedButton( onPressed: () => context.read<CounterBloc>().add(IncrementEvent()), child: Text('+'), ), ], ), ], ); }, ), ); } }// 定义控制器 class CounterController extends GetxController { var count = 0.obs; void increment() { count++; } void decrement() { count--; } } // 提供控制器 class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return GetMaterialApp( home: CounterPage(), ); } } // 消费控制器 class CounterPage extends StatelessWidget { final CounterController controller = Get.put(CounterController()); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Counter')), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Obx(() => Text('Count: ${controller.count}')), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton( onPressed: controller.decrement, child: Text('-'), ), SizedBox(width: 20), ElevatedButton( onPressed: controller.increment, child: Text('+'), ), ], ), ], ), ), ); } }// 使用FutureProvider final userProvider = FutureProvider<User>((ref) async { final userService = ref.watch(userServiceProvider); return userService.fetchUser(); }); // 消费异步状态 class UserWidget extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final userAsyncValue = ref.watch(userProvider); return userAsyncValue.when( loading: () => CircularProgressIndicator(), error: (error, stack) => Text('Error: $error'), data: (user) => Text('User: ${user.name}'), ); } } // 使用StreamProvider final counterStreamProvider = StreamProvider<int>((ref) { return Stream.periodic(Duration(seconds: 1), (i) => i); }); // 消费流状态 class StreamCounterWidget extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final counterAsyncValue = ref.watch(counterStreamProvider); return counterAsyncValue.when( loading: () => CircularProgressIndicator(), error: (error, stack) => Text('Error: $error'), data: (counter) => Text('Counter: $counter'), ); } }// 使用shared_preferences class CounterModel extends ChangeNotifier { int _count = 0; final SharedPreferences _prefs; CounterModel(this._prefs) { _loadCount(); } int get count => _count; void increment() { _count++; _saveCount(); notifyListeners(); } void decrement() { _count--; _saveCount(); notifyListeners(); } void _loadCount() { _count = _prefs.getInt('count') ?? 0; } void _saveCount() { _prefs.setInt('count', _count); } } // 提供带持久化的状态 void main() async { WidgetsFlutterBinding.ensureInitialized(); final prefs = await SharedPreferences.getInstance(); runApp( ChangeNotifierProvider( create: (context) => CounterModel(prefs), child: MyApp(), ), ); }// 产品状态 final productsProvider = FutureProvider<List<Product>>((ref) async { final productService = ref.watch(productServiceProvider); return productService.fetchProducts(); }); // 购物车状态 final cartProvider = StateNotifierProvider<CartNotifier, List<CartItem>>((ref) { return CartNotifier(); }); class CartNotifier extends StateNotifier<List<CartItem>> { CartNotifier() : super([]); void addToCart(Product product) { final existingItemIndex = state.indexWhere((item) => item.product.id == product.id); if (existingItemIndex >= 0) { // 增加数量 final updatedCart = [...state]; updatedCart[existingItemIndex] = CartItem( product: product, quantity: updatedCart[existingItemIndex].quantity + 1, ); state = updatedCart; } else { // 添加新商品 state = [...state, CartItem(product: product, quantity: 1)]; } } void removeFromCart(String productId) { state = state.where((item) => item.product.id != productId).toList(); } void updateQuantity(String productId, int quantity) { state = state.map((item) { if (item.product.id == productId) { return CartItem(product: item.product, quantity: quantity); } return item; }).toList(); } double get totalPrice { return state.fold(0, (sum, item) => sum + item.product.price * item.quantity); } } // 订单状态 final orderProvider = StateNotifierProvider<OrderNotifier, List<Order>>((ref) { return OrderNotifier(ref); }); class OrderNotifier extends StateNotifier<List<Order>> { final WidgetRef ref; OrderNotifier(this.ref) : super([]); void placeOrder() { final cartItems = ref.read(cartProvider); final totalPrice = ref.read(cartProvider.notifier).totalPrice; final order = Order( id: DateTime.now().toString(), items: cartItems, totalPrice: totalPrice, status: 'pending', ); state = [...state, order]; // 清空购物车 ref.read(cartProvider.notifier).clearCart(); } }// 用户状态 final userProvider = StateNotifierProvider<UserNotifier, User?>((ref) { return UserNotifier(); }); class UserNotifier extends StateNotifier<User?> { UserNotifier() : super(null); void login(String email, String password) { // 模拟登录 state = User(id: '1', name: 'John Doe', email: email); } void logout() { state = null; } } // 帖子状态 final postsProvider = FutureProvider<List<Post>>((ref) async { final postService = ref.watch(postServiceProvider); return postService.fetchPosts(); }); // 评论状态 final commentsProvider = FutureProvider.family<List<Comment>, String>((ref, postId) async { final commentService = ref.watch(commentServiceProvider); return commentService.fetchComments(postId); }); // 点赞状态 final likesProvider = StateNotifierProvider<LikesNotifier, Set<String>>((ref) { return LikesNotifier(); }); class LikesNotifier extends StateNotifier<Set<String>> { LikesNotifier() : super({}); void toggleLike(String postId) { if (state.contains(postId)) { state = state.where((id) => id != postId).toSet(); } else { state = {...state, postId}; } } bool isLiked(String postId) { return state.contains(postId); } }Flutter状态管理的高级技巧包括:
通过掌握这些技巧,你可以创建出更加可维护、可扩展的Flutter应用,提升开发效率和用户体验。