Flutter中InheritedNotifier 的详细介绍,并详细介绍使用方式

InheritedNotifier是Flutter框架中的一个非常有用的类,它允许你在widget树中高效地传递数据和改变通知。InheritedNotifier继承自InheritedWidget,并且可以与Listenable对象(如AnimationChangeNotifier等)一起使用,以便当这些对象发生变化时,能够通知使用它们的widget重新构建。

使用场景

InheritedNotifier特别适用于需要跨多个widget共享状态的情况,尤其是当这个状态可以通过某种Listenable对象(如ChangeNotifier)来表示时。例如,你可能有一个主题切换功能,主题的变化通过一个ChangeNotifier来管理,而多个widget需要根据当前主题来更新自己的外观。

基本使用方式

  1. 创建一个继承自ChangeNotifier的类,这个类将用于管理需要共享的状态。
Dart 复制代码
class MyThemeNotifier extends ChangeNotifier {
  bool _isDarkTheme = false;

  bool get isDarkTheme => _isDarkTheme;

  void toggleTheme() {
    _isDarkTheme = !_isDarkTheme;
    notifyListeners();
  }
}
  1. 使用InheritedNotifier来包裹你的应用或widget树的一部分 ,并传递你的ChangeNotifier实例。
Dart 复制代码
class MyTheme extends InheritedNotifier<MyThemeNotifier> {
  MyTheme({
    Key? key,
    required MyThemeNotifier notifier,
    required Widget child,
  }) : super(key: key, notifier: notifier, child: child);

  static MyThemeNotifier? of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<MyTheme>()?.notifier;
  }
}
  1. 在widget树中访问共享的状态
Dart 复制代码
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 使用MyTheme包裹MaterialApp,以便在整个应用范围内共享主题数据
    return MyTheme(
      notifier: MyThemeNotifier(),
      child: MaterialApp(
        home: HomePage(),
      ),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final themeNotifier = MyTheme.of(context);

    return Scaffold(
      appBar: AppBar(title: Text("InheritedNotifier Demo")),
      body: Center(
        child: Switch(
          value: themeNotifier?.isDarkTheme ?? false,
          onChanged: (_) => themeNotifier?.toggleTheme(),
        ),
      ),
    );
  }
}

在这个例子中,当切换开关时,HomePage会调用toggleTheme方法,这会触发notifyListeners,从而导致使用MyTheme.of(context)的所有widget重新构建,以反映新的主题状态。

注意事项

  • 确保正确使用context.dependOnInheritedWidgetOfExactType<MyTheme>()来获取InheritedNotifier的实例,这样当notifier发生变化时,依赖它的widget能够正确地被重建。
  • InheritedNotifier非常适合管理跨多个widget共享的状态,但对于应用级别的全局状态管理,你可能会考虑使用更高级的状态管理解决方案,如Provider或Riverpod。
相关推荐
程序员老刘·14 小时前
Flutter 3.44 更新要点:很重要但暂时先别升级
flutter·ai编程·跨平台开发·客户端开发
用户862841295494414 小时前
Flutter rxflare 计算属性 computed:自动依赖追踪 + 缓存(超实用)
flutter
用户862841295494414 小时前
Flutter rxflare 性能测试(最终推荐版):1000 列表极致优化・官方最佳写法
flutter
用户862841295494414 小时前
Flutter rxflare 响应式编程:.obs + Rx 组件极简实战
flutter
用户862841295494414 小时前
Flutter rxflare 响应式进阶:Map/List 精准字段更新(高性能实战)
前端·flutter
King老师15 小时前
Flutter 视频代理完全教程
flutter·音视频
恋猫de小郭16 小时前
AI 时代,谷歌都在 Android 官方做了哪些支持?
android·前端·flutter
愚者Pro1 天前
Flutter Widget组件学习(专为 Uniapp 转 Flutter 定制)
vue.js·学习·flutter·uni-app
Flynt1 天前
升级Flutter 3.44,我踩了HCPP和AGP 9的坑
android·flutter·dart
程序员老刘1 天前
Flutter 3.44 更新要点:很重要但暂时先别升级
flutter·ai编程·客户端