在MatterialApp.of()内部,用一个不包含MediaQuery的上下文来调用。MediaQuery.of()中调用的上下文不包含MediaQuery。

问题描述 投票:0回答:1

我试图动态设置一个抽屉大小。

import 'package:flutter/material.dart';
import './screens/tab_screen.dart';

//widgets
import './widgets/main_drawer.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: TabWidget(),
        endDrawer: Container(
          width: MediaQuery.of(context).size.width * 0.65,
          child: MainDrawer(),
        ),
      ),
      title: "Ali Azad",
      // routes: {
      //   '/': (_) => TabWidget(),
      // },
    );
  }
}

但我得到了这个错误=MediaQuery.of()调用一个不包含MediaQuery的上下文。

flutter navigation-drawer
1个回答
1
投票

如果你仔细看一下你的代码,你会发现你的build方法是用context调用的,而到调用的时候,并没有任何之前的Widget,也就是说当你的build被调用的时候,你的MaterialApp还不存在,所以BuildContext并没有任何之前的MaterialApp,你可以通过这样拆分你的代码来解决这个问题。

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Home(),
      title: "Ali Azad",
    );
  }
}

// This Home Widget will be a child of MaterialApp, and the BuildContext has access to this Material widget.
class Home extends StatelessWidget{
  @override
  Widget build(BuildContext context){
    return Scaffold(
      body: TabWidget(),
      endDrawer: Container(
         width: MediaQuery.of(context).size.width * 0.65,
         child: MainDrawer(),
      )
    );
  }
}

或者如果你不想创建另一个Widget,那么你应该使用一个 "Widget "来解决这个问题。建设者 小工具,它将为你生成一个新的BuildContext。你的Widget会像这样。

MaterialApp(
  home: Builder(
    build: (BuildContext context) {
      return Scaffold(
        body: TabWidget(),
        endDrawer: Container(
           width: MediaQuery.of(context).size.width * 0.65,
           child: MainDrawer(),
        )
      );
    }
  ),
  title: "Ali Azad",
);

0
投票

把你的 Container 小部件 Builder 小组件或创建一个单独的小组件,并将其分配给 MaterialApp home 参数,这样就可以得到 contextMaterialApp 小部件,该 context 你现在用的是没有 MaterialApp.

© www.soinside.com 2019 - 2024. All rights reserved.