Flutter选择时机插件select_when的使用

Flutter选择时机插件select_when的使用

select_when_context 是一个为 Flutter 提供的扩展包,它通过在 BuildContext 中添加一个 selectWhen 方法来增强 Provider 包的功能。该方法允许你指定条件以控制特定选择器何时被调用,从而帮助你避免不必要的UI更新。

功能

  • 条件重建selectWhen 允许小部件仅在满足特定条件时进行重建,帮助优化性能,减少不必要的更新。
  • 改进的控制:通过指定一个 when 断言,你可以控制选择器何时应计算值,防止不必要的重新计算。
  • select 相似的API:该扩展基于 Provider 包中的熟悉 select 方法构建,使其易于集成到现有代码库中。

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  select_when_context: ^1.0.0

然后运行:

flutter pub get

使用

selectWhen 扩展为 BuildContext 添加了一个方法,可以更高效地管理小部件的状态。它特别适用于那些依赖于频繁更新值但只在某些条件下需要重建的小部件。

示例

假设你有一个包含 nameisLoading 标志的 Person 模型:

class Person with ChangeNotifier {
  String name;
  bool isLoading;

  Person({required this.name, this.isLoading = false});

  // 添加逻辑以更新 `name` 和 `isLoading`
}

你可以在小部件的 build 方法中使用 selectWhen 来仅在 name 发生变化且 isLoadingfalse 时重建它:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:select_when_context/select_when_context.dart';

class PersonWidget extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final name = context.selectWhen<String>(
      (person) => person.name,
      when: (person) => !person.isLoading,
    );

    return Text(name);
  }
}

在这个示例中,如果 Personname 发生变化并且 isLoadingfalse,则该小部件将重建。这提供了一种有效的方式来控制小部件何时应该更新,减少不必要的重建。

关键优势

  • 性能优化:通过控制选择器函数何时执行,你可以防止过多和不必要的小部件重建。
  • 更简单的状态管理selectWhen 易于使用,类似于标准的 select 方法,但具有通过条件重建添加的灵活性。

API 参考

selectWhen<T, R>

selectWhenBuildContext 上的一个扩展方法:

R selectWhen<T, R>(
  R Function(T value) selector, {
  required bool Function(T value) when,
})
  • selector:从类型为 T 的提供者中提取类型为 R 的值的函数。
  • when:一个断言函数,根据是否应调用选择器返回 truefalse

重要提示

  • 仅在 build 方法中使用selectWhen 应仅在小部件的 build 方法中使用。它不会在其他生命周期方法(如 State.didChangeDependencies)中工作。
  • 高效的断言评估:当提供者发出更新时,when 断言会同步评估。如果返回 true,则会调用 selector 并将结果与前一个值比较以确定是否需要重建。

完整示例

考虑以下情景以实现高效的小部件更新:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:select_when_context/select_when_context.dart';

class Person with ChangeNotifier {
  String name;
  bool isLoading;

  Person({required this.name, this.isLoading = false});

  void updateName(String newName) {
    name = newName;
    notifyListeners();
  }

  void setLoading(bool loading) {
    isLoading = loading;
    notifyListeners();
  }
}

class ExampleWidget extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final name = context.selectWhen<String>(
      (person) => person.name,
      when: (person) => !person.isLoading,
    );

    return Text(name);
  }
}

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => Person(name: 'John Doe'),
      child: MaterialApp(
        home: Scaffold(
          body: ExampleWidget(),
        ),
      ),
    ),
  );
}

更多关于Flutter选择时机插件select_when的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter选择时机插件select_when的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


select_when 是一个 Flutter 插件,用于在特定条件下选择不同的 UI 组件或执行不同的逻辑。它的主要用途是在不同的状态或条件下动态地选择要显示的内容。以下是如何使用 select_when 插件的详细步骤和示例。

安装插件

首先,你需要在 pubspec.yaml 文件中添加 select_when 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  select_when: ^0.1.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

基本用法

select_when 插件提供了一个 SelectWhen 组件,你可以根据不同的条件来选择不同的子组件。

import 'package:flutter/material.dart';
import 'package:select_when/select_when.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('SelectWhen Example')),
        body: Center(
          child: SelectWhen(
            condition: 2,  // 这里可以根据实际条件动态改变
            cases: {
              1: Text('Case 1'),
              2: Text('Case 2'),
              3: Text('Case 3'),
            },
            defaultCase: Text('Default Case'),
          ),
        ),
      ),
    );
  }
}

详细说明

  • condition: 这是 SelectWhen 的核心属性,它是一个动态值,表示当前的条件。SelectWhen 会根据这个值来选择对应的 case

  • cases: 这是一个 Map,键是条件值,值是对应的 WidgetSelectWhen 会查找 condition 对应的键,并显示其对应的 Widget

  • defaultCase: 这是可选的,当 condition 不匹配 cases 中的任何键时,SelectWhen 会显示 defaultCase 对应的 Widget

高级用法

你可以将 SelectWhen 与其他 Flutter 组件结合使用,例如根据不同的状态显示不同的按钮或布局。

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    int selectedIndex = 1;  // 假设这是动态的状态

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('SelectWhen Example')),
        body: Center(
          child: SelectWhen(
            condition: selectedIndex,
            cases: {
              1: ElevatedButton(
                onPressed: () {
                  print('Button 1 pressed');
                },
                child: Text('Button 1'),
              ),
              2: ElevatedButton(
                onPressed: () {
                  print('Button 2 pressed');
                },
                child: Text('Button 2'),
              ),
            },
            defaultCase: Text('No Button'),
          ),
        ),
      ),
    );
  }
}
回到顶部