Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振列表生成器重置已删除项下的小部件_Flutter_State_Bloc - Fatal编程技术网

Flutter 颤振列表生成器重置已删除项下的小部件

Flutter 颤振列表生成器重置已删除项下的小部件,flutter,state,bloc,Flutter,State,Bloc,不过,这是一个令人困惑的问题,如果这是一个简单的问题,我很抱歉,但我在网上找不到任何信息。无论如何,我有一个由一个集团控制的列表生成器,它使用另一个集团控制的计时器。每当我删除一个计时器时,它都会重置已删除项下面的所有计时器,但会将计时器保留在“精细”之上 以下第0项和第2项处于活动状态,仅供参考。如果删除项目1,则项目2将重置 我能阻止吗?我目前有一个全局键,该键在所示的item tile的state类中调用,并且我还从父窗口小部件传递一个键 下面是子ItemTile小部件: cla

不过,这是一个令人困惑的问题,如果这是一个简单的问题,我很抱歉,但我在网上找不到任何信息。无论如何,我有一个由一个集团控制的列表生成器,它使用另一个集团控制的计时器。每当我删除一个计时器时,它都会重置已删除项下面的所有计时器,但会将计时器保留在“精细”之上

以下第0项和第2项处于活动状态,仅供参考。如果删除项目1,则项目2将重置

我能阻止吗?我目前有一个全局键,该键在所示的item tile的state类中调用,并且我还从父窗口小部件传递一个键

下面是子ItemTile小部件:

    class ItemTile extends StatefulWidget {
  final Function(String) onDeletePressed;
  final int index;
  final Timer timer;
  //final key; // = UniqueKey();

  ItemTile({
    Key key,
    @required this.index,
    @required this.timer,
    @required this.onDeletePressed,
  }) : //: key = ObjectKey(timer.id),
        super(key: key);

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

class _ItemTileState extends State<ItemTile> {
  final key = GlobalKey();
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Row(
        children: [
          Text('${widget.index.toString()}'),
          BlocProvider(
            create: (context) =>
                TimerBloc(ticker: Ticker(), timer: widget.timer),
            child: Container(
              height: (MediaQuery.of(context).size.height - 100) / 5,
              child: Row(
                children: [
                  Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: <Widget>[
                      Padding(
                        padding: EdgeInsets.symmetric(vertical: 10.0),
                        child: Center(
                          child: BlocBuilder<TimerBloc, TimerState>(
                            builder: (context, state) {
                              final String minutesStr =
                                  ((state.duration / 60) % 60)
                                      .floor()
                                      .toString()
                                      .padLeft(2, '0');
                              final String secondsStr = (state.duration % 60)
                                  .floor()
                                  .toString()
                                  .padLeft(2, '0');
                              return Text(
                                '$minutesStr:$secondsStr',
                              );
                            },
                          ),
                        ),
                      ),
                      BlocBuilder<TimerBloc, TimerState>(
                        buildWhen: (previousState, currentState) =>
                            currentState.runtimeType !=
                            previousState.runtimeType,
                        builder: (context, state) => TimerActions(),
                      ),
                    ],
                  ),
                ],
              ),
            ),
          ),
          widget.timer.isDeleting
              ? CircularProgressIndicator()
              : IconButton(
                  icon: Icon(Icons.delete, color: Colors.red),
                  onPressed: () {
                    widget.onDeletePressed(widget.timer.id);
                  },
                ),
        ],
      ),
    );
  }
}
class ItemTile扩展了StatefulWidget{
最终函数(字符串)已按下;
最终整数指数;
最终定时器;
//最后一个键;/=UniqueKey();
项目瓦({
关键点,
@需要这个索引,
@需要这个计时器,
@需要此项。按此键,
}):/:key=ObjectKey(timer.id),
超级(键:键);
@凌驾
_ItemTileState createState()=>\u ItemTileState();
}
类_ItemTileState扩展状态{
final key=GlobalKey();
@凌驾
小部件构建(构建上下文){
返回容器(
孩子:排(
儿童:[
文本(“${widget.index.toString()}”),
BlocProvider(
创建:(上下文)=>
TimerBloc(ticker:ticker(),timer:widget.timer),
子:容器(
高度:(MediaQuery.of(context).size.height-100)/5,
孩子:排(
儿童:[
纵队(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
填充物(
填充:边缘设置。对称(垂直:10.0),
儿童:中心(
孩子:BlocBuilder(
生成器:(上下文、状态){
最终字符串分钟数=
((state.duration/60)%60)
.会议室()
.toString()
.padLeft(2,'0');
最终字符串secondsStr=(state.duration%60)
.会议室()
.toString()
.padLeft(2,'0');
返回文本(
“$minutesStr:$secondsStr”,
);
},
),
),
),
BlocBuilder(
buildWhen:(previousState,currentState)=>
currentState.runtimeType=
previousState.runtimeType,
生成器:(上下文,状态)=>TimerActions(),
),
],
),
],
),
),
),
widget.timer.isDeleting
?循环压缩机指示器()
:图标按钮(
图标:图标(Icons.delete,颜色:Colors.red),
已按下:(){
onDeletePressed(widget.timer.id);
},
),
],
),
);
}
}
下面是家长主页小部件:

class HomePage extends StatefulWidget {
  static const TextStyle timerTextStyle = TextStyle(
    fontSize: 30,
    fontWeight: FontWeight.bold,
  );

  final Stream shouldTriggerChange;
  HomePage({@required this.shouldTriggerChange});
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  StreamSubscription streamSubscription;

  @override
  initState() {
    super.initState();
    streamSubscription = widget.shouldTriggerChange.listen((data) {
      createTimer(context, data);
    });
  }

  void createTimer(BuildContext context, timer_type timer) {
    BlocProvider.of<ListBloc>(context).add(Add(
        id: DateTime.now().toString(),
        duration: timer == timer_type.timer ? 100 : 0,
        timer: timer,
        timerTextStyle: HomePage.timerTextStyle));
  }

  @override
  didUpdateWidget(HomePage old) {
    super.didUpdateWidget(old);
    // in case the stream instance changed, subscribe to the new one
    if (widget.shouldTriggerChange != old.shouldTriggerChange) {
      streamSubscription.cancel();
      streamSubscription = widget.shouldTriggerChange
          .listen((data) => createTimer(context, data));
    }
  }

  @override
  dispose() {
    super.dispose();
    streamSubscription.cancel();
  }

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<ListBloc, ListState>(
      builder: (context, state) {
        if (state is Failure) {
          return Center(
            child: Text('Oops something went wrong!'),
          );
        }
        if (state is Loaded) {
          return Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              state.timers.isEmpty
                  ? Center(
                      child: Text('no content'),
                    )
                  : Expanded(
                      child: ListView.builder(
                        itemBuilder: (BuildContext context, int index) {
                          return ItemTile(
                            key: ObjectKey(state.timers[index]),
                            index: index,
                            timer: state.timers[index],
                            onDeletePressed: (id) {
                              BlocProvider.of<ListBloc>(context)
                                  .add(Delete(id: id));
                            },
                          );
                        },
                        itemCount: state.timers.length,
                      ),
                    ),
            ],
          );
        }
        return Center(
          child: CircularProgressIndicator(),
        );
      },
    );
  }
}
类主页扩展StatefulWidget{
静态常量TextStyle timerTextStyle=TextStyle(
尺寸:30,
fontWeight:fontWeight.bold,
);
最终流应触发更改;
主页({@required this.shouldTriggerChange});
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState扩展状态{
流订阅流订阅;
@凌驾
initState(){
super.initState();
streamSubscription=widget.shouldTriggerChange.listen((数据){
createTimer(上下文、数据);
});
}
void createTimer(BuildContext上下文,timer\u类型timer){
BlocProvider.of(上下文).add(添加(
id:DateTime.now().toString(),
持续时间:timer==timer\u type.timer?100:0,
定时器:定时器,
timerTextStyle:HomePage.timerTextStyle);
}
@凌驾
didUpdateWidget(旧主页){
super.diupdatewidget(旧);
//如果流实例已更改,请订阅新实例
if(widget.shouldTriggerChange!=old.shouldTriggerChange){
streamSubscription.cancel();
streamSubscription=widget.shouldTriggerChange
.listen((数据)=>createTimer(上下文,数据));
}
}
@凌驾
处置{
super.dispose();
streamSubscription.cancel();
}
@凌驾
小部件构建(构建上下文){
返回BlocBuilder(
生成器:(上下文、状态){
如果(状态为失败){
返回中心(
孩子:文本(‘哎呀,出问题了!’),
);
}
如果(状态已加载){
返回列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
state.timers.isEmpty
?中心(
子项:文本(“无内容”),
)
:扩展(
子项:ListView.builder(
itemBuilder:(构建上下文,int索引){
返回项目磁贴(
key:ObjectKey(state.timers[index]),
索引:索引,,
计时器:状态。计时器[索引],
onDeletePressed:(id){
BlocProvider.of(上下文)
.添加(删除(id:id));
},
);
},
itemCount:state.timers.length