首页 > 解决方案 > 为什么每当进修班召回课程时,我的 initstate 会被召回?

问题描述

感谢您的时间,所以在这段代码中,我包含了打印语句以查看发生了什么......

import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'dart:async';

void main() {
  return runApp(
    Refresher(),
  );
}

class Refresher extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _RefresherState();
  }
}

class _RefresherState extends State<Refresher> {
  Timer timer;
  @override
  void initState() {
    super.initState();
    timer = Timer.periodic(
      Duration(hours: 24),
      (t) => setState(() {}),
    );
  }
  @override
  void dispose() {
    timer.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    print('im the refresher');
    return ScreenTimer();
  }
}

class ScreenTimer extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _ScreenTimerState();
  }
}
class _ScreenTimerState extends State<ScreenTimer> {
  _ScreenTimerState(){
    print('state called');
  }
  Timer timer;
  Future<List<String>> runningShow;

  @override
  void initState() {
    super.initState();
    // Reset urls every 24hrs
    print('im screen timer ');
    runningShow = _getScreen1();
    timer = Timer.periodic(
      Duration(seconds: 30),
      (t) => setState(
        () {},
      ),
    );
  }

  @override
  void dispose() {
    timer.cancel();
    super.dispose();
  }
}

这是我的输出

I/flutter ( 4584): im the refresher
I/flutter ( 4584): state called
I/flutter ( 4584): im screen timer
I/Choreographer( 4584): The application may be doing too much work on its main thread.
I/flutter ( 4584): im the refresher
I/flutter ( 4584): im the refresher

有没有一种方法可以在每次调用类时再次调用 initstate?因为我需要在 24 小时后调用 _getscreen(//此函数检查数据库是否有任何更改)......

标签: flutterdartflutter-layout

解决方案


只需移动创建一个更新您的成员变量的新方法

void _updateShowRunning () {
    runningShow = _getScreen1();
}

initState现在定期调用该方法。

_updateShowRunning();
timer = Timer.periodic(
  Duration(seconds: 30),
  (t) => setState(
    _updateShowRunning,
  ),
);

推荐阅读