如何在ListView中维护小部件的状态?

如何在ListView中维护小部件的状态?,listview,flutter,state,Listview,Flutter,State,我有一个可点击的小部件列表[即MarkWidget],当小部件被点击时,小部件的状态被改变。但当列表滚动到底部并滚动回顶部时,所有小部件的状态都会重置为默认状态 如何在滚动后停止/强制颤振以不重新绘制列表中的现有小部件 例如: 如果单击项目1,颜色将从绿色变为红色,但如果滚动到底部并滚动回顶部,项目1的颜色将变回绿色。 我需要的项目1的颜色是红色,如果它是点击无论滚动 以下是代码: import 'package:flutter/material.dart'; void main() {

我有一个可点击的小部件列表[即MarkWidget],当小部件被点击时,小部件的状态被改变。但当列表滚动到底部并滚动回顶部时,所有小部件的状态都会重置为默认状态

如何在滚动后停止/强制颤振以不重新绘制列表中的现有小部件

例如: 如果单击项目1,颜色将从绿色变为红色,但如果滚动到底部并滚动回顶部,项目1的颜色将变回绿色。 我需要的项目1的颜色是红色,如果它是点击无论滚动

以下是代码:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
      theme: ThemeData(
        platform: TargetPlatform.android,
      ),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  List<Widget> _widgetList = List.generate(
    30,
    (index) => MarkWidget(
          key: Key('ITEM $index'),
          title: 'ITEM $index',
        ),
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("My List"),
      ),
      body: ListView.builder(
        key: new Key("my_list"), //new

        itemBuilder: (BuildContext context, int index) {
          return _widgetList[index];
        },
        itemCount: _widgetList.length,
      ),
    );
  }
}

class MarkWidget extends StatefulWidget {
  final String title;

  const MarkWidget({Key key, this.title}) : super(key: key);

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

class _MarkWidgetState extends State<MarkWidget> {
  bool _checked = false;

  @override
  Widget build(BuildContext context) {
    return FlatButton(
      onPressed: () {
        setState(() {
          _checked = !_checked;
        });
      },
      child: Container(
        padding: EdgeInsets.all(10.0),
        margin: EdgeInsets.all(10.0),
        decoration: BoxDecoration(
          borderRadius: BorderRadius.all(
            Radius.circular(5.0),
          ),
          color: _checked ? Colors.red : Colors.green,
        ),
        child: Text(
          "${widget.title}",
          style: TextStyle(
            color: Colors.white,
            decoration: _checked ? TextDecoration.lineThrough : TextDecoration.none,
          ),
        ),
      ),
    );
  }
}

导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:主屏幕(),
主题:主题数据(
平台:TargetPlatform.android,
),
);
}
}
类主屏幕扩展StatefulWidget{
@凌驾
_HomeScreenState createState()=>\u HomeScreenState();
}
类_homescrenstate扩展状态{
List _widgetList=List.generate(
30,
(索引)=>MarkWidget(
key:key('ITEM$index'),
标题:“项目$index”,
),
);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“我的列表”),
),
正文:ListView.builder(
key:new key(“我的列表”),//new
itemBuilder:(构建上下文,int索引){
返回_widgetList[索引];
},
itemCount:_widgetList.length,
),
);
}
}
类MarkWidget扩展了StatefulWidget{
最后的字符串标题;
constmarkwidget({Key,this.title}):super(Key:Key);
@凌驾
_MarkWidgetState createState();
}
类_MarkWidgetState扩展状态{
bool _checked=false;
@凌驾
小部件构建(构建上下文){
返回按钮(
已按下:(){
设置状态(){
_选中=!\u选中;
});
},
子:容器(
填充:所有边缘设置(10.0),
保证金:所有边缘套(10.0),
装饰:盒子装饰(
borderRadius:borderRadius.all(
圆形半径(5.0),
),
颜色:选中?颜色。红色:颜色。绿色,
),
子:文本(
“${widget.title}”,
样式:TextStyle(
颜色:颜色,白色,
装饰:_选中?textEdition.lineThrough:textEdition.none,
),
),
),
);
}
}

automatickepaliveclientmixin
添加到
StatefulWidget
(项目小部件)的
状态
,覆盖
wantKeepAlive
方法并返回
true

 class _MarkWidgetState extends State<MarkWidget> with AutomaticKeepAliveClientMixin{
   ...

   @override
   bool get wantKeepAlive => true;
  }
class\u MarkWidgetState使用AutomaticEpaLiveClientMixin扩展状态{
...
@凌驾
bool get wantKeepAlive=>true;
}

更多信息:

我一直想知道,在这种情况下,我们可以说选择的项目非常高,所以很多状态保持活动状态,用户可以上下滚动。这不是需要很多内存来保持状态吗?你完全正确,它会在内存中加载所有的小部件