【问题标题】:where exactly is the void in this expression(dart/flutter/map)?这个表达式(dart/flutter/map)中的空白到底在哪里?
【发布时间】:2021-07-19 05:07:51
【问题描述】:

我正在尝试使用三元运算符来返回一个小部件。当我这样做时,我得到一个'这个表达式的类型是'void',所以它的值不能被使用。'。我到底哪里错了?`

class MyApp extends StatelessWidget {
  final usrMap = {"name": "Tom", 'Email': 'tom@xyz.com'};
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Tutorial',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Text Widget Tutorial'),
        ),
        body: Center(
          child: usrMap.forEach((k,v) => k=="name" ? Text('Hello World') : Text(k))
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您好,欢迎来到 Flutter 的精彩世界 :)

    forEach 函数在任何语言中都不会返回任何值。 它只是遍历对象的每个条目。

    如果您需要在迭代时返回任何内容 - 使用 ma​​p()

    usrMap.map((key, value) =>
            MapEntry(
              key,
              key == "name" ? Text('Hello World') : Text(key),
            )).values.toList()
    

    由于您遍历 Map 并且需要一个键 - 函数调用比使用简单数组要复杂一些:

    1. ma​​p() 使用键和值返回包含 MapEntries 的新地图
    2. 从新地图中获取值
    3. 将它们转换为列表并传递给任何内部可以有多个子级(列、行、堆栈等)的小部件的子级,并且不要使用具有单个子属性的小部件,如 Center 或容器。
    final children = usrMap.map((key, value) =>
            MapEntry(
              key,
              key == "name" ? Text('Hello World') : Text(key),
            )).values.toList()
    
    return Column(
        children: children,
    );
    

    或者您可以使用扩展运算符来执行此操作而无需额外的变量(这会降低可读性):

    return Column(
        children: [
            ...usrMap.map((key, value) =>
            MapEntry(
              key,
              key == "name" ? Text('Hello World') : Text(key),
            )).values,
        ],
    );
    

    【讨论】:

    • 只是小费。这样做没有什么意义:[ ...values.toList() ] 因为[ ... ] 将采用Iterable 并将所有元素转换为List。所以你应该改用[ ...values ]values.toList()
    • 我试图通过单独定义孩子来遵循您的解决方案。但是,我收到“无法在初始化程序中访问实例成员 usrMap”类型的错误。伴随着警告“无法推断 'children' 的类型,因为它引用了具有隐式类型的实例 getter 'usrMap'。”
    • 我使用的代码:class MyApp extends StatelessWidget { final usrMap = {"name": "Tom", 'Email': 'tom@xyz.com'}; final children = usrMap.map((key, value) => MapEntry( key, key == "name" ? Text('Hello World') : Text(key), )).values.toList(); Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Tutorial', home: Scaffold( appBar: AppBar( title: Text('Flutter Text Widget Tutorial'), ), body: Column( children: children ), ), ); } }
    • @ShaunThomas final children = usrMap.map()... 应该在 build() 方法内
    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    相关资源
    最近更新 更多