Quiero averiguar todas las palabras que comienzan con #.

Por ejemplo = Esta es una #etiqueta

Quiero crear este (#tag) que se puede tocar y cambiar su color a azul. ¡Por favor avise algo!

Text("This is a #tag"),
2
Lalit Rawat 7 dic. 2020 a las 22:09

4 respuestas

La mejor respuesta

Puede usar Regex para buscar todas las palabras que comiencen con el carácter #. Luego use Text.rich o los widgets InlineSpan de RichText para mostrar solo las palabras coincidentes en azul y el widget WidgetSpan para hacer que las palabras coincidentes se puedan tocar. Consulte el código a continuación o ejecútelo directamente en DartPad https://dartpad.dev/c1fde787afc2792efd973752a7284d03

import 'package:flutter/material.dart';
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Flutter Demo"),
        ),
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final List<InlineSpan> textSpans = [];
    final String text = "This is a #tag. This is #tag2. This is #tag3.";
    final RegExp regex = RegExp(r"\#(\w+)");
    final Iterable<Match> matches = regex.allMatches(text);
    int start = 0;
    for (final Match match in matches) {
      textSpans.add(TextSpan(text: text.substring(start, match.start)));
      textSpans.add(WidgetSpan(
          child: GestureDetector(
              onTap: () => print("You tapped #${match.group(1)}"),
              child: Text('#${match.group(1)}',
                  style: const TextStyle(color: Colors.blue)))));
      start = match.end;
    }
    textSpans.add(TextSpan(text: text.substring(start, text.length)));
    return Text.rich(TextSpan(children: textSpans));
  }
}
2
bluenile 7 dic. 2020 a las 20:34

Aquí está el código que escribí. ¡No lo he probado, pero espero que funcione!

 List<String> hashAdder(String value) {
    List<String> tags = [];
    bool hashExist = value.contains('#');
    if (hashExist) {
      for (var i = 0; i < value.length; i++) {
        int hashIndex = value.indexOf('#');
        int hashEnd = value.indexOf(' ', hashIndex);
        tags.add(value.substring(hashIndex, hashEnd));
        value = value.substring(hashIndex);
      }
    }
    return tags;
  }
2
biniyam112 7 dic. 2020 a las 19:34

Primero, puede usar el método split () para obtener una lista de palabras en su oración. Luego, puede verificar cada palabra en esa lista, y si comienza con #, entonces puede agregarla a la lista hashTag. Se verá así:

    String s = "This is a #tag";
    List<String> splitted = s.split(" ");
    List<String> hashTags = List<String>();
    for (var item in splitted) {
      if (item.startsWith("#")) {
        hashTags.add(item);
      }
    }

    print(hashTags);
    // Expected output is: [#tag]

1
Akif 7 dic. 2020 a las 19:23

Puede lograr el resultado deseado usando RegEx en solo 2 líneas:

List<String> extractHashtags(String text) {
  Iterable<Match> matches = RegExp(r"\B(\#[a-zA-Z]+\b)").allMatches(text);
  return matches.map((m) => m[0]).toList();
}
3
Stefano A. 7 dic. 2020 a las 19:46