一個領域的初學者,我有這個作業的代碼,但是在點擊的情況下出現錯誤當我點擊任何卡片時,所有卡片也會打開。我想打開一張我點擊的卡片
import 'dart:io';
import 'package:english_club/data/im.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class Novals extends StatefulWidget {
@override
_NovalsState createState()
{
return _NovalsState();
}
}
class _NovalsState extends State<Novals> {
bool _expanded = false;
var _test = "Full Screen";
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
body: ListView.builder(
itemCount: storys.length,
itemBuilder: (context, index){
return SingleChildScrollView(
child: Column(
children: [
Center(
child: Container(
margin: EdgeInsets.all(10),
color: Colors.green,
child: ExpansionPanelList(
animationDuration: Duration(milliseconds: 2000),
children: [
ExpansionPanel(
headerBuilder: (context, isExpanded) {
return ListTile(
title: Text(storys[index]["name"], style: TextStyle(color: Colors.black),),
);
},
body:ListTile(
title: Text(storys[index]["lines"],style: TextStyle(color: Colors.black)),
),
isExpanded: _expanded,
canTapOnHeader: true,
),
],
dividerColor: Colors.grey,
expansionCallback: (panelIndex, isExpanded) {
_expanded = !_expanded;
setState(() {
});
},
),
),
),
]
),
);
}
),
);
}
}
我試圖解決它,但我無法瞄準代碼顯示故事的名稱,當用戶點擊它時,整個故事就會出現
uj5u.com熱心網友回復:
首先,您應該洗掉SingleChildScrollView作為ListView孩子的。ListView.builder足以滾動到您的Scaffold.
對于主要問題,您應該將每個專案拆分為Widget具有自己_expanded狀態的單獨專案。這將使您的 UI 更快,小部件將單獨展開,并且在每個專案之后無需重新加載整個螢屏setState()。
示例代碼:
class Novals extends StatefulWidget {
@override
_NovalsState createState()
{
return _NovalsState();
}
}
class _NovalsState extends State<Novals> {
var _test = "Full Screen";
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
body: ListView.builder(
itemCount: storys.length,
itemBuilder: (context, index){
return StoryWidget(story: storys[index]);
}
),
);
}
}
class StoryWidget extends StatefulWidget {
final Map<String, dynamic> story;
const StoryWidget({Key? key, required this.story}) : super(key: key);
@override
_StoryWidgetState createState() => _StoryWidgetState();
}
class _StoryWidgetState extends State<StoryWidget> {
bool _expanded = false;
@override
Widget build(BuildContext context) {
return Column(
children: [
Center(
child: Container(
margin: EdgeInsets.all(10),
color: Colors.green,
child: ExpansionPanelList(
animationDuration: Duration(milliseconds: 2000),
children: [
ExpansionPanel(
headerBuilder: (context, isExpanded) {
return ListTile(
title: Text(widget.story["name"], style: TextStyle(color: Colors.black),),
);
},
body:ListTile(
title: Text(widget.story["lines"],style: TextStyle(color: Colors.black)),
),
isExpanded: _expanded,
canTapOnHeader: true,
),
],
dividerColor: Colors.grey,
expansionCallback: (panelIndex, isExpanded) {
_expanded = !_expanded;
setState(() {});
},
),
),
),
]
);
}
}
P / s:將您story放入模型類jsonDecode()而不是Map直接使用是一個好習慣。從長遠來看,它將幫助您避免錯誤和更好的維護
uj5u.com熱心網友回復:
問題是,你使用相同的_expanded變數在您的作品ListView。
class _NovalsState extends State<Novals> {
bool _expanded = false;
...
@override
Widget build(BuildContext context) {
...
}
}
因此,當您itemBuilder在 中呼叫時ListView,它對_expanded每個專案使用相同的值。
解決方案:
將_expanded變數從StatebodyitemBuilder函式中移到 to 中。
class _NovalsState extends State<Novals> {
var _test = "Full Screen";
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
body: ListView.builder(
itemCount: storys.length,
itemBuilder: (context, index) {
bool _expanded = false;
return SingleChildScrollView(
child: Column(children: [
Center(
child: Container(
margin: EdgeInsets.all(10),
color: Colors.green,
child: ExpansionPanelList(
animationDuration: Duration(milliseconds: 2000),
children: [
ExpansionPanel(
headerBuilder: (context, isExpanded) {
return ListTile(
title: Text(
storys[index]["name"],
style: TextStyle(color: Colors.black),
),
);
},
body: ListTile(
title: Text(storys[index]["lines"],
style: TextStyle(color: Colors.black)),
),
isExpanded: _expanded,
canTapOnHeader: true,
),
],
dividerColor: Colors.grey,
expansionCallback: (panelIndex, isExpanded) {
_expanded = !_expanded;
setState(() {});
},
),
),
),
]),
);
}),
);
}
}
檢查Dart 的詞法范圍
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/406823.html
標籤:
