我如何更新一个listview元素没有设置状态?



我有一个列表视图。带有映像的生成器。图像的不透明度取决于提供者元素(提供者元素为真,不透明度为1,如果它为假,不透明度为0)。然后我有另一个类,从该类中我可以更新列表视图图像的提供者,但是为了改变改变的效果,我必须设置列表视图小部件的状态。

即使它很好并且工作正常,我也不想这样做,因为当我在列表视图小部件中设置状态时,列表视图位置重新启动,我需要在列表视图的元素处再次滚动,我知道我可以保存滚动位置(使用控制器),但是因为我的列表视图太大了,它需要很多时间才能到达位置,所以我不喜欢它。

你知道吗?

如果您想在不调用setState的情况下重建UI,您可以使用ValueNotifierValueListenableBuilder小部件的帮助。

这是一个简化的计数器应用程序,如果你看一下控制台,你会看到print('build');只在最初运行build方法时被调用,而在调用_increment()时不会再次被调用:


import 'package:flutter/material.dart';
void main() => runApp(const MaterialApp(home: PageLoadApp()));
final counter = ValueNotifier<int>(0);
class PageLoadApp extends StatefulWidget {
const PageLoadApp({Key? key}) : super(key: key);
@override
State<PageLoadApp> createState() => _PageLoadAppState();
}
class _PageLoadAppState extends State<PageLoadApp> {
void _increment() {
counter.value++;
}
@override
Widget build(BuildContext context) {
print('build');
return Scaffold(
body: Scaffold(
body: ValueListenableBuilder<int>(
valueListenable: counter,
builder: (context, value, _) {
return Center(
child: Text('$value', style: const TextStyle(fontSize: 30)),
);
}),
floatingActionButton: FloatingActionButton(
onPressed: _increment,
child: const Icon(Icons.add),
)));
}
}

另外,这个小部件可以是StatelessWidget.

由于您没有提供代码示例,因此您必须根据您的情况调整这个提供的示例。


这是Google团队在YouTube上解释ValueListenableBuilder的视频

相关内容

  • 没有找到相关文章

最新更新