dart 这个错误是什么意思:在构建期间调用setState()或markNeedsBuild()

3xiyfsfu  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(130)

我正在跟踪一个tutorial,我得到了这个错误,不知道它意味着什么,也不知道为什么会发生。而且,我的编辑器没有显示我的代码中的任何问题。只有两个文件与此问题相关,以下是它们的代码:
世界时间:

import 'package:http/http.dart';
import 'dart:convert';
import 'package:intl/intl.dart';

class WorldTime {
  String location;
  String url;
  String time = "";
  String flag = "";

  WorldTime({ required this.location, required this.url});

  Future<void> getTime() async {
    // getting info and decoding it
    Response response = await get(
        Uri.parse("http://worldtimeapi.org/api/timezone/$url"));
    Map use = jsonDecode(response.body);

    // extracting usefuls from it
    String datetime = use['datetime'];
    int offsetHours = int.parse(use['utc_offset'].substring(1, 3));
    int offsetMinutes = int.parse(use['utc_offset'].substring(4, 6));

    // converting into readable format
    DateTime now = DateTime.parse(datetime);
    now = now.add(Duration(hours: offsetHours, minutes: offsetMinutes));
    time = (DateFormat.jm().format(now)).toString();
  }
}

字符串
正在加载文件:

import 'package:flutter/material.dart';
import 'package:world_time/services/world_time.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';

class Loading extends StatefulWidget {
  const Loading({super.key});

  @override
  State<Loading> createState() => _LoadingState();
}

class _LoadingState extends State<Loading> {
  void setupWorldTime() async {
    WorldTime instance = WorldTime(location: "Kolkata", url: "Asia/Kolkata", );
    await instance.getTime();
  }

  @override
  void initState() {
    super.initState();

  }

  @override
  Widget build(BuildContext context) {
    Navigator.pushNamed(context, "/home");
    return const Scaffold(
      backgroundColor: Colors.blue,
      body: SpinKitWanderingCubes(
          color: Colors.green,
          size: 50.0,),
        );
  }
}


我试着在谷歌上搜索它,结果很多,但没有一个对我有帮助。我也尝试了一些调整我的代码,但没有帮助太多。

3qpi33ja

3qpi33ja1#

不允许推送生成块中其他页面。
问题就在这里:

Navigator.pushNamed(context, "/home");

字符串
您可以使用FutureBuilder或在didChangeDependcies内运行代码


的数据
代码将在页面构建完成后调用。

92dk7w1h

92dk7w1h2#

到你的建筑另一个小部件在当前小部件构建完成之前,在你的代码中,你正在尝试在构建方法中导航,所以每次发生变化时,构建方法都会调用。

Navigator.pushNamed(context, "/home");

字符串
如果您想在某些操作完成后导航到另一个页面,可以使用如下方法

class _LoadingState extends State<Loading> {
 Future<void> setupWorldTime() async {
        WorldTime instance = WorldTime(location: "Kolkata", url: 
  "Asia/Kolkata", );
  await instance.getTime();
 }

 void customOperation()
 {
 await setupWorldTime();
 Navigator.pushNamed(context, "/home");
 }
@override
void initState() {
super.initState();
 customOperation()
}

@override
Widget build(BuildContext context) {

return const Scaffold(
  backgroundColor: Colors.blue,
  body: SpinKitWanderingCubes(
      color: Colors.green,
      size: 50.0,),
    );
}
}

相关问题