Flutter中ChangeNotifierProvider示例是否存在反模式?
你的ChangeNotifier实现的反模式问题说明
你的代码整体逻辑通顺、能正常运行,但确实存在两个和ChangeNotifier使用相关的反模式问题:
直接访问私有成员变量
你在UI层的Text组件里直接调用了model._mydata,_mydata是类的私有成员,外部直接访问破坏了封装性。一旦未来需要修改数据的计算逻辑(比如给数值加固定基数),你就得修改所有引用_mydata的UI代码,维护成本会大幅提升。正确的做法是给私有变量添加公共getter方法。(潜在问题)不必要的多次
notifyListeners调用
当前的increment和decrement方法里每次修改都调用notifyListeners是没问题的,但如果以后需要批量修改数据(比如一次做多个数值调整),不要每修改一次就调用一次notifyListeners,应该在所有修改完成后统一调用,避免触发多次不必要的UI重绘。
修正后的代码示例
import 'package:flutter/material.dart'; import 'package:provider.dart'; void main() { runApp( ChangeNotifierProvider( create: (context) => MyModel(), child: const MainApp(), ), ); } class MainApp extends StatelessWidget { const MainApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Center( child: Consumer<MyModel>( builder: (context, model, child) => Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // 使用公共getter访问数据 Text('Total price: ${model.count}'), const SizedBox(height: 16), ElevatedButton( onPressed: model.increment, child: const Text("Add"), ), const SizedBox(height: 8), ElevatedButton( onPressed: model.decrement, child: const Text("Minus"), ) ], ), ), ), ), ); } } class MyModel extends ChangeNotifier { var _count = 0; // 公共getter暴露数据 int get count => _count; void increment() { _count++; notifyListeners(); } void decrement() { _count--; notifyListeners(); } // 示例:批量操作时统一调用notifyListeners void batchUpdate() { _count += 5; _count *= 2; // 只调用一次,避免多次重绘 notifyListeners(); } }
额外小建议:把_mydata改成更具语义的名字(比如_count),能大幅提升代码可读性。
内容的提问来源于stack exchange,提问作者Chris Snow
相关产品推荐
相关产品推荐

