Appearance
第15章:进阶实战(贴合企业开发,衔接Flutter)
实战4:简易数据筛选工具(高阶函数+泛型实战)
15.1 需求分析
- 实现数据筛选
- 实现数据排序
- 实现数据映射
- 支持多种数据类型
15.2 核心实现
- 高阶函数:使用where、map、sort等方法
- 泛型:支持多种数据类型
- 闭包:用于封装筛选条件
15.3 实操:封装通用工具函数,实现多场景数据处理
dart
// 通用数据处理工具类
class DataProcessor<T> {
// 筛选数据
List<T> filter(List<T> data, bool Function(T) predicate) {
return data.where(predicate).toList();
}
// 映射数据
List<R> map<R>(List<T> data, R Function(T) transform) {
return data.map(transform).toList();
}
// 排序数据
List<T> sort(List<T> data, [int Function(T, T)? compare]) {
var sortedData = List<T>.from(data);
if (compare != null) {
sortedData.sort(compare);
}
return sortedData;
}
// 查找数据
T? find(List<T> data, bool Function(T) predicate) {
return data.firstWhereOrNull(predicate);
}
// 分组数据
Map<K, List<T>> groupBy<K>(List<T> data, K Function(T) keySelector) {
var groups = <K, List<T>>{};
for (var item in data) {
var key = keySelector(item);
if (!groups.containsKey(key)) {
groups[key] = [];
}
groups[key]!.add(item);
}
return groups;
}
// 去重数据
List<T> distinct(List<T> data, [Object Function(T)? keySelector]) {
if (keySelector == null) {
return data.toSet().toList();
}
var seen = <Object>{};
return data.where((item) {
var key = keySelector(item);
if (seen.contains(key)) {
return false;
}
seen.add(key);
return true;
}).toList();
}
}
// 扩展方法,为List添加firstWhereOrNull方法
extension ListExtension<T> on List<T> {
T? firstWhereOrNull(bool Function(T) test) {
for (var element in this) {
if (test(element)) {
return element;
}
}
return null;
}
}
// 测试数据
class Person {
final String name;
final int age;
final String city;
Person(this.name, this.age, this.city);
@override
String toString() {
return 'Person(name: $name, age: $age, city: $city)';
}
}
void main() {
print('=== 简易数据筛选工具 ===');
// 初始化测试数据
var people = [
Person('Alice', 25, 'New York'),
Person('Bob', 30, 'London'),
Person('Charlie', 20, 'Paris'),
Person('David', 35, 'New York'),
Person('Eve', 28, 'London'),
];
var processor = DataProcessor<Person>();
// 1. 筛选年龄大于25的人
print('\n1. 筛选年龄大于25的人:');
var filtered = processor.filter(people, (person) => person.age > 25);
filtered.forEach(print);
// 2. 映射获取所有人的姓名
print('\n2. 映射获取所有人的姓名:');
var names = processor.map(people, (person) => person.name);
print(names);
// 3. 按年龄排序
print('\n3. 按年龄排序:');
var sortedByAge = processor.sort(people, (a, b) => a.age.compareTo(b.age));
sortedByAge.forEach(print);
// 4. 查找住在New York的人
print('\n4. 查找住在New York的人:');
var newYorker = processor.find(people, (person) => person.city == 'New York');
print(newYorker);
// 5. 按城市分组
print('\n5. 按城市分组:');
var groupedByCity = processor.groupBy(people, (person) => person.city);
groupedByCity.forEach((city, persons) {
print('$city: ${persons.map((p) => p.name).toList()}');
});
// 6. 去重(假设可能有重复数据)
print('\n6. 去重(按城市):');
var distinctCities = processor.distinct(people, (person) => person.city);
distinctCities.forEach(print);
// 测试其他数据类型
print('\n=== 测试其他数据类型 ===');
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var numberProcessor = DataProcessor<int>();
// 筛选偶数
var evenNumbers = numberProcessor.filter(numbers, (n) => n % 2 == 0);
print('偶数:$evenNumbers');
// 映射为平方
var squares = numberProcessor.map(numbers, (n) => n * n);
print('平方:$squares');
// 按降序排序
var sortedDesc = numberProcessor.sort(numbers, (a, b) => b.compareTo(a));
print('降序:$sortedDesc');
}代码优化
- 泛型支持:使用泛型实现对多种数据类型的支持
- 高阶函数:使用where、map、sort等高阶函数简化代码
- 扩展方法:为List添加firstWhereOrNull方法,提高代码可读性
- 功能封装:将数据处理功能封装为工具类,提高代码复用性
实战5:Dart 与 Flutter 基础衔接(提前适配)
15.4 需求分析
- 用Dart语法编写Flutter基础组件逻辑
- 实现状态管理
- 实现事件处理
- 搭建简单Flutter页面
15.5 核心实现
- Dart类:定义数据模型和业务逻辑
- 函数:实现事件处理和业务逻辑
- 异步编程:处理网络请求等异步操作
- Flutter组件:使用Flutter的基础组件
15.6 实操:搭建简单Flutter页面,用Dart实现页面逻辑
dart
// main.dart
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dart与Flutter基础衔接',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Dart与Flutter基础衔接'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
// 状态管理
int _counter = 0;
String _message = 'Hello, Flutter!';
bool _isLoading = false;
List<String> _items = [];
// 事件处理函数
void _incrementCounter() {
setState(() {
_counter++;
});
}
void _decrementCounter() {
setState(() {
if (_counter > 0) {
_counter--;
}
});
}
void _updateMessage() {
setState(() {
_message = 'Message updated at ${DateTime.now().toString().substring(11, 19)}';
});
}
// 模拟异步操作
Future<void> _loadData() async {
setState(() {
_isLoading = true;
});
// 模拟网络请求延迟
await Future.delayed(Duration(seconds: 2));
setState(() {
_items = [
'Item 1',
'Item 2',
'Item 3',
'Item 4',
'Item 5',
];
_isLoading = false;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
_message,
style: TextStyle(fontSize: 18),
),
SizedBox(height: 20),
Text(
'Counter: $_counter',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: _decrementCounter,
child: Text('-'),
),
SizedBox(width: 20),
ElevatedButton(
onPressed: _incrementCounter,
child: Text('+'),
),
],
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _updateMessage,
child: Text('Update Message'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _loadData,
child: Text('Load Data'),
),
SizedBox(height: 20),
_isLoading
? CircularProgressIndicator()
: _items.isNotEmpty
? Expanded(
child: ListView.builder(
itemCount: _items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_items[index]),
subtitle: Text('Item ${index + 1}'),
leading: CircleAvatar(
child: Text('${index + 1}'),
),
);
},
),
)
: Text('No data loaded yet'),
],
),
),
);
}
}
// 数据模型类
class User {
final String id;
final String name;
final String email;
User({required this.id, required this.name, required this.email});
factory User.fromJson(Map<String, dynamic> json) {
return User(
id: json['id'],
name: json['name'],
email: json['email'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'email': email,
};
}
@override
String toString() {
return 'User(id: $id, name: $name, email: $email)';
}
}
// 业务逻辑类
class UserService {
// 模拟获取用户列表
Future<List<User>> getUsers() async {
// 模拟网络请求延迟
await Future.delayed(Duration(seconds: 2));
// 模拟返回数据
return [
User(id: '1', name: 'Alice', email: 'alice@example.com'),
User(id: '2', name: 'Bob', email: 'bob@example.com'),
User(id: '3', name: 'Charlie', email: 'charlie@example.com'),
];
}
// 模拟创建用户
Future<User> createUser(User user) async {
// 模拟网络请求延迟
await Future.delayed(Duration(seconds: 1));
// 模拟返回创建的用户
return User(
id: '${DateTime.now().millisecondsSinceEpoch}',
name: user.name,
email: user.email,
);
}
}代码优化
- 状态管理:使用setState管理组件状态
- 异步处理:使用async/await处理异步操作
- 数据模型:定义User类封装数据
- 业务逻辑:将网络请求等业务逻辑封装为UserService类
- Flutter组件:使用Flutter的基础组件构建界面
运行说明
- 创建Flutter项目:
flutter create dart_flutter_demo - 替换lib/main.dart文件内容为上述代码
- 运行项目:
flutter run
这个示例展示了如何在Flutter中使用Dart语法实现基本的状态管理、事件处理和异步操作,为后续的Flutter开发打下基础。
