【问题标题】:Dart- Exception after run my flutter search appDart-运行我的颤振搜索应用程序后出现异常
【发布时间】:2021-04-15 00:16:18
【问题描述】:

我的问题是,当我用红屏执行它时,我该如何处理出现在我的手机上的异常错误
我是 Flutter 的新手,我写了简单的搜索栏小部件。执行后出现异常:

 ErrorSummary('MediaQuery.of() called with a context that does not contain a MediaQuery.'),
      ErrorDescription(
        'No MediaQuery ancestor could be found starting from the context that was passed '
        'to MediaQuery.of(). This can happen because you do not have a WidgetsApp or '
        'MaterialApp widget (those widgets introduce a MediaQuery), or it can happen '
        'if the context you use comes from a widget above those widgets.'

这是搜索栏的 main.dart:

import 'package:flutter/material.dart';

void main() {
  runApp(MyFirstApp());
}

class MyFirstApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Search..."),
        actions: <Widget>[
          IconButton(
              icon: Icon(Icons.search),
              onPressed: () {
                showSearch(context: context, delegate: DataSearch());
              })
        ],
      ),
      drawer: Drawer(),
    );
  }
}

class DataSearch extends SearchDelegate<String> {
  final data1 = ["Amr", "Amir", "Moatasem", "Gamal", "Tasneem"];
  final data2 = ["Amr", "Amir"];
  @override
  List<Widget> buildActions(BuildContext context) {
    return <Widget>[
      IconButton(
          icon: Icon(Icons.clear),
          onPressed: () {
            query = " ";
          })
    ];
  }

  @override
  Widget buildLeading(BuildContext context) {
    return IconButton(
        icon: AnimatedIcon(
          icon: AnimatedIcons.menu_arrow,
          progress: transitionAnimation,
        ),
        onPressed: () {
          close(context, null);
        });
  }

  @override
  Widget buildResults(BuildContext context) {
    return Container(
      child: Center(
        child: Text(query),
      ),
    );
  }

  @override
  Widget buildSuggestions(BuildContext context) {
    final suggestion = query.isEmpty
        ? data2
        : data1.where((p) => p.startsWith(query)).toList();
    return ListView.builder(
      itemBuilder: (context, index) => ListTile(
        onTap: () {
          showResults(context);
        },
        leading: Icon(Icons.question_answer),
        title: RichText(
          text: TextSpan(
              text: suggestion[index].substring(0, query.length),
              style:
                  TextStyle(color: Colors.black, fontStyle: FontStyle.italic),
              children: [
                TextSpan(
                    text: suggestion[index].substring(query.length),
                    style: TextStyle(color: Colors.red))
              ]),
        ),
      ),
      itemCount: suggestion.length,
    );
  }
}

这是小部件 test.dart


import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

import 'package:testtest/main.dart';

void main() {
  testWidgets('Counter increments smoke test', (WidgetTester tester) async {
    // Build our app and trigger a frame.
    await tester.pumpWidget(MyFirstApp());

    // Verify that our counter starts at 0.
    expect(find.text('0'), findsOneWidget);
    expect(find.text('1'), findsNothing);

    // Tap the '+' icon and trigger a frame.
    await tester.tap(find.byIcon(Icons.add));
    await tester.pump();

    // Verify that our counter has incremented.
    expect(find.text('0'), findsNothing);
    expect(find.text('1'), findsOneWidget);
  });
}

我找到了 MediaQuery.of,但不明白它如何与现有小部件一起使用?它接受 BuildContext 作为参数。

 static MediaQueryData of(BuildContext context, { bool nullOk = false }) {
    assert(context != null);
    assert(nullOk != null);
    final MediaQuery query = context.dependOnInheritedWidgetOfExactType<MediaQuery>();
    if (query != null)
      return query.data;

【问题讨论】:

  • MediaQuery 的代码在哪里?

标签: flutter dart exception


【解决方案1】:

您的应用缺少顶级必需的 MaterialApp 小部件。这导致了这个错误。

下面的代码将解决这个问题:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyFirstApp(),
    );
  }
}


class MyFirstApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Search..."),
        actions: <Widget>[
          IconButton(
              icon: Icon(Icons.search),
              onPressed: () {
                showSearch(context: context, delegate: DataSearch());
              })
        ],
      ),
      drawer: Drawer(),
    );
  }
}

class DataSearch extends SearchDelegate<String> {
  final data1 = ["Amr", "Amir", "Moatasem", "Gamal", "Tasneem"];
  final data2 = ["Amr", "Amir"];
  @override
  List<Widget> buildActions(BuildContext context) {
    return <Widget>[
      IconButton(
          icon: Icon(Icons.clear),
          onPressed: () {
            query = " ";
          })
    ];
  }

  @override
  Widget buildLeading(BuildContext context) {
    return IconButton(
        icon: AnimatedIcon(
          icon: AnimatedIcons.menu_arrow,
          progress: transitionAnimation,
        ),
        onPressed: () {
          close(context, null);
        });
  }

  @override
  Widget buildResults(BuildContext context) {
    return Container(
      child: Center(
        child: Text(query),
      ),
    );
  }

  @override
  Widget buildSuggestions(BuildContext context) {
    final suggestion = query.isEmpty
        ? data2
        : data1.where((p) => p.startsWith(query)).toList();
    return ListView.builder(
      itemBuilder: (context, index) => ListTile(
        onTap: () {
          showResults(context);
        },
        leading: Icon(Icons.question_answer),
        title: RichText(
          text: TextSpan(
              text: suggestion[index].substring(0, query.length),
              style:
              TextStyle(color: Colors.black, fontStyle: FontStyle.italic),
              children: [
                TextSpan(
                    text: suggestion[index].substring(query.length),
                    style: TextStyle(color: Colors.red))
              ]),
        ),
      ),
      itemCount: suggestion.length,
    );
  }
}

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2021-01-29
    • 2019-04-25
    • 2022-01-09
    • 2021-06-27
    • 2020-03-15
    • 2022-01-25
    • 2021-03-20
    • 1970-01-01
    相关资源
    最近更新 更多