【问题标题】:LateInitializationError: Field 'mangaStatus' has not been initialized in flutterLateInitializationError:字段“mangaStatus”尚未在颤振中初始化
【发布时间】:2022-01-15 20:42:15
【问题描述】:

我创建了一个应用程序,但出现此错误。 我可以毫无问题地获取漫画的状态,因为当我打印时它可以工作,但是当我刷新应用程序时,我的变量导致了这个错误,如果 somoene 可以帮助我,我会一如既往地非常感激。

class DetailScreen extends StatefulWidget {
  const DetailScreen({Key? key, required this.mangaImg, required this.mangaTitle, required this.mangalink}) : super(key: key);
  final String mangaImg,mangaTitle,mangalink;


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

class _DetailScreenState extends State<DetailScreen> {
   late String mangaGenre,mangaStatus,mangaAuthor,mangaDesc;

  List<Map<String,dynamic>>? mangaDetail;
  List<Map<String,dynamic>>? mangaDescList;
  List<Map<String,dynamic>>? mangaChapters;

  void getMangaInfo() async {
    String TempBaseurl = widget.mangalink.split(".com")[0] + ".com";
    String TempRoute = widget.mangalink.split(".com")[1];
   final webscraper = WebScraper(TempBaseurl);
   if (await webscraper.loadWebPage(TempRoute)){
     mangaDetail = webscraper.getElement("div.panel-story-info > div.story-info-right > table > tbody > tr > td.table-value", []);

     mangaDescList = webscraper.getElement("div.panel-story-info > div.panel-story-info-description", []);

   }

   mangaGenre  = mangaDetail![3]['title'].toString().trim();
   mangaStatus = mangaDetail![2]['title'].toString().trim();
   mangaAuthor = mangaDetail![1]['title'].toString().trim();
   mangaDesc   = mangaDescList![0]['title'].toString().trim();


    print(mangaDesc);

  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    getMangaInfo();
  }

  @override
  Widget build(BuildContext context) {
    Size screensize = MediaQuery.of(context).size;

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Constants.mygreen,
        title: Text(widget.mangaTitle),
        centerTitle: true,
      ),
      body: Container(
        height: screensize.height,
        width: screensize.width,
        child: SingleChildScrollView(
          child: Column(
            children: [
              MangaInfo(
                mangaImg: widget.mangaImg,
                mangaStatus: mangaStatus,
                mangaAuthor : mangaAuthor,
              ),

【问题讨论】:

  • 你也可以发布错误吗?
  • 您的多个late 变量是异步初始化的。没有什么可以阻止 build 方法在初始化之前被调用并尝试使用它们。更糟糕的是,getMangaInfo 不会返回 Future,这会阻止调用者等待它完成。将late 用于异步初始化的变量是LateInitializationErrors 的秘诀。改为使用可为空的变量,并首先检查它们是否为null

标签: android database firebase flutter dart


【解决方案1】:

根据您在 cmets 中发布的错误,我建议进行以下更改。

未初始化late 字段将在运行时导致LateInitializationErrors。正如您在评论中提到的,最好使用可空字符串 (String?) 而不是 late Strings 以避免此运行时错误并明确处理潜在的空值:

// Change this:
late String mangaGenre,mangaStatus,mangaAuthor,mangaDesc;

// to this:
String? mangaGenre,mangaStatus,mangaAuthor,mangaDesc;

您正在调用getMangaInfo() 方法,即async,但没有等待它返回。 build 方法有可能在 getMangaInfo() 完成之前被调用:

// Change this:
void getMangaInfo() async {

// to this
Future<void> getMangaInfo() async {
// Change this:
getMangaInfo();

// to this
await getMangaInfo();

现在String ...s 已更改为String? ...s,必须分配备用值以防字符串为null

// Change this:
MangaInfo(
  mangaImg: widget.mangaImg,
  mangaStatus: mangaStatus,
  mangaAuthor : mangaAuthor,
),

// to this
MangaInfo(
  mangaImg: widget.mangaImg,
  mangaStatus: mangaStatus ?? "some-fallback-value",
  mangaAuthor : mangaAuthor ?? "some-fallback-value",
),

【讨论】:

  • 好的,但基本上我不能在我的 void 上添加等待,你知道吗?
  • 这就是为什么需要将void 更改为Future&lt;void&gt;。还是我误解了你的问题?
  • 我像你一样改变了一切,我没有同样的错误,但它给我发送了后备值,我不明白为什么
  • 我认为这是因为 Flutter 认为我的漫画状态和我的漫画作者为空,但它们不是
猜你喜欢
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-27
  • 2021-10-27
  • 2021-12-29
  • 2022-01-16
相关资源
最近更新 更多