在該站點經驗豐富的用戶的幫助下,我能夠從 csv 檔案請求資料并將其傳遞給我的應用程式。特別是,當您單擊按鈕時,文本會發生變化。首先,這是串列中的第一項,然后是第二項,依此類推,直到最后。這正是我所需要的。
但問題是將來它會出錯。例如,如果串列中有超過 10 項,則在第五項之后文本不會更改。如果超過 100 個專案,則問題從第 25 個專案開始,依此類推。也就是說,不可能到達串列中的最后一項。
這是完整的代碼:
// CSV Experiment route
class CSVExperimentRoute extends StatelessWidget {
const CSVExperimentRoute({key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
title: 'CSV Experiment',
home: ListFromCSV(),
);
}
}
class ListFromCSV extends StatefulWidget {
const ListFromCSV({Key? key}) : super(key: key);
@override
_ListFromCSVState createState() => _ListFromCSVState();
}
class _ListFromCSVState extends State<ListFromCSV> {
List<List<dynamic>> _listData = [
[""]
];
int _listCount = 0;
bool _isFirstLoad = true;
@override
initState() {
_loadCSV();
}
// This function is only triggered at init, so we only load csv once
void _loadCSV() async {
String _rawData = await rootBundle.loadString("files/Text.csv");
_listData = const CsvToListConverter().convert(_rawData);
}
// This function is triggered when my button is pressed
void _nextCSV() {
setState(() {
_listData = _listData;
_listCount < _listData[0].length - 1
? _isFirstLoad
? _isFirstLoad = false
: _listCount
: _listCount;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("My CSV Attempt"),
),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const SizedBox(height: 30),
ClipRRect(
borderRadius: BorderRadius.circular(4),
child: Stack(
children: <Widget>[
Positioned.fill(
child: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: <Color>[
Color(0xFF0D47A1),
Color(0xFF1976D2),
Color(0xFF42A5F5),
],
),
),
),
),
TextButton(
style: TextButton.styleFrom(
padding: const EdgeInsets.all(16.0),
primary: Colors.white,
textStyle: const TextStyle(fontSize: 20),
),
onPressed: _nextCSV,
child: const Text('Click me to change Text'),
),
],
),
),
const SizedBox(height: 30),
ClipRRect(
borderRadius: BorderRadius.circular(4),
child: Stack(
children: <Widget>[
Positioned.fill(
child: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: <Color>[
// Color(0xFF0D47A1),
// Color(0xFF1976D2),
// Color(0xFF42A5F5),
],
),
),
),
),
Text(
_listData[_listCount][0],
textAlign: TextAlign.center,
overflow: TextOverflow.ellipsis,
style: const TextStyle(fontWeight: FontWeight.bold),
)
],
),
),
],
),
));
}
}
但我認為問題出在指定條件的部分:
// This function is triggered when my button is pressed
void _nextCSV() {
setState(() {
_listData = _listData;
_listCount < _listData[0].length - 1
? _isFirstLoad
? _isFirstLoad = false
: _listCount
: _listCount;
});
}
這是一個用于測驗的小檔案:FILE
提前致謝。
uj5u.com熱心網友回復:
問題不在于第 5 項或第 20 項。問題是您正在比較第一項串列的長度,而不是整個 CSV 串列的長度。只需洗掉 [0] 它就會為您作業。
void _nextCSV() {
setState(() {
_listData = _listData;
_listCount < _listData.length - 1
? _isFirstLoad ? _isFirstLoad = false
: _listCount
: _listCount;
});
}
希望這可以幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/497925.html
