Flutter词云生成插件word_cloud的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter词云生成插件 word_cloud 的使用

目录

WordCloudData

为了在Flutter中使用词云组件,首先需要将数据设置到WordCloudData对象中。

WordCloudData mydata = WordCloudData(data: data_list);

参数data需要一个包含键为wordvalue的Map列表。例如:

List<Map> data_list= [
  {'word': 'Apple','value': 100},
  {'word': 'Samsung','value': 60},
];

另一种添加数据的方法是使用实例方法addData

mydata.addData(String word, double value);

WordCloudView

设置了数据之后,可以使用WordCloudView组件来展示词云:

WordCloudView(
  data: mydata,
  mapwidth: 500,
  mapheight: 500,
)

这是一个基本用法示例。以下是基于示例数据集的结果: 词云示例

更多属性

mapcolor

通过mapcolor属性可以设置词云背景颜色:

WordCloudView(
  data: mydata,
  mapcolor: Color.fromARGB(255, 174, 183, 235),
  mapwidth: 500,
  mapheight: 500,
)

带背景色的词云

colorlist

通过colorlist参数可以改变单词的颜色。需要输入Color类型的列表,词云会选择字体颜色随机显示:

WordCloudView(
  data: mydata,
  mapcolor: Color.fromARGB(255, 174, 183, 235),
  mapwidth: 500,
  mapheight: 500,
  colorlist: [Colors.black, Colors.redAccent, Colors.indigoAccent],
)

彩色词云

shape

可以通过shape参数决定词云的整体形状。目前支持圆形和椭圆两种形状:

WordCloudView(
  data: mydata,
  mapcolor: Color.fromARGB(255, 174, 183, 235),
  mapwidth: 500,
  mapheight: 500,
  shape: WordCloudCircle(radius: 250),
)

圆形词云

WordCloudTap

WordCloudTapWordCloudTapView使得词云中的单词可点击。首先定义WordCloudTap并设置想要点击的单词及其对应的函数:

WordCloudTap wordtaps = WordCloudTap();

wordtaps.addWordtap(String word, Function function);

示例代码如下:

WordCloudTap wordtaps = WordCloudTap();
int count = 0;
String wordstring = '';

// 设置WordCloudTap
for (int i = 0; i < data_list.length; i++) {
  void tap() {
    setState(() {
      count += 1;
      wordstring = data_list[i]['word'];
    });
  }
  wordtaps.addWordtap(data_list[i]['word'], tap);
}

WordCloudTapView

完成WordCloudTap的设置后,可以将其作为WordCloudTapView的一个因子使用。与WordCloudView不同的是,WordCloudTapView需要一个额外的参数wordtap,用于传入WordCloudTap对象。

WordCloudTapView(
  data: wcdata,
  wordtap: wordtaps,
  mapcolor: Color.fromARGB(255, 174, 183, 235),
  mapwidth: 500,
  mapheight: 500,
  colorlist: [Colors.black, Colors.redAccent, Colors.indigoAccent],
)

带有点击功能的词云视图

示例项目

下面是一个完整的示例项目,展示了如何使用word_cloud插件生成词云,并使其可点击:

import 'package:flutter/material.dart';
import 'package:word_cloud/word_cloud_data.dart';
import 'package:word_cloud/word_cloud_shape.dart';
import 'package:word_cloud/word_cloud_tap.dart';
import 'package:word_cloud/word_cloud_tap_view.dart';
import 'package:word_cloud/word_cloud_view.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Word Cloud Example Page',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Word Cloud Example Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 示例数据列表
  List<Map> word_list = [
    // 数据略...
  ];
  int count = 0;
  String wordstring = '';

  [@override](/user/override)
  Widget build(BuildContext context) {
    WordCloudData wcdata = WordCloudData(data: word_list);
    WordCloudTap wordtaps = WordCloudTap();

    // 设置WordCloudTap
    for (int i = 0; i < word_list.length; i++) {
      void tap() {
        setState(() {
          count += 1;
          wordstring = word_list[i]['word'];
        });
      }
      wordtaps.addWordtap(word_list[i]['word'], tap);
    }

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Clicked Word : ${wordstring}', style: TextStyle(fontSize: 20)),
            Text('Clicked Count : ${count}', style: TextStyle(fontSize: 20)),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                WordCloudTapView(
                  data: wcdata,
                  wordtap: wordtaps,
                  mapcolor: Color.fromARGB(255, 174, 183, 235),
                  mapwidth: 500,
                  mapheight: 500,
                  fontWeight: FontWeight.bold,
                  shape: WordCloudCircle(radius: 250),
                  colorlist: [Colors.black, Colors.redAccent, Colors.indigoAccent],
                ),
                SizedBox(height: 15, width: 30),
                WordCloudView(
                  data: wcdata,
                  mapcolor: Color.fromARGB(255, 174, 183, 235),
                  mapwidth: 500,
                  mapheight: 500,
                  fontWeight: FontWeight.bold,
                  colorlist: [Colors.black, Colors.redAccent, Colors.indigoAccent],
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter词云生成插件word_cloud的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter词云生成插件word_cloud的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用word_cloud插件生成词云的代码案例。这个插件允许你根据提供的词频数据生成一个动态的词云图。

首先,确保你的Flutter项目中已经添加了word_cloud插件。你可以在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  word_cloud: ^x.y.z  # 请将x.y.z替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中创建一个词云。以下是一个完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Word Cloud Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final List<WordPair> words = List<WordPair>.generate(100, (i) => WordPair.random());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Word Cloud'),
      ),
      body: Center(
        child: WordCloud(
          words: words.map((pair) => WordCloudData(
            text: pair.asPascalCase,
            size: 10 + (pair.hashCode % 100).toDouble(),
          )).toList(),
          width: MediaQuery.of(context).size.width,
          height: MediaQuery.of(context).size.height * 0.6,
          backgroundColor: Colors.grey[900],
          textStyle: TextStyle(
            color: Colors.white,
            fontWeight: FontWeight.bold,
          ),
          padding: 2.0,
          rotation: () => (Math.random() * 2 * 3.141592653589793).toDouble(),
        ),
      ),
    );
  }
}

class WordPair {
  final String first;
  final String second;

  WordPair(this.first, this.second);

  String get asPascalCase {
    return '${first.capitalize()}${second.capitalize()}';
  }

  @override
  int get hashCode => first.hashCode ^ second.hashCode;

  static WordPair random() {
    final words = List<String>.generate(
      1000,
      (i) => 'Word${i % 100}',
    );
    final random = Random();
    return WordPair(
      words[random.nextInt(words.length)],
      words[random.nextInt(words.length)],
    );
  }
}

解释

  1. 依赖添加:在pubspec.yaml中添加word_cloud依赖。

  2. 数据生成:我们创建了一个WordPair类来生成随机的单词对,并且提供了一个hashCode方法来生成不同的哈希值,用于后续的尺寸计算。

  3. UI构建:在MyHomePagebuild方法中,我们创建了一个WordCloud组件。

    • words:一个包含WordCloudData对象的列表,每个对象代表一个单词及其大小。
    • widthheight:词云的宽度和高度。
    • backgroundColor:词云的背景颜色。
    • textStyle:词云中文字的样式。
    • padding:词云中单词之间的间距。
    • rotation:每个单词的旋转角度,这里使用了随机数来生成不同的角度。
  4. 运行应用:运行你的Flutter应用,你应该能看到一个根据随机单词对生成的词云。

希望这个示例能帮助你在Flutter项目中成功使用word_cloud插件!

回到顶部