flutter 将FutureBuilder添加到另一个FutureBuilder中时无休止地循环抖动

wpcxdonn  于 2023-02-05  发布在  Flutter
关注(0)|答案(1)|浏览(86)
    • bounty将在7天后过期**。回答此问题可获得+50声望奖励。A_K希望引起更多人关注此问题。

我在Flutter屏幕中有一个秒表计时器,它在FutureBuilder中开始时按要求工作,但当我添加另一个FutureBuilder以添加来自API的信息时,它会无限循环:
最初当我打开屏幕时,它是无限循环的,然后当我调整代码时,它只在我单击开始按钮时无限循环,即使在单击停止按钮后,它仍继续循环。
下面是dart文件:

class Screen extends StatefulWidget {
  @override
  _ScreenState createState() => _ScreenState();
}

class _ScreenState extends State<Screen> {
  bool isStartButtonDisabled = false;
  bool isStopButtonDisabled = true;
  Stopwatch _stopwatch = Stopwatch();
  String _elapsedTime = "00:00:00";
  late Timer _timer;
void _startStopwatch() {
    print("void _startStopwatch() { Starting stopwatch");
    _stopwatch.start();
    setState(() {
      isStartButtonDisabled = true;
      isStopButtonDisabled = false;
    });

    _timer = Timer.periodic(
      const Duration(seconds: 1),
      (Timer timer) {
        if (mounted) {
          setState(() {
            _elapsedTime = _stopwatch.elapsed.toString().split(".")[0];
          });
        }
      },
    );
  }

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

这里是ui

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: ListView(
        children: [
          Container(
            child: Column(
              children: [
                GFButton(
                  onPressed: isStartButtonDisabled ? null : startWorkout,
                  text: "Start Workout",
                ),
                Text(
                  _elapsedTime,
                ),
                Card(
                    child: Padding(
                  padding: const EdgeInsets.all(18.0), //change here
                  child: Column(
                    children: [
                      FutureBuilder<List<Model_No_1>>(
                        future: futureModel_No_1,
                        builder: (BuildContext context,
                            AsyncSnapshot<List<Model_No_1>> snapshot) {
                          if (snapshot.hasData) {
                            return Column(
                              children: List.generate(snapshot.data!.length,
                                  (int index) {
                                String Some_VariableName =
                                    snapshot.data![index].name;
                                return Column(
                                  children: [
                                    Text(
                                      snapshot.data![index].name,
                                    ),
                                    Builder(builder: (context) {
                                      return Container(
                                        child: SingleChildScrollView(
                                            child: Column(
                                          children: [
                                            Card(
                                              child: Row(
                                                children: [
                                                  Expanded(
                                                    child: FutureBuilder<
                                                        Get_Old_Model_No>(
                                                      future: () {
                                                        final Map<String,dynamic>                                                            arguments =ModalRoute.of(context)!.settings.arguments as Map<String,dynamic>;final int id =arguments['id'] ??
0;print("This is the id $id");return APIService.Get_Old_Model_No(id);}(),builder:(context, snapshot) {print("Snapshot data:${snapshot.data}");print("Snapshot error:${snapshot.error}");
                                                        if (snapshot.hasData) {
                                                          return Column(
                                                            children: [
                                                              // Text(snapshot
                                                              //     .data
                                                              //     ?.endDate),
                                                            ],
                                                          );
                                                        } else if (snapshot
                                                            .hasError) {
                                                          return Text(
                                                              "${snapshot.error}");
                                                        }
                                                        return CircularProgressIndicator();
                                                      },),),],),),
for (var breakdown in snapshot.data![index].breakdowns)
Form(child: Expanded(child: Column(children: [TextFormField(
keyboardType:TextInputType.number,
onChanged:(value) {
final int?parsedValue =
int.tryParse(value);if (parsedValue !=
null) {setState(
() {variable1 =parsedValue;});} else {}
},),],),),),

当我添加扩展的,它运行APIService.Get_Old_Model_No(id);
我的问题是为什么会发生不确定循环?我该如何修复它?

qnakjoqk

qnakjoqk1#

我无法从您提供的代码中重现您的问题,但有多个封装的futureBuilder应该不是问题。
setState有没有可能从您未来的(Builder)中调用?
这将触发重建,重新加载未来,然后再次设置状态,触发重建,等等

相关问题