gpt4 book ai didi

dart - Flutter:在 StatelessWidget 中哪里添加监听器?

转载 作者:IT老高 更新时间:2023-10-28 12:30:30 27 4
gpt4 key购买 nike

如果我使用的是 StatefulWidget,那么我将在 initState 方法中监听 Stream。我会在 StatelessWidget 中哪里做同样的事情(比如使用 Bloc 和流进行状态管理)?我可以在构建方法中做到这一点,但由于这些是重复的,我想知道是否有比检查现有监听器更有效的方法,如下所示。我知道这是一个多余且无用的示例,但这只是为了说明问题。

    import "package:rxdart/rxdart.dart";

import 'package:flutter/material.dart';

final counter = BehaviorSubject<int>();
final notifier = ValueNotifier<int>(0);

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
if (!counter.hasListener)
counter.listen((value) => notifier.value += value);

return MaterialApp(
home: Scaffold(
body: Center(
child:FlatButton(
onPressed: () => counter.add(1),
child: ValueListenableBuilder(
valueListenable: notifier,
builder: (context, value, child) => Text(
value.toString()
),
),
)
),
)
);
}
}

最佳答案

没有一种干净的方法可以让 StatelessWidget 监听 Listenable/Stream。你将总是需要一个 StatefulWidget。

另一方面,您可以使用组合来编写 StatefulWidget 一次,然后就可以完成它。

该模式的常见示例是 ValueListenableBuilderStreamBuilderAnimatedBuilder 等小部件。但也可以做同样的事情,听。

你会这样使用它:

class Foo extends StatelessWidget {
Foo({Key key, this.counter}): super(key: key);

final ValueListenable<int> counter;

@override
Widget build(BuildContext context) {
return ValueListenableListener(
valueListenable: counter,
onChange: (value) {
// TODO: do something
},
child: Something(),
);
}
}

ValueListenableListener是这样实现的:

class ValueListenableListener<T> extends StatefulWidget {
const ValueListenableListener(
{Key key, this.valueListenable, this.onChange, this.child})
: super(key: key);

final ValueListenable<T> valueListenable;
final ValueChanged<T> onChange;
final Widget child;

@override
_ValueListenableListenerState createState() =>
_ValueListenableListenerState();
}

class _ValueListenableListenerState extends State<ValueListenableListener> {
@override
void initState() {
super.initState();
widget.valueListenable?.addListener(_listener);
_listener();
}

@override
void didUpdateWidget(ValueListenableListener oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.valueListenable != widget.valueListenable) {
oldWidget.valueListenable?.removeListener(_listener);
widget.valueListenable?.addListener(_listener);
_listener();
}
}

@override
void dispose() {
widget.valueListenable?.removeListener(_listener);
super.dispose();
}

void _listener() {
widget.onChange?.call(widget.valueListenable.value);
}

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

关于dart - Flutter:在 StatelessWidget 中哪里添加监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54797911/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com