请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Map集合中元素顺序问题

老师好,对于dart不太熟,有些问题想请教您
1.假如往 Map<String,String>添加元素后,Map里面的元素顺序是乱的吗,
此处的Map是类似 Java 中的Map 接口,实际有多种实现的集合么?
2.在HTTP网络操作这一节中,_doGet()明明是一个方法,这里是方法调用,那么为什么在此处加了括号反而会报错呢?

图片描述

正在回答

1回答

1. `Map<String, String>` 的元素顺序
在Dart中,`Map`的默认实现是`LinkedHashMap`。`LinkedHashMap`是根据插入顺序存储键值对的,因此元素的顺序是按照插入的顺序来维护的,不是随机的。

示例如下:

```dart
void main() {
  Map<String, String> map = {};
  map['a'] = 'apple';
  map['b'] = 'banana';
  map['c'] = 'cherry';
 
  map.forEach((key, value) {
    print('$key: $value');
  });
}
```

输出将会是:
```
a: apple
b: banana
c: cherry
```

#### 2. `_doGet` 方法调用
在Flutter中,`onPressed`属性需要一个回调函数,而不是函数调用的结果。将方法名后面的括号去掉,表示传递函数本身,而不是调用函数并传递其返回值。

**错误的代码**:
```dart
ElevatedButton _doGetBtn() {
  return ElevatedButton(
    onPressed: _doGet(), // 这里的 _doGet() 表示方法的调用
    child: const Text("发送按钮请求"),
  );
}
```

**正确的代码**:
```dart
ElevatedButton _doGetBtn() {
  return ElevatedButton(
    onPressed: _doGet, // 这里的 _doGet 表示传递方法本身作为回调
    child: const Text("发送按钮请求"),
  );
}

void _doGet() {
  print("Button pressed!");
}
```

### 代码示例
结合你提供的代码和解决方法,完整的代码示例如下:

```dart
import 'package:flutter/material.dart';

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

  @override
  State<HttpStudy> createState() => _HttpStudyState();
}

class _HttpStudyState extends State<HttpStudy> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('基于HTTP实现网络操作')),
      body: Column(
        children: <Widget>[_doGetBtn()],
      ),
    );
  }

  ElevatedButton _doGetBtn() {
    return ElevatedButton(
      onPressed: _doGet, // 传递方法作为回调,而不是调用方法
      child: const Text("发送按钮请求"),
    );
  }

  void _doGet() {
    print("Button pressed!");
    // 这里实现 HTTP 请求逻辑
  }
}
```

1 回复 有任何疑惑可以回复我~
  • 提问者 苏狗牙 #1
    谢谢老师
    回复 有任何疑惑可以回复我~ 2024-06-30 10:18:50
  • CrazyCodeBoy 回复 提问者 苏狗牙 #2
    嗯嗯,不客气哈
    回复 有任何疑惑可以回复我~ 2024-06-30 13:31:00
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信