当用户点击TextSpan时如何调用函数:
将TapGestureRecognizer 传递给recognizer 属性,例如:
TextSpan(
text: "hello world",
style: TextStyle(
fontSize: 20.0,
fontWeight: FontWeight.bold,
color: Colors.blue,
height: 2.5,
letterSpacing: 0.7,
),
recognizer: TapGestureRecognizer()
..onTap = () {
print("TextSpan is clicked.");
// callMyFunction();
},
);
编辑:
根据您对问题的最新编辑,完成此任务的最佳方法是提升根据遗传密码确定颜色的功能(我只是将其称为getColorFromCode,您可以将其称为@987654330 @ 管他呢)。这样,您可以在需要时计算“比例”。
我做了一个小演示项目给你看如何在两个不同的小部件中调用辅助函数:一个显示比例,另一个显示16个不同颜色的代码。
看起来是这样的:
要运行演示,请创建一个新的 Flutter 项目并将其整个 main.dart 文件替换为以下代码:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
final data = [
'AAPP', 'AApP', 'aAPP', 'aApP',
'AAPp', 'AApp', 'aAPp', 'aApp',
'AaPP', 'AapP', 'aaPP', 'aapP',
'AaPp', 'Aapp', 'aaPp', 'aapp',
];
@override
Widget build(BuildContext context) {
final colors = data.map(getColorFromCode);
final browns = colors.where((color) => color == Colors.brown).length;
final blacks = colors.where((color) => color == Colors.black).length;
final whites = colors.where((color) => color == Colors.white).length;
return Scaffold(
appBar: AppBar(title: Text('Flutter Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Proportion: $browns:$blacks:$whites'),
Container(
width: 200,
decoration: BoxDecoration(
border: Border.all(color: Colors.blue, width: 4.0),
borderRadius: BorderRadius.circular(16),
color: Colors.lightGreen,
),
padding: EdgeInsets.all(16),
child: RichText(
text: TextSpan(
children: [
for (final code in data)
TextSpan(
text: '$code ',
style: TextStyle(
color: getColorFromCode(code),
fontFamily: 'courier',
),
),
],
)),
),
],
),
),
);
}
}
Color getColorFromCode(String code) {
if (code.contains('A') && code.contains('P')) return Colors.brown;
if (code.contains('A') && code.contains('pp')) return Colors.black;
if (code.contains('aa')) return Colors.white;
return Colors.red; // not covered in the question description
}
再次编辑:
如果您有多个数据,您还可以将业务逻辑重构为一个独立的小部件,这样您就可以轻松地重用代码。
例如,我们可以传入 3 组数据并构建如下内容:
完整源代码:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
final data1 = ['AAPP', 'AApP', 'aAPP', 'aApP', 'AAPp', 'AApp', 'aAPp'];
final data2 = ['AaPP', 'AapP', 'aaPP', 'aapP', 'AaPp', 'Aapp', 'aaPp'];
final data3 = ['aaPp', 'AapP', 'aAPP', 'aApP', 'AaPp', 'aaPP'];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Flutter Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(MyWidget.getProportion(data1)),
MyWidget(data: data1),
Divider(),
Text(MyWidget.getProportion(data2)),
MyWidget(data: data2),
Divider(),
Text(MyWidget.getProportion(data3)),
MyWidget(data: data3),
],
),
),
);
}
}
class MyWidget extends StatelessWidget {
final List<String> data;
const MyWidget({Key? key, required this.data}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: 200,
decoration: BoxDecoration(
border: Border.all(color: Colors.blue, width: 4.0),
borderRadius: BorderRadius.circular(16),
color: Colors.lightGreen,
),
padding: EdgeInsets.all(16),
child: RichText(
text: TextSpan(
children: [
for (final code in data)
TextSpan(
text: '$code ',
style: TextStyle(
color: getColorFromCode(code),
fontFamily: 'courier',
),
),
],
)),
);
}
static String getProportion(List<String> data) {
final colors = data.map(getColorFromCode);
final browns = colors.where((color) => color == Colors.brown).length;
final blacks = colors.where((color) => color == Colors.black).length;
final whites = colors.where((color) => color == Colors.white).length;
return 'Proportion: $browns:$blacks:$whites';
}
static Color getColorFromCode(String code) {
if (code.contains('A') && code.contains('P')) return Colors.brown;
if (code.contains('A') && code.contains('pp')) return Colors.black;
if (code.contains('aa')) return Colors.white;
return Colors.red; // not covered in the question description
}
}