📜  Flutter – 本地状态 vs 应用范围状态(1)

📅  最后修改于: 2023-12-03 15:30:49.294000             🧑  作者: Mango

Flutter – 本地状态 vs 应用范围状态

Flutter 是 Google 推出的一款跨平台开发框架。在 Flutter 中,有两种状态:本地状态和应用范围状态。

本地状态(Local State)

本地状态是指与特定小部件(widget)关联的状态。这意味着该状态只与特定小部件相关联,并且在小部件被销毁时也会被销毁。本地状态通常通过在小部件类中定义 State 类来实现。

class MyWidget extends StatefulWidget {
  @override
  createState() => _MyWidgetState(); // 创建 State 类
}

class _MyWidgetState extends State<MyWidget> {
  bool _isOn = false; // 定义本地状态

  @override
  Widget build(BuildContext context) {
    return Switch(
      value: _isOn,
      onChanged: (value) {
        setState(() {
          _isOn = value; // 更新本地状态
        });
      },
    );
  }
}

在上面的例子中,我们定义了一个 Switch 控件,并在控件中维护了一个名为 _isOn 的本地状态。当用户切换 Switch 按钮时,我们会调用 setState 方法来更新状态。

应用范围状态(App-wide State)

应用范围状态是指与整个应用程序相关联的状态。这意味着该状态可以由应用程序中任何小部件读取和修改,并且在整个应用程序的生命周期内都存在。通常,应用范围状态是通过在小部件树的根节点处创建一个全局状态管理类来实现的。

class AppStateManager extends StatefulWidget {
  final Widget child;

  AppStateManager({@required this.child});

  @override
  createState() => _AppStateManagerState();

  // 定义全局状态管理类
  static _AppStateManagerState of(BuildContext context) {
    return context.findAncestorStateOfType<_AppStateManagerState>();
  }
}

class _AppStateManagerState extends State<AppStateManager> {
  String _username; // 定义应用范围状态

  @override
  Widget build(BuildContext context) {
    return widget.child;
  }

  // 定义公共方法来读取和修改应用范围状态
  void setUsername(String username) {
    setState(() {
      _username = username;
    });
  }

  String getUsername() {
    return _username;
  }
}

在上面的例子中,我们创建了一个 AppStateManager 类来维护应用范围状态 _username。我们还提供了两个公共方法 setUsername 和 getUsername 来读取和修改应用范围状态。在根节点处创建 AppStateManager 后,我们可以使用 of 方法轻松地在任何小部件中获取 AppStateManager 的实例,并读取或修改应用范围状态。

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final appStateManager = AppStateManager.of(context); // 获取 AppStateManager 实例
    return Text(appStateManager.getUsername());
  }
}

在上面的例子中,我们使用 AppStateManager.of 方法获取 AppStateManager 的实例,并读取 _username 状态。这个小部件可以在应用程序中的任何位置使用,并始终读取最新的应用范围状态。