flutter issue---->Scaffold.of(context)
当我们想showSnackBar的时候,需要通过Scaffold.of(context)得到Scaffold。但是如果这个context用错的话,flutter就会抛出错误。下面我们通过代码仔细看一下。
issue code
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: OutlineButton(
child: Text("SnackBar"),
onPressed: () {
Scaffold.of(context).showSnackBar(SnackBar(content: Text("Show SnackBar")));
},
),
),
),
);
}
}
当我们点击OutlineButton时,会如以下的错误:
The following assertion was thrown while handling a gesture:
Scaffold.of() called with a context that does not contain a Scaffold.
No Scaffold ancestor could be found starting from the context that was passed to Scaffold.of(). This usually happens when the context provided is from the same StatefulWidget as that whose build function actually creates the Scaffold widget being sought.
issue reason
原因是Scaffold.of(context)这个方法的context是MyApp组件的,它不能得到子组件Scaffold。因为widget从上到下,父组件的context是得不到子组件的。
issue fixed
整体方案就是Scaffold.of(context)里面的context得是Scaffold子组件的context,这样我们有两种方式实现。
- use Builder widget
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Builder(
builder: (BuildContext buildContext) {
return Center(
child: OutlineButton(
child: Text("SnackBar"),
onPressed: () {
Scaffold.of(buildContext).showSnackBar(SnackBar(content: Text("Show SnackBar")));
},
),
);
},
),
),
);
}
}
- extract as child widget
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(body: HomeWidget()),
);
}
}
class HomeWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: OutlineButton(
child: Text("SnackBar"),
onPressed: () {
Scaffold.of(context).showSnackBar(SnackBar(content: Text("Show SnackBar")));
},
),
);
}
}
shortcut to extract widget
鼠标放在widget上面或者选中该widget。mac上面
- option+command+w。
- Refactor->Extract->Extract Flutter Widget(Menu or Right click)
flutter issue---->Scaffold.of(context)的更多相关文章
- flutter SnackBar异常Another exception was thrown: Scaffold.of() called with a context that does not contain a Scaffold
代码如下: import 'package:flutter/material.dart'; void main() { runApp(MaterialApp( title: 'Returning Da ...
- Flutter学习(一)之MaterialApp和Scaffold组件使用详解
一,前言: MaterialApp和Scaffold是Flutter提供的两个Widget,其中: MaterialApp是一个方便的Widget,它封装了应用程序实现Material Design所 ...
- 【Flutter学习】一些重要的概念之of(context)方法
在flutter中我们经常会使用到这样的代码 //打开一个新的页面 Navigator.of(context).push //打开Scaffold的Drawer Scaffold.of(context ...
- 【Flutter】容器类组件之Scaffold、TabBar、底部导航
前言 一个完整的路由页可能会包含导航栏.抽屉菜单(Drawer)以及底部Tab导航菜单等.Flutter Material组件库提供了一些现成的组件来减少开发任务.Scaffold是一个路由页的骨架, ...
- Flutter GetX使用---简洁的魅力!
前言 使用Bloc的时候,有一个让我至今为止十分在意的问题,无法真正的跨页面交互!在反复的查阅官方文档后,使用一个全局Bloc的方式,实现了"伪"跨页面交互,详细可查看:flutt ...
- flutter 本地存储 (shared_preferences)
Flutter本地存储 和Android.Ios类似,Flutter也支持Preferences(Shared Preferences and NSUserDefaults) .文件.和Sqlite3 ...
- Flutter常用布局组件
Flutter控件本身通常由许多小型.单用途的控件组成,结合起来产生强大的效果,例如,Container是一种常用的控件,由负责布局.绘画.定位和大小调整的几个控件组成,具体来说,Container是 ...
- flutter ui
快速生成无状态模板 void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget ...
- 技术胖Flutter第四季-22页面跳转并返回数据
视频地址: https://www.bilibili.com/video/av35800108/?p=23 博客地址: https://jspang.com/post/flutter4.html#to ...
- flutter基础
1.flutter安装 1.参考官网安装sdk https://flutter.io/get-started/install 安卓和IOS需要分别配置对应的开发环境,安卓建议使用as开发,安装Flut ...
随机推荐
- 脚本安装zabbix
把zabbix.repo上传到 /etc/yum.repo.d/ 如果出现这种情况:yum -y remove httpdyum -y install httpdsystemctl start htt ...
- base64EncodedStringWithOptions iOS
// 64位编码//先将string转换成dataNSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];NSData *base ...
- springboot[2.3.4.RELEASE]application.properties常用配置
常用配置 spring.profiles.active=@spring.profiles.active@ pom文件中定义的配置文件 server.port=8080 web默认访问端口 server ...
- LeetCode刷题感想之BFS
BFS, 顾名思义,广度优先遍历,与DFS对应. 最大的一个区别是,在解题套路里,DFS 多数使用 List<List<Object>> 的方式来保存结果集,并且最后删除回溯的 ...
- 黑马 java.lang.IllegalArgumentException: Property ‘dataSource‘ is required
现象: 按照教程步骤做的,但连单元测试都无法通过,会出现java.lang.IllegalArgumentException: Property 'dataSource' is required这个错 ...
- 12.6linux学习第十三天
今天老刘开始讲第9第章使用ssh服务管理远程主机.第10章开了个小头. 9.1 配置网卡服务 9.1.1 配置网卡参数 截至目前,大家已经完全可以利用当前所学的知识来管理Linux系统了.当然,大家的 ...
- Qt滚动条样式
Qt手动设置滚动条的qss样式 QScrollBar:vertical { width: 14px; margin: 16px 0 16px 0; background: #eaeaea; } QSc ...
- Java数据类型基础
Java 数据类型基础 数据类型 强类型语言 要求变量的使用要严格符合规定,所有变量必须先定义后使用 Java数据分为两大类 基本类型(primitive type) 数值类型 整数类型 byte(1 ...
- Ensemble learning A survey 论文阅读
Ensemble learning A survey是2018年发表的一篇关于集成学习的综述性论文 发展 在Surowiecki的书中The Wisdom of Crowds,当符合以下标准时,大众的 ...
- 记录一次HAWQ手工启动
一.环境变量初始化 使用hawq的命令必须先进行环境变量的初始化 命令不能以 root 用户执行,应该以 gpadmin 用户执行 source /usr/local/apache-hawq/gree ...