Как Отобразить Случайный элемент списка? [Каждые 9 секунд]

#list #flutter #random

Вопрос:

Есть ли способ автоматически отображать случайную цитату каждые 9 секунд?

Ниже приведена усеченная часть кода, которая имеет значение:

 
final List<String> RandomQuotes = [ ... ] // (one hundreds quotes here)

var randomQuote = (RandomQuotes.toList()..shuffle()).first;

:

:

:

... Text(randomQuote, Style:...)
 

Я попробовал предложенный вами код, но var randomQuote не используется. Как видно на изображениях ниже.

Является ли таймер периодическим в нужном месте?

Случайная цитата в эшафоте

Возвращена ошибка кода Гийома

Комментарии:

1. Проверьте класс таймера: api.flutter.dev/flutter/dart-async/Timer/Timer.periodic.html

Ответ №1:

Довольно просто просто используйте a Timer.periodic и определите продолжительность 9 секунд:

 import 'dart:async';
import 'dart:math';

final items = <String>['Hi', 'Hello', 'Test'];

Timer.periodic(Duration(seconds: 9), (_) {
  final _random = Random();
  final item = items[_random.nextInt(items.length)];
  print(item);
});
 

Попробуйте полный код на DartPad

Комментарии:

1. обновил свой код выше с результатами, посмотрите, Гийом

2. Это происходит потому, что ваша переменная randomQuote объявлена внутри таймера и недоступна. Вам нужно объявить randomQuote вне таймера (но таймер все равно назначит свое значение), вы также можете захотеть выполнить вызов setState , чтобы ваш пользовательский интерфейс был обновлен новым назначенным словом.

3. « Таймер.периодический(Длительность(секунд: 9), (_) { Заданное состояние(() {}); }); var randomQuote = (случайные цитаты..перемешать()).первый; « Я изменил код на этот Guillaume, изменение происходит, но каждые 9 секунд, когда цитата обновляется, она обновляется дважды подряд, прежде чем оставаться на одной в течение 9 секунд и обновляться еще дважды, я вижу скачок. Даже когда я использовал ваш код, а не список перетасовки, он все равно остался прежним. Есть идеи, как это остановить?

4. Поскольку ваш таймер объявлен внутри метода сборки, вы должны объявить его внутри initState

5. верно. разгадал ее! Спасибо! знаете ли вы какой-нибудь способ заставить старую цитату исчезнуть, а новую цитату исчезнуть?

Ответ №2:

Самое простое решение в одной строке:

 final List<String> RandomQuotes = [ ... ] // (one hundreds quotes here)

    Timer.periodic(Duration(seconds: 9), (_) {
    var randomQuote = (RandomQuotes..shuffle()).first;

});
 

Комментарии:

1. обновил свой код выше с результатами, посмотрите на Gourango

2. Переменная, объявленная внутри метода, не может быть доступна глобально в классе. Пожалуйста, взгляните на программирование дротиков. Я надеюсь, что это решит вашу проблему.