[英]Display a text string and change it dynamically Flutter/Dart
基本上我想要做的是顯示從包含許多其他文件的文件中獲取的名稱,並在短暫的延遲后,給定的名稱變為另一個詞。 我想更改的文本位於Text()
小部件內。
class ReadTextFile extends StatefulWidget {
const ReadTextFile({Key? key}) : super(key: key);
@override
_ReadTextFileState createState() => _ReadTextFileState();
}
/*
* Retriving data from file, picking a random word and assign it to dataFromFile
*/
class _ReadTextFileState extends State<ReadTextFile> {
String dataFromFile = "";
static List<String> listOne = []; //contains all jobs.txt content, from top to bottom
int randomIndex = Random().nextInt(1027); //quick fix to "RangeError" thrown by Random().nextInt(listOne.length)
Future<void> readText() async {
final String response = await rootBundle.loadString('assets/jobs.txt');
listOne = response.split(',');
setState(() {
dataFromFile = listOne[randomIndex];
});
}
@override
Widget build(BuildContext context) {
readText();
// showRandomJob();
return Container(child: Center(child: Text(dataFromFile)));
}
}
小部件樹:
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final appTitle = 'ListGenerator';
return MaterialApp(
home: Scaffold(
appBar: AppBar(
foregroundColor: Color.fromARGB(255, 32, 75, 132),
title: Text(appTitle),
centerTitle: true,
backgroundColor: Color.fromARGB(255, 11, 161, 242),
),
body: Column(
children: const[
Expanded(
flex: 1,
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: ReadTextFile(),
)),
],
),
),
);
}
}
另外,我想知道為什么將listOne.length
作為參數傳遞給Random.nextInt()
會產生這兩個錯誤。
運行熱重啟后:
RangeError (max): Must be positive and <= 2^32: Not in inclusive range 1..4294967296:
0
See also: https://flutter.dev/docs/testing/errors
熱重啟后運行熱重載:
'package:flutter/src/widgets/framework.dart': Failed assertion: line 6205 pos 12: 'child == _child': is not true. See also: https//flutter.dev/docs/testing/errors
readText()
是一個 Future 方法,在使用它的數據之前需要等待。 接下來的事情是我們無法判斷響應列表應該是什么。 我們需要根據列表項采取行動。
class _ReadTextFileState extends State<ReadTextFile> {
String dataFromFile = "";
static List<String> listOne = [];
Future<void> readText() async {
final String response = await rootBundle.loadString('assets/jobs.txt');
listOne = response.split(',');
int c = 0;
if (listOne.isEmpty) return;
Timer.periodic(Duration(seconds: 1), (timer) {
if (c == listOne.length - 1) {
timer.cancel();
return;
}
if (c != 0) dataFromFile += ",";
dataFromFile += listOne[c];
c++;
setState(() {});
});
}
void initData() async {
await readText();
}
@override
void initState() {
super.initState();
initData();
}
@override
Widget build(BuildContext context) {
return Container(child: Center(child: Text(dataFromFile)));
}
}
在 initState 內部使用Timer()
initState
readText()
randomIndex
行 function
import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class ReadTextFile extends StatefulWidget {
@override
_ReadTextFileState createState() => _ReadTextFileState();
}
class _ReadTextFileState extends State<ReadTextFile> {
String dataFromFile = "";
static List<String> listOne = [];
Future<void> readText() async {
final String response = await rootBundle.loadString('assets/jobs.txt');
listOne = response.split(',');
int randomIndex = Random().nextInt(listOne.length);
setState(() {
dataFromFile += listOne[randomIndex]+", ";
});
}
@override
void initState() {
// TODO: implement initState
super.initState();
Timer.periodic(Duration(seconds: 1), (val) async {
await readText();
});
}
@override
Widget build(BuildContext context) {
return Container(child: Center(child: Text(dataFromFile)));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.