StatelessWidget内にListViewがあります。アイテムがあり、すべてのアイテムにチェックボックスが含まれています。誰かがアイテムをチェックするとき、ListViewがこれをパラメーターとして別のページに送信するようにします。しかし、私がそれをするとき、それは私にこのエラーを与えています:
I/flutter ( 7067): The following UnsupportedError was thrown while handling a gesture:
I/flutter ( 7067): Unsupported operation: Cannot add to an unmodifiable list
I/flutter ( 7067): When the exception was thrown, this was the stack:
これが私のコードです
class StudentsList extends StatelessWidget {
final List<Child> mList;
StudentsList({this.mList});
@override
Widget build(BuildContext context) {
List<Child> selectedList = [];
return Container(
margin: EdgeInsets.only(top: 50, bottom: 20),
child: ListView.builder(
shrinkWrap: true,
physics: ClampingScrollPhysics(),
itemCount: mList == null ? 0 : mList.length,
padding: EdgeInsets.only(right: 10),
itemBuilder: (BuildContext context, int position) {
return GestureDetector(
onTap: () {
if (selectedList.isEmpty) {
Navigator.push(
context,
new MaterialPageRoute(
builder: (BuildContext context) => SolokPage(
mChildList: [mList[position]],
isTeacher: true,
),
),
);
} else {
if (!selectedList.contains(mList[position])) {
selectedList.add(mList[position]);
}
Navigator.push(
context,
new MaterialPageRoute(
builder: (BuildContext context) => SolokPage(
mChildList: selectedList,
isTeacher: true,
),
),
);
}
},
child: StudentItem(
student: mList[position],
),
);
},
),
);
}
}
class StudentsList extends StatelessWidget {
// final means, flutter will not change value in future
final List<Child> mList;
StudentsList({this.mList});
どうして ?
Flutterは、StatelessWidgetにビジネスロジックが存在しないことを想定しているためです。学生リストに新しい学生を追加する必要がある場合、それはビジネスロジックと見なされます。学生リストの一部の学生を削除する必要がある場合、それはビジネスロジックと見なされます。
したがって、ステートレスウィジェットを使用することにより、Flutterは、画面上での表示方法、幅、制約などにのみ焦点を当てます。
そのため、のfinal
クラスプロパティの前に構文が見つかりましたStatelessWidget
。
私たちの大学生活に似ています。私たちの学年は、最終報告でマークすることを、私たちは大学を卒業した後も変わりません。最終報告書にあると言われているように、それは最終でなければなりません。
どうして ?flutterは、ビジネスロジックがStatefulWidgetに存在することを期待しているためです。
だから私はこれからStudentsListウィジェットを変更することをお勧めします:
class StudentsList extends StatelessWidget {
final List<Child> mList; // this is the issue
StudentsList({this.mList});
これに:
class StudentsList extends StatefulWidget {
@override
_StudentsListState createState() => _StudentsListState();
}
class _StudentsListState extends State<StudentsList> {
// final List<Child> mList; // Do not mark this as final
List<Child> mList;
...
}
問題に密接に関連している作業リポジトリを探すことができます。Github
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加