Flutter基础组件插件build_context的介绍

Flutter基础组件插件build_context的介绍

访问BuildContext实例中常用的属性。 此插件依赖于Dart的扩展功能,以便在BuildContext实例中轻松访问最常用的属性和函数。

可用扩展

我经常更新此插件以添加更多扩展功能。以下是你可以在最新版本中看到的当前可用扩展。

从MediaQuery访问属性直接在上下文实例中使用

可用扩展:

  • context.mediaQuerySize
  • context.orientation
  • context.mediaQueryPadding
  • context.alwaysUse24HourFormat
  • context.devicePixelRatio
  • context.platformBrightness
  • context.textScaleFactor
  • context.isLandscape
  • context.isPortrait
  • context.mediaQueryViewPadding
  • context.mediaQueryViewInsets
  • context.mediaQueryShortestSide
  • context.isPhone
  • context.isTablet
  • context.isSmallTablet
  • context.isLargeTablet

从Navigator类轻松导航

可用扩展:

  • context.push()
  • context.pop()
  • context.canPop()
  • context.pushNamed()
  • context.popUntil()

直接在上下文实例中访问主题

可用扩展:

  • context.theme
  • context.textTheme
  • context.primaryTextTheme
  • context.accentTextTheme
  • context.bottomAppBarTheme
  • context.bottomSheetTheme
  • context.appBarTheme
  • context.backgroundColor
  • context.primaryColor
  • context.buttonColor
  • context.scaffoldBackgroundColor
  • context.platform
  • context.isAndroid
  • context.isIOS
  • context.isWindows
  • context.isMacOS
  • context.isLinux
  • context.isFuchsia
  • context.headline1
  • context.headline2
  • context.headline3
  • context.headline4
  • context.headline5
  • context.headline6
  • context.subtitle1
  • context.bodyText1
  • context.bodyText2
  • context.caption
  • context.button
  • context.subtitle2
  • context.overline

处理Scaffold的上下文

注意:这些必须在Scaffold小部件的上下文中调用,否则可能会出现错误。

  • context.openDrawer()
  • context.openEndDrawer()
  • context.showSnackBar()
  • context.hideCurrentSnackBar()
  • context.removeCurrentSnackBar()
  • context.showBottomSheet()

从Form.of(context)类中获取表单

注意:这些必须在Scaffold小部件的上下文中调用,否则可能会出现错误。

  • context.form.validate()
  • context.form.reset()
  • context.form.save()

从FocusScope.of(context)类中获取焦点范围

  • context.focusScope.hasFocus
  • context.focusScope.isFirstFocus
  • context.focusScope.canRequestFocus
  • context.focusScope.hasPrimaryFocus
  • context.focusScope.unfocus()
  • context.focusScope.nextFocus()
  • context.focusScope.requestFocus()
  • context.focusScope.previousFocus()
  • context.focusScope.setFirstFocus()
  • context.focusScope.consumeKeyboardToken()
  • context.closeKeyboard()

从ModalRoute.of(context)类中获取模态路由

  • context.modalRoute
  • context.routeSettings

安装

在你的pubspec.yaml文件中添加它:

dependencies:
  build_context: ^3.0.0

在你想使用它的地方导入它,例如,在你的小部件文件中。

import "package:build_context/build_context.dart";

这是一个使用示例:

import 'package:flutter/material.dart';
import "package:build_context/build_context.dart";

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: context.scaffoldBackgroundColor, // 直接使用context
      body: Center(
        child: GestureDetector(
          onTap: () => context.pushNamed('/detailsPage'), // 直接使用context
          child: Text(
            'Press Me',
            style: context.primaryTextTheme.title, // 直接使用context
          ),
        ),
      ),
    );
  }
}

更多关于Flutter基础组件插件build_context的介绍的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter基础组件插件build_context的介绍的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Flutter基础组件插件build_context的介绍

在Flutter开发中,build_context是一个非常核心且频繁使用的概念。它是Widget树中的一个位置标识,用于在Widget树中唯一确定一个Widget的位置。build_context不是直接由开发者创建的,而是由Flutter框架在Widget构建过程中自动传递的。理解并使用build_context是掌握Flutter布局和状态管理的基础。

build_context的作用

  1. 状态管理:在Flutter中,状态(State)与Widget是紧密相关的。当我们需要访问或修改Widget的状态时,通常需要通过build_context来找到对应的State对象。

  2. 事件处理:在事件处理函数中,比如按钮点击事件,我们也需要通过build_context来触发Widget树的重建。

  3. 查找Widget:使用build_context,我们可以向上或向下在Widget树中查找特定的Widget或State对象,这在一些复杂的布局或交互场景中非常有用。

代码示例

以下是一些使用build_context的常见场景和代码示例:

  1. 在StatelessWidget中使用build_context
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Demo'),
        ),
        body: Center(
          child: MyButton(
            onPressed: () {
              // 使用ScaffoldMessenger.of(context)来显示Snackbar
              ScaffoldMessenger.of(context).showSnackbar(
                SnackBar(content: Text('Button pressed!')),
              );
            },
          ),
        ),
      ),
    );
  }
}

class MyButton extends StatelessWidget {
  final VoidCallback onPressed;

  MyButton({required this.onPressed});

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onPressed,
      child: Text('Press Me'),
    );
  }
}

在这个例子中,ScaffoldMessenger.of(context)用于在MyAppbuild方法中获取Scaffold的上下文,以便显示一个Snackbar。

  1. 在StatefulWidget中使用build_context
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Counter App'),
        ),
        body: Center(
          child: Counter(),
        ),
      ),
    );
  }
}

class Counter extends StatefulWidget {
  @override
  _CounterState createState() => _CounterState();
}

class _CounterState extends State<Counter> {
  int _count = 0;

  void _increment() {
    setState(() {
      _count++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(
          'You have pushed the button this many times:',
        ),
        Text(
          '$_count',
          style: Theme.of(context).textTheme.headline4,
        ),
        ElevatedButton(
          onPressed: _increment,
          child: Text('Increment'),
        ),
      ],
    );
  }
}

在这个例子中,_increment方法通过调用setState来更新_count变量的值,并触发Widget树的重建。Theme.of(context)用于获取当前主题,以便应用一致的样式。

  1. 使用build_context查找祖先Widget
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Ancestor Lookup'),
        ),
        body: Builder(
          builder: (BuildContext context) {
            return Center(
              child: ElevatedButton(
                onPressed: () {
                  // 查找最近的Scaffold祖先Widget
                  Scaffold scaffold = Scaffold.of(context);
                  scaffold.showSnackbar(SnackBar(content: Text('Found Scaffold!')));
                },
                child: Text('Find Scaffold'),
              ),
            );
          },
        ),
      ),
    );
  }
}

在这个例子中,Scaffold.of(context)用于在按钮的点击事件处理函数中查找最近的Scaffold祖先Widget,并显示一个Snackbar。

通过这些例子,我们可以看到build_context在Flutter开发中的重要性。它不仅是Widget构建过程中的关键参数,也是状态管理、事件处理和Widget查找的重要工具。

回到顶部