Чтение локального файла FLUTTER Json и страница сведений
Привет всем, я новичок в флаттере, поэтому я делаю этот проект, и у меня возникла проблема. я хочу иметь страницу с подробными сведениями об элементах, перечисленных в локальном файле json. но я получаю ошибки, я не знаю, где моя ошибка. поэтому я надеюсь найти решение, вот мой код:
import 'dart:core';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MaladieDetails {
final String titreCh;
final String numCh;
final String titreCat;
final String codeM;
final String titreM;
final String classeM;
MaladieDetails(
{required this.titreCh,
required this.numCh,
required this.titreCat,
required this.codeM,
required this.titreM,
required this.classeM});
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
// Remove the debug banner
debugShowCheckedModeBanner: false,
title: 'Kindacode.com',
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
HomePageState createState() => HomePageState();
}
class HomePageState extends State<HomePage> {
// This holds a list of fiction maladies
// You can use data fetched from a database or a server as well
final List<Map<String, dynamic>> _maladies = [
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A00",
"titre_m": "Choléra",
"classe_m": "Choléra"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A00.0",
"titre_m": "A Vibrio cholerae 01, biovar cholerae",
"classe_m": "Choléra",
"explication_m": "A Vibrio cholerae 01, biovar cholerae"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A00.1",
"titre_m": "A Vibrio cholerae 01, biovar El Tor",
"classe_m": "Choléra",
"explication_m": "A Vibrio cholerae 01, biovar El Tor"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A00.9",
"titre_m": "Choléra, sans précision",
"classe_m": "Choléra",
"explication_m": "Choléra, sans précision"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A01",
"titre_m": "Fièvres typhoïde et paratyphoïde",
"classe_m": "Fièvres typhoïde et paratyphoïde"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A01.0",
"titre_m": "Fièvre typhoïde",
"classe_m": "Fièvres typhoïde et paratyphoïde",
"explication_m": "Fièvre typhoïde"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A01.1",
"titre_m": "Paratyphoïde A",
"classe_m": "Fièvres typhoïde et paratyphoïde",
"explication_m": "Paratyphoïde A"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A01.2",
"titre_m": "Paratyphoïde B",
"classe_m": "Fièvres typhoïde et paratyphoïde",
"explication_m": "Paratyphoïde B"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A01.3",
"titre_m": "Paratyphoïde C",
"classe_m": "Fièvres typhoïde et paratyphoïde",
"explication_m": "Paratyphoïde C"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A01.4",
"titre_m": "Paratyphoïde, sans précision",
"classe_m": "Fièvres typhoïde et paratyphoïde",
"explication_m": "Paratyphoïde, sans précision"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A02",
"titre_m": "Autres infections à Salmonella",
"classe_m": "Autres infections à Salmonella"
},
];
// This list holds the data for the list view
List<Map<String, dynamic>> _trouverMaladies = [];
@override
initState() {
// at the beginning, all maladies are shown
_trouverMaladies = _maladies;
super.initState();
}
// This function is called whenever the text field changes
void _runFilter(String enteredKeyword) {
List<Map<String, dynamic>> results = [];
if (enteredKeyword.isEmpty) {
// if the search field is empty or only contains white-space, we'll display all maladies
results = _maladies;
} else {
results = _maladies
.where((maladie) => maladie["titre_m"]
.toLowerCase()
.contains(enteredKeyword.toLowerCase()))
.toList();
// we use the toLowerCase() method to make it case-insensitive
}
// Refresh the UI
setState(() {
_trouverMaladies = results;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Kindacode.com'),
),
body: Padding(
padding: const EdgeInsets.all(10),
child: Column(
children: [
const SizedBox(
height: 20,
),
TextField(
onChanged: (value) => _runFilter(value),
decoration: const InputDecoration(
labelText: 'Cherchez ...', suffixIcon: Icon(Icons.search)),
),
const SizedBox(
height: 20,
),
Expanded(
child: _trouverMaladies.isNotEmpty
? ListView.builder(
itemCount: _trouverMaladies.length,
itemBuilder: (context, index) => Card(
color: Colors.amberAccent,
elevation: 4,
margin: const EdgeInsets.symmetric(vertical: 10),
child: ListTile(
leading: Text(
_trouverMaladies[index]["code_m"].toString(),
style: const TextStyle(fontSize: 24),
),
title: Text(_trouverMaladies[index]['titre_m']),
subtitle: Text(
_trouverMaladies[index]["titre_cat"].toString()),
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => DetailScreen(
maladieDetails: _trouverMaladies[index]
['titre_m']),
),
);
},
),
),
)
: const Text(
'No results found',
style: TextStyle(fontSize: 24),
),
),
],
),
),
);
}
}
class DetailScreen extends StatelessWidget {
// In the constructor, require a maladieDetails.
const DetailScreen({super.key, required this.maladieDetails});
// Declare a field that holds the maladieDetails.
final MaladieDetails maladieDetails;
@override
Widget build(BuildContext context) {
// Use the maladieDetails to create the UI.
return Scaffold(
appBar: AppBar(
title: Text(maladieDetails.titreM),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(maladieDetails.codeM),
),
);
}
}
ошибки отображаются после того, как я выбираю элемент из списка.
1 ответ
Чего не хватает, так это десериализации из JSON вMaladieDetails
объект сущности. Как правило, это функция, называемаяfromJson
который отвечает за десериализацию JSON в свойства объекта.
я реализовалMaladieDetails.fronJson
и изменил некоторые другие места, чтобы заставить его работать. Взглянем:
import 'dart:core';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MaladieDetails {
final String titreCh;
final String numCh;
final String titreCat;
final String codeM;
final String titreM;
final String classeM;
MaladieDetails(
{required this.titreCh,
required this.numCh,
required this.titreCat,
required this.codeM,
required this.titreM,
required this.classeM});
MaladieDetails.fromJson(Map<String, dynamic> json)
: titreCh = json['titre_ch'],
numCh = json['num_ch'],
titreCat = json['titre_cat'],
codeM = json['code_m'],
titreM = json['titre_m'],
classeM = json['classe_m'];
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
// Remove the debug banner
debugShowCheckedModeBanner: false,
title: 'Kindacode.com',
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
HomePageState createState() => HomePageState();
}
class HomePageState extends State<HomePage> {
// This holds a list of fiction maladies
// You can use data fetched from a database or a server as well
final _maladies = [
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A00",
"titre_m": "Choléra",
"classe_m": "Choléra"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A00.0",
"titre_m": "A Vibrio cholerae 01, biovar cholerae",
"classe_m": "Choléra",
"explication_m": "A Vibrio cholerae 01, biovar cholerae"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A00.1",
"titre_m": "A Vibrio cholerae 01, biovar El Tor",
"classe_m": "Choléra",
"explication_m": "A Vibrio cholerae 01, biovar El Tor"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A00.9",
"titre_m": "Choléra, sans précision",
"classe_m": "Choléra",
"explication_m": "Choléra, sans précision"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A01",
"titre_m": "Fièvres typhoïde et paratyphoïde",
"classe_m": "Fièvres typhoïde et paratyphoïde"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A01.0",
"titre_m": "Fièvre typhoïde",
"classe_m": "Fièvres typhoïde et paratyphoïde",
"explication_m": "Fièvre typhoïde"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A01.1",
"titre_m": "Paratyphoïde A",
"classe_m": "Fièvres typhoïde et paratyphoïde",
"explication_m": "Paratyphoïde A"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A01.2",
"titre_m": "Paratyphoïde B",
"classe_m": "Fièvres typhoïde et paratyphoïde",
"explication_m": "Paratyphoïde B"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A01.3",
"titre_m": "Paratyphoïde C",
"classe_m": "Fièvres typhoïde et paratyphoïde",
"explication_m": "Paratyphoïde C"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A01.4",
"titre_m": "Paratyphoïde, sans précision",
"classe_m": "Fièvres typhoïde et paratyphoïde",
"explication_m": "Paratyphoïde, sans précision"
},
{
"titre_ch": "Certaines maladies infectieuses et parasitaires",
"num_ch": "1",
"titre_cat": "Maladies intestinales infectieuses",
"code_m": "A02",
"titre_m": "Autres infections à Salmonella",
"classe_m": "Autres infections à Salmonella"
},
].map((e) => MaladieDetails.fromJson(e)).toList();
// This list holds the data for the list view
List<MaladieDetails> _trouverMaladies = [];
@override
initState() {
// at the beginning, all maladies are shown
_trouverMaladies = [..._maladies];
super.initState();
}
// This function is called whenever the text field changes
void _runFilter(String enteredKeyword) {
List<MaladieDetails> results = [];
if (enteredKeyword.isEmpty) {
// if the search field is empty or only contains white-space, we'll display all maladies
results = [..._maladies];
} else {
results = _maladies
.where((maladie) => maladie.titreM
.toLowerCase()
.contains(enteredKeyword.toLowerCase()))
.toList();
// we use the toLowerCase() method to make it case-insensitive
}
// Refresh the UI
setState(() {
_trouverMaladies = results;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Kindacode.com'),
),
body: Padding(
padding: const EdgeInsets.all(10),
child: Column(
children: [
const SizedBox(
height: 20,
),
TextField(
onChanged: (value) => _runFilter(value),
decoration: const InputDecoration(
labelText: 'Cherchez ...', suffixIcon: Icon(Icons.search)),
),
const SizedBox(
height: 20,
),
Expanded(
child: _trouverMaladies.isNotEmpty
? ListView.builder(
itemCount: _trouverMaladies.length,
itemBuilder: (context, index) => Card(
color: Colors.amberAccent,
elevation: 4,
margin: const EdgeInsets.symmetric(vertical: 10),
child: ListTile(
leading: Text(
_trouverMaladies[index].codeM,
style: const TextStyle(fontSize: 24),
),
title: Text(_trouverMaladies[index].titreM),
subtitle: Text(_trouverMaladies[index].titreCat),
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => DetailScreen(
maladieDetails: _trouverMaladies[index]),
),
);
},
),
),
)
: const Text(
'No results found',
style: TextStyle(fontSize: 24),
),
),
],
),
),
);
}
}
class DetailScreen extends StatelessWidget {
// In the constructor, require a maladieDetails.
const DetailScreen({super.key, required this.maladieDetails});
// Declare a field that holds the maladieDetails.
final MaladieDetails maladieDetails;
@override
Widget build(BuildContext context) {
// Use the maladieDetails to create the UI.
return Scaffold(
appBar: AppBar(
title: Text(maladieDetails.titreM),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(maladieDetails.codeM),
),
);
}
}