应用程序抖动有一个小问题-我收到此错误:
类型'_InternalLinkedHashMap'不是类型'BuildContext'的子类型
错误是“ onTap”,但无法确定问题所在。当我按ListTile时,会引发错误。我在Flutter中还很陌生,因此希望您的帮助,让我可以继续学习
主要:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:fulltext_search/searchservice.dart';
import 'detailpage.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
var queryResultSet = [];
var tempSearchStore = [];
var tempCvr = [];
initiateSearch(value) {
if (value.length == 0) {
setState(() {
queryResultSet = [];
tempSearchStore = [];
tempCvr = [];
});
}
var capitalizedValue =
value.substring(0, 1).toUpperCase() + value.substring(1);
if (queryResultSet.length == 0 && value.length == 1) {
SearchService().searchByName(value).then((QuerySnapshot docs) {
for (int i = 0; i < docs.documents.length; ++i) {
queryResultSet.add(docs.documents[i].data);
}
});
} else {
tempSearchStore = [];
tempCvr = [];
queryResultSet.forEach((element) {
if (element['businessName'].startsWith(capitalizedValue)) {
setState(() {
tempSearchStore.add(element);
tempCvr.add(element);
});
}
});
}
}
// navigateToDetail(data) {
// Navigator.push(context, MaterialPageRoute(builder: (context) =>DetailPage(post: data,)));
// }
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: Text('Firestore search'),
),
body: ListView(children: <Widget>[
Padding(
padding: const EdgeInsets.all(10.0),
child: TextField(
onChanged: (val) {
initiateSearch(val);
},
decoration: InputDecoration(
prefixIcon: IconButton(
color: Colors.black,
icon: Icon(Icons.arrow_back),
iconSize: 20.0,
onPressed: () {
Navigator.of(context).pop();
},
),
contentPadding: EdgeInsets.only(left: 25.0),
hintText: 'Søg efter firmanavn',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(4.0))),
),
),
SizedBox(height: 10.0),
ListView(
padding: EdgeInsets.only(left: 10.0, right: 10.0, top: 10.0, bottom: 10.0),
//crossAxisCount: 1,
//crossAxisSpacing: 10.0,
//mainAxisSpacing: 10.0,
primary: false,
shrinkWrap: true,
children: tempSearchStore.map((element) {
return buildResultCard(element);
}).toList())
]));
}
}
Widget buildResultCard(data) {
navigateToDetail(data) {
Navigator.push(data, MaterialPageRoute(builder: (context) =>DetailPage(post: data,)));
}
if (data['advarsel'] == '1') {
return ListTile(
title: Text(data['businessName']),
onTap: () => navigateToDetail(data),
//leading: Text(data['advarsel']),
leading: CircleAvatar(
backgroundColor: Colors.red,
),
subtitle: Text(data['cvr']),
trailing: Icon(Icons.keyboard_arrow_right),
);
} else {
return ListTile(
title: Text(data['businessName']),
//leading: Text(data['advarsel']),
leading: CircleAvatar(
backgroundColor: Colors.yellow,
),
subtitle: Text(data['cvr']),
trailing: Icon(Icons.keyboard_arrow_right),
);
}
}
详细信息页面:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'main.dart';
class DetailPage extends StatefulWidget {
final DocumentSnapshot post;
DetailPage({this.post});
@override
_DetailPageState createState() => _DetailPageState();
}
class _DetailPageState extends State<DetailPage> {
@override
Widget build(BuildContext context) {
return Card(
child: ListTile(
title: Text(widget.post.data['businessName']),
),
);
}
}
答案 0 :(得分:1)
通过context
方法将Navigator.push
传递给navigateToDetail
Navigator.push(data, MaterialPageRoute(builder: (context) =>DetailPage(post: data,)));
至Navigator.push(context, MaterialPageRoute(builder: (context) =>DetailPage(post: data,)));
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:fulltext_search/searchservice.dart';
import 'detailpage.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
var queryResultSet = [];
var tempSearchStore = [];
var tempCvr = [];
initiateSearch(value) {
if (value.length == 0) {
setState(() {
queryResultSet = [];
tempSearchStore = [];
tempCvr = [];
});
}
var capitalizedValue =
value.substring(0, 1).toUpperCase() + value.substring(1);
if (queryResultSet.length == 0 && value.length == 1) {
SearchService().searchByName(value).then((QuerySnapshot docs) {
for (int i = 0; i < docs.documents.length; ++i) {
queryResultSet.add(docs.documents[i].data);
}
});
} else {
tempSearchStore = [];
tempCvr = [];
queryResultSet.forEach((element) {
if (element['businessName'].startsWith(capitalizedValue)) {
setState(() {
tempSearchStore.add(element);
tempCvr.add(element);
});
}
});
}
}
// navigateToDetail(data) {
// Navigator.push(context, MaterialPageRoute(builder: (context) =>DetailPage(post: data,)));
// }
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: Text('Firestore search'),
),
body: ListView(children: <Widget>[
Padding(
padding: const EdgeInsets.all(10.0),
child: TextField(
onChanged: (val) {
initiateSearch(val);
},
decoration: InputDecoration(
prefixIcon: IconButton(
color: Colors.black,
icon: Icon(Icons.arrow_back),
iconSize: 20.0,
onPressed: () {
Navigator.of(context).pop();
},
),
contentPadding: EdgeInsets.only(left: 25.0),
hintText: 'Søg efter firmanavn',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(4.0))),
),
),
SizedBox(height: 10.0),
ListView(
padding: EdgeInsets.only(left: 10.0, right: 10.0, top: 10.0, bottom: 10.0),
//crossAxisCount: 1,
//crossAxisSpacing: 10.0,
//mainAxisSpacing: 10.0,
primary: false,
shrinkWrap: true,
children: tempSearchStore.map((element) {
return buildResultCard(context, element);//pass context here
}).toList())
]));
}
}
navigateToDetail(context, data) {
Navigator.push(context, MaterialPageRoute(builder: (context) => DetailPage(post: data,)));//use that context here
}
Widget buildResultCard(context, data) {//get context as param
if (data['advarsel'] == '1') {
return ListTile(
title: Text(data['businessName']),
onTap: () => navigateToDetail(context, data),//pass the same
//leading: Text(data['advarsel']),
leading: CircleAvatar(
backgroundColor: Colors.red,
),
subtitle: Text(data['cvr']),
trailing: Icon(Icons.keyboard_arrow_right),
);
} else {
return ListTile(
title: Text(data['businessName']),
//leading: Text(data['advarsel']),
leading: CircleAvatar(
backgroundColor: Colors.yellow,
),
subtitle: Text(data['cvr']),
trailing: Icon(Icons.keyboard_arrow_right),
);
}
}