返回

Flutter 世界里数据的变动,都在这里

前端

构建与数据同步的 UI

构建响应式 UI 是 Flutter 开发的基石。Flutter 提供了多种用于数据监听的组件,可以帮助您轻松实现这一目标。

ValueListenableBuilder

ValueListenableBuilder 是一个泛型构建器,可以将 ValueListenable 和构建器函数结合在一起,构建一个小部件。ValueListenable 是一个对象,它可以发出值的更改通知。当 ValueListenable 的值发生更改时,ValueListenableBuilder 将调用构建器函数来重新构建小部件。

例如,以下代码使用 ValueListenableBuilder 来构建一个文本小部件,该文本小部件显示一个计数器变量的值:

ValueListenableBuilder(
  valueListenable: counter,
  builder: (BuildContext context, int value, Widget? child) {
    return Text('Count: $value');
  },
)

StreamBuilder

StreamBuilder 与 ValueListenableBuilder 类似,但它用于监听 Stream 而不是 ValueListenable。Stream 是一种异步数据源,它可以按顺序发出数据事件。当 Stream 发出数据事件时,StreamBuilder 将调用构建器函数来重新构建小部件。

例如,以下代码使用 StreamBuilder 来构建一个文本小部件,该文本小部件显示一个异步计数器变量的值:

StreamBuilder(
  stream: counter.stream,
  builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
    if (snapshot.hasData) {
      return Text('Count: ${snapshot.data}');
    } else {
      return Text('Loading...');
    }
  },
)

InheritedWidget

InheritedWidget 是一个基类,用于构建可以向其子项提供数据的构建器。要使用 InheritedWidget,您需要创建一个扩展 InheritedWidget 的类,并实现 updateShouldNotify() 方法。updateShouldNotify() 方法负责确定子项是否需要重新构建。

例如,以下代码使用 InheritedWidget 来构建一个计数器变量,该计数器变量可以由其子项访问:

class CounterInheritedWidget extends InheritedWidget {
  final int counter;

  const CounterInheritedWidget({
    Key? key,
    required this.counter,
    required Widget child,
  }) : super(key: key, child: child);

  static CounterInheritedWidget of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<CounterInheritedWidget>()!;
  }

  @override
  bool updateShouldNotify(CounterInheritedWidget oldWidget) {
    return counter != oldWidget.counter;
  }
}

然后,您可以使用 CounterInheritedWidget 来构建一个文本小部件,该文本小部件显示计数器变量的值:

class CounterText extends StatelessWidget {
  const CounterText({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final counter = CounterInheritedWidget.of(context).counter;
    return Text('Count: $counter');
  }
}

总结

Flutter 提供了多种用于数据监听的组件,可以帮助您轻松构建响应式 UI。这些组件包括 ValueListenableBuilder、StreamBuilder 和 InheritedWidget。您可以根据自己的需求选择最合适的组件来使用。