' 不是类型 'BuildContext' 的子类型,flutter"/>

首页 > 解决方案 > 颤振:类型'_InternalLinkedHashMap' 不是类型 'BuildContext' 的子类型

问题描述

颤振应用程序有一个小问题 - 我收到此错误:

类型“_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']),
      ),
    );
  }
}

标签: flutter

解决方案


传递contextNavigator.pushinnavigateToDetail方法

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),


    );
  }

}

推荐阅读