繁体   English   中英

根据闭包上下文的要求,返回类型“Person”不是“Widget”

[英]The return type 'Person' isn't a 'Widget', as required by the closure's context

我是 Flutter 的新手,我在dartpad.dev上尝试了一些代码片段来解决问题,看看它们是如何工作的。 这是我最近写的一个代码,但我不知道为什么它不起作用?

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Map<String, Object> x = {};

    x.putIfAbsent('Jack', () => Person(name: "Jack", age: 10));
    x.putIfAbsent('Joe', () => Person(name: "Joe", age: 10));

    return Container(
      child: ListView.builder(
          itemBuilder: (context, index) => Person(
              x.values.toList()[index].name, x.values.toList()[index].age),
          itemCount: x.length),
    );
  }
}

class Person {
  String? name;
  int? age;

  Person({
    this.name,
    this.age,
  });
}

这是我在dartpad.dev上看到的错误:

根据闭包上下文的要求,返回类型“Person”不是“Widget”。

您必须了解基于小部件的颤振工作方式。 小部件是在父子逻辑中放置在树状结构中的组件。

Person 是您创建的一个简单类,其中包含两个字段,但它不是可以在 UI 中使用的 Widget。

您正在构建的 UI 树包含一个想要构建小部件列表的 ListWidget。

因此,构建器期望一个小部件,而不是一个人。 您可以使用 Person 来构建 Widget,或者将您的 Person 类转换为无状态的 Widget。

我建议你从这里开始阅读: https ://docs.flutter.dev/development/ui/widgets-intro

为了使您的代码以最小的调整工作,您可以尝试使用一个文本小部件,您可以在其中传递您的个人详细信息:

return Container(
  child: ListView.builder(
      itemBuilder: (context, index) => Text(
          '${x.values.toList()[index].name}, ${x.values.toList()[index].age}'),
      itemCount: x.length),

相反,如果您将 Person 转换为 Widget,则必须使 person 扩展 StelessWidget,如下所示。 这样,您的 Person 类将有一个构建方法,该方法描述为应该将 Widget 构建到 UI 中。 结果将是相同的。

import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            body: Center(
              child: MyWidget(),
            ),
          ),
        );
      }
    }
    
    class MyWidget extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        Map<String, Object> x = {};
    
        x.putIfAbsent('Jack', () => Person(name: "Jack", age: 10));
        x.putIfAbsent('Joe', () => Person(name: "Joe", age: 10));
    
        return Container(
          child: ListView.builder(
              itemBuilder: (context, index) => x.values.toList()[index],
              itemCount: x.length),
        );
      }
    }
    
    class Person extends StatelessWidget {
      String? name;
      int? age;
    
      Person({
        this.name,
        this.age,
      });
    
      @override
      Widget build(BuildContext context) {
      return Text('$name, $age');
      }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM