【问题标题】:Issue with PersistentBottomNavBar: MediaQuery.of(context)PersistentBottomNavBar 的问题:MediaQuery.of(context)
【发布时间】:2021-03-23 05:14:24
【问题描述】:

我的 Flutter 应用程序中的 PersistentBottomNavBar 包存在一些问题。它给了我一个 MediaQuery.of(context) 消息的错误:“它使用不包含 MediaQuery 的上下文调用”。我无法想象这里发生了什么。也许是因为我在 MultiProvider 小部件中使用了 persistentBottomNavbar?我试图用 MaterialApp 小部件摆脱 MultiProvider 并仅返回 PersistentTabView 小部件作为构建小部件。但它帮不了我。

我的代码:

import 'package:provider/provider.dart';
import 'package:persistent_bottom_nav_bar/persistent-tab-view.dart';

import './providers/products.dart';

import './screens/words_list_screen.dart';
import './screens/add_word_screen.dart';
import './screens/profile_screen.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
  ]);

  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  PersistentTabController _tabController;
  bool _hideNavBar;

  @override
  void initState() {
    super.initState();
    _tabController = PersistentTabController(initialIndex: 0);
    _hideNavBar = false;
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    _tabController.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (_) => Products(),
        ),
      ],
      child: MaterialApp(
        title: 'Sample App',
        debugShowCheckedModeBanner: false,
        theme: ThemeData(
          primarySwatch: Colors.blueGrey,
          accentColor: Colors.grey[700],
          errorColor: Colors.red[400],
          fontFamily: 'Nunito',
          scaffoldBackgroundColor: Colors.white,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        home: PersistentTabView(
          context,
          controller: _tabController,
          screens: [
            ProductsListScreen(),
            AddProductScreen(),
            ProfileScreen(),
          ],
          items: _navBarItems(),
          confineInSafeArea: true,
          backgroundColor: Colors.white,
          handleAndroidBackButtonPress: true,
          resizeToAvoidBottomInset: true,
          stateManagement: true,
          hideNavigationBarWhenKeyboardShows: true,
          decoration: NavBarDecoration(
            borderRadius: BorderRadius.circular(10.0),
            colorBehindNavBar: Colors.red,
          ),
          popAllScreensOnTapOfSelectedTab: true,
          popActionScreens: PopActionScreensType.all,
          itemAnimationProperties: ItemAnimationProperties(
            duration: Duration(milliseconds: 200),
            curve: Curves.ease,
          ),
          screenTransitionAnimation: ScreenTransitionAnimation(
            animateTabTransition: true,
            curve: Curves.ease,
            duration: Duration(
              milliseconds: 200,
            ),
          ),
          navBarStyle: NavBarStyle.style1,
        ),
        initialRoute: '/',
      ),
    );
  }
}

所以在我的 Android 模拟器中,我遇到了以下红屏问题。

也在我的 VCode 调试控制台中。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    从 MyApp 小部件中删除 MaterialApp,并通过在 runApp 中添加 MaterialApp 使其成为 MyApp 小部件的父 Widget。您的代码应该类似于下面的代码

    ......
    void main() {
      WidgetsFlutterBinding.ensureInitialized();
      SystemChrome.setPreferredOrientations([
        DeviceOrientation.portraitUp,
        DeviceOrientation.portraitDown,
      ]);
    
      runApp(
        MultiProvider(
          providers: [
            ChangeNotifierProvider(
              create: (_) => Products(),
            ),
          ],
          child: MaterialApp(
            title: 'Sample App',
            debugShowCheckedModeBanner: false,
            theme: ThemeData(
              primarySwatch: Colors.blueGrey,
              accentColor: Colors.grey[700],
              errorColor: Colors.red[400],
              fontFamily: 'Nunito',
              scaffoldBackgroundColor: Colors.white,
              visualDensity: VisualDensity.adaptivePlatformDensity,
            ),
            initialRoute: '/',
            home: MyApp(),
          ),
        ),
      );
    }
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      PersistentTabController _tabController;
      bool _hideNavBar;
    
      @override
      void initState() {
        super.initState();
        _tabController = PersistentTabController(initialIndex: 0);
        _hideNavBar = false;
      }
    
      @override
      void dispose() {
        // TODO: implement dispose
        super.dispose();
        _tabController.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return PersistentTabView(
          context,
    

    ......

    或者您可以为 MaterialApp 制作一个单独的 Widget。

    【讨论】:

    • 感谢重播。现在我有另一个错误((The method 'map' was called on null. Receiver: null Tried calling: map&lt;Flexible&gt;(Closure: (PersistentBottomNavBarItem) =&gt; Flexible)
    • 此错误似乎与原始问题无关。此错误似乎出现在您在某个变量上调用 map 的 _navBarItems() 函数中。必须查看更多代码才能找到该错误的来源。如果您认为 MediaQuery.of 错误已解决,请尝试调试代码并在 _navBarItems() 中找到您调用地图的位置。
    • 如果您认为我解决了您的原始问题,您可以喜欢并接受它,并且可能会发布一个新问题,其中包含您当前错误的一些示例代码。
    • here 我发布了我当前的问题。
    猜你喜欢
    • 2021-12-02
    • 2021-03-24
    • 1970-01-01
    • 2020-11-10
    • 2022-09-28
    • 2021-06-08
    • 2019-07-20
    • 2022-01-20
    • 2021-10-03
    相关资源
    最近更新 更多