- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试添加网格列表,同时添加第二个网格的项目时发现以下错误:
Error: Could not find the correct Provider<Cities> above this PropertiesGrid Widget
To fix, please:
* Ensure the Provider<Cities> is an ancestor to this PropertiesGrid Widget
* Provide types to Provider<Cities>
* Provide types to Consumer<Cities>
* Provide types to Provider.of<Cities>()
* Always use package imports. Ex: `import 'package:my_app/my_code.dart';
* Ensure the correct `context` is being used.
If none of these solutions work, please file a bug at:
https://github.com/rrousselGit/provider/issues
我认为我的
Home Screen
中的问题在下面的代码部分:
Expanded(
child: FutureBuilder<bool>(
future: getData(),
builder: (BuildContext context,
AsyncSnapshot<bool> snapshot) {
if (!snapshot.hasData) {
return const SizedBox();
} else {
return ChangeNotifierProvider(
create: (context) => Properties(),
child: PropertiesGrid(_showOnlyFavorites),
);
}
},
),
),
所以这是我在这类部分中划分的代码
Providers
,
Screens
,
Widgets
如下图所示:
import 'package:flutter/rendering.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/properties.dart';
import '../providers/cities.dart';
import '../widgets/properties_grid.dart';
import '../app_theme.dart';
class MyHomePage extends StatefulWidget {
const MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
int currentTab = 0;
ScrollController _scrollController = ScrollController();
bool _showBottomBar = true;
_scrollListener() {
if (_scrollController.position.userScrollDirection ==
ScrollDirection.reverse) {
setState(() {
_showBottomBar = false;
});
} else if (_scrollController.position.userScrollDirection ==
ScrollDirection.forward) {
setState(() {
_showBottomBar = true;
});
}
}
var _showOnlyFavorites = false;
AnimationController animationController;
bool multiple = true;
@override
void initState() {
animationController = AnimationController(
duration: const Duration(milliseconds: 2000), vsync: this);
_scrollController.addListener(_scrollListener);
super.initState();
}
Future<bool> getData() async {
await Future<dynamic>.delayed(const Duration(milliseconds: 0));
return true;
}
@override
void dispose() {
animationController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 6, // Added
initialIndex: 0,
child: Scaffold(
resizeToAvoidBottomPadding: false,
extendBody: true,
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {},
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
bottomNavigationBar: AnimatedContainer(
duration: Duration(milliseconds: 500),
child: _showBottomBar
? BottomAppBar(
elevation: 0,
shape: CircularNotchedRectangle(),
notchMargin: 10,
child: Container(
height: 60,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
MaterialButton(
padding: EdgeInsets.all(0),
minWidth: 155,
onPressed: () {
setState(() {
// currentScreen =
// Chat(); // if user taps on this dashboard tab will be active
currentTab = 1;
});
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(
Icons.home,
color: currentTab == 1
? Colors.blue
: Colors.grey,
),
Text(
'Home',
style: TextStyle(
color: currentTab == 1
? Colors.blue
: Colors.grey,
),
),
],
),
)
],
),
// Right Tab bar icons
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
MaterialButton(
padding: EdgeInsets.all(0),
minWidth: 60,
onPressed: () {
setState(() {
// currentScreen =
// Settings(); // if user taps on this dashboard tab will be active
currentTab = 3;
});
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(
Icons.view_list,
color: currentTab == 3
? Colors.blue
: Colors.grey,
),
Text(
'Property List',
style: TextStyle(
color: currentTab == 3
? Colors.blue
: Colors.grey,
),
),
],
),
),
MaterialButton(
padding: EdgeInsets.all(0),
minWidth: 77,
onPressed: () {
setState(() {
// currentScreen =
// Settings(); // if user taps on this dashboard tab will be active
currentTab = 4;
});
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(
Icons.location_searching,
color: currentTab == 4
? Colors.blue
: Colors.grey,
),
Text(
'Map',
style: TextStyle(
color: currentTab == 4
? Colors.blue
: Colors.grey,
),
),
],
),
),
],
)
],
),
),
)
: Container(
color: Colors.white,
width: MediaQuery.of(context).size.width,
),
),
backgroundColor: AppTheme.white,
body: Stack(
children: <Widget>[
FutureBuilder<bool>(
future: getData(),
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
if (!snapshot.hasData) {
return const SizedBox();
} else {
return Padding(
padding: EdgeInsets.only(
top: MediaQuery.of(context).padding.top),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
appBar(),
tabBar(),
Expanded(
child: FutureBuilder<bool>(
future: getData(),
builder: (BuildContext context,
AsyncSnapshot<bool> snapshot) {
if (!snapshot.hasData) {
return const SizedBox();
} else {
return ChangeNotifierProvider(
create: (context) => Properties(),
child: PropertiesGrid(_showOnlyFavorites),
);
}
},
),
),
],
),
);
}
},
),
],
),
),
);
}
Widget appBar() {
return SizedBox(
height: AppBar().preferredSize.height,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 8, left: 8),
child: Container(
width: AppBar().preferredSize.height - 8,
height: AppBar().preferredSize.height - 8,
),
),
Expanded(
child: Center(
child: Padding(
padding: const EdgeInsets.only(top: 4),
child:
Image.asset('assets/images/logo.png', fit: BoxFit.contain),
),
),
),
Padding(
padding: const EdgeInsets.only(top: 8, right: 8),
child: Container(
width: AppBar().preferredSize.height - 8,
height: AppBar().preferredSize.height - 8,
color: Colors.white,
child: Material(
color: Colors.transparent,
child: InkWell(
borderRadius:
BorderRadius.circular(AppBar().preferredSize.height),
child: Icon(
Icons.location_on,
color: AppTheme.dark_grey,
),
onTap: () {
setState(() {
multiple = !multiple;
});
},
),
),
),
),
],
),
);
}
Widget tabBar() {
return SizedBox(
height: AppBar().preferredSize.height,
child: TabBar(
isScrollable: true,
unselectedLabelColor: Colors.green,
labelColor: Colors.blue,
indicatorColor: Colors.blue,
labelStyle: TextStyle(fontSize: 15.0,fontStyle: FontStyle.italic),
tabs: [
Tab(
child: Text('All'),
),
Tab(
child: Text('Office'),
),
Tab(
child: Text('Commercial'),
),
Tab(
child: Text('Land'),
),
Tab(
child: Text('House/Villa'),
),
Tab(
child: Text('Apartement'),
),
],
),
);
}
}
这是 Grid 小部件的列表:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import './province_item.dart';
import './property_item.dart';
import '../providers/cities.dart';
import '../providers/properties.dart';
// import '../providers/properties.dart';
class PropertiesGrid extends StatelessWidget {
final bool showFavs;
PropertiesGrid(this.showFavs);
@override
Widget build(BuildContext context) {
final propertiesData = Provider.of<Properties>(context);
final citiesData = Provider.of<Cities>(context);
// final productData = Provider.of<Cities>(context);
final properties = showFavs ? propertiesData.favoriteItems : propertiesData.items;
final cities = citiesData.items;
return Container(
color: Colors.transparent,
child: SingleChildScrollView(
child: Column(
children: [
Row(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(6.0),
child: Align(
child: Text(
"Show All",
style: TextStyle(
fontSize: 16,
fontStyle: FontStyle.italic,
color: Colors.green),
),
alignment: Alignment.topLeft,
),
),
Container(
margin: const EdgeInsets.only(left: 95.0),
child: Padding(
padding: const EdgeInsets.all(6.0),
child: Align(
child: Text(
"Popular Properties",
style: TextStyle(
fontSize: 18,
fontStyle: FontStyle.italic,
color: Colors.black.withOpacity(0.8)),
),
alignment: Alignment.topRight,
),
),
),
],
),
SizedBox(
height: 250,
child: Column(
children: <Widget>[
Expanded(
child: GridView.builder(
padding: const EdgeInsets.all(10.0),
itemCount: properties.length,
itemBuilder: (ctx, i) => ChangeNotifierProvider.value(
// builder: (c) => products[i],
value: properties[i],
child: PropertyItem(
// products[i].id,
// products[i].title,
// products[i].imageUrl,
),
),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 1,
childAspectRatio: 3 / 4,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
),
scrollDirection: Axis.horizontal,
),
),
],
),
),
Row(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(6.0),
child: Align(
child: Text(
"Show All",
style: TextStyle(
fontSize: 16,
fontStyle: FontStyle.italic,
color: Colors.green),
),
alignment: Alignment.topLeft,
),
),
Container(
margin: const EdgeInsets.only(left: 180.0),
child: Padding(
padding: const EdgeInsets.all(6.0),
child: Align(
child: Text(
"Province",
style: TextStyle(
fontSize: 18,
fontStyle: FontStyle.italic,
color: Colors.black.withOpacity(0.8)),
),
alignment: Alignment.topRight,
),
),
),
],
),
SizedBox(
height: 250,
child: Column(
children: <Widget>[
Expanded(
child: GridView.builder(
padding: const EdgeInsets.all(10.0),
itemCount: cities.length,
itemBuilder: (ctx, i) => ChangeNotifierProvider.value(
// builder: (c) => products[i],
value: cities[i],
child: ProvinceItem(
// products[i].id,
// products[i].title,
// products[i].imageUrl,
),
),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 1,
childAspectRatio: 3 / 4,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
),
scrollDirection: Axis.horizontal,
),
),
],
),
),
],
),
),
);
}
}
这是与小部件相关的省份项目:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/city.dart';
class ProvinceItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
final city = Provider.of<City>(context, listen: false);
return Padding(
padding: const EdgeInsets.all(8.0),
child: InkWell(
splashColor: Colors.transparent,
onTap: () => {},
child: Container(
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(16.0)),
boxShadow: <BoxShadow>[
BoxShadow(
color: Colors.grey.withOpacity(0.6),
offset: const Offset(2.5, 2.5),
blurRadius: 16,
),
],
),
margin: EdgeInsets.all(2),
child: ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(15),
topRight: Radius.circular(15),
bottomLeft: Radius.circular(15),
bottomRight: Radius.circular(15),
),
child: Image.asset(
city.cityImage,
fit: BoxFit.cover,
),
),
),
),
);
}
}
这是
City
提供者:
import 'package:flutter/material.dart';
class City with ChangeNotifier {
final String cityId;
final String cityName;
final String cityImage;
City({
@required this.cityId,
@required this.cityName,
@required this.cityImage,
});
}
我把这个虚拟数据放在 Provider 中,就像下面的代码一样:
import '../providers/city.dart';
import 'package:flutter/material.dart';
// import './property.dart';
class Cities with ChangeNotifier {
List<City> _items = [
City(
cityId: 'city1',
cityName: 'Amman',
cityImage: 'assets/images/amman.png',
),
City(
cityId: 'city2',
cityName: 'Jerash',
cityImage: 'assets/images/amman.png',
),
City(
cityId: 'city3',
cityName: 'Karak',
cityImage: 'assets/images/amman.png',
),
City(
cityId: 'city4',
cityName: 'Aqaba',
cityImage: 'assets/images/amman.png',
),
City(
cityId: 'city5',
cityName: 'Zarqa',
cityImage: 'assets/images/amman.png',
),
City(
cityId: 'city6',
cityName: 'Madaba',
cityImage: 'assets/images/amman.png',
),
City(
cityId: 'city7',
cityName: 'Balqa',
cityImage: 'assets/images/amman.png',
),
City(
cityId: 'city8',
cityName: 'Mafraq',
cityImage: 'assets/images/amman.png',
),
City(
cityId: 'city9',
cityName: 'Maan',
cityImage: 'assets/images/amman.png',
),
City(
cityId: 'city10',
cityName: 'Ajloun',
cityImage: 'assets/images/amman.png',
),
City(
cityId: 'city11',
cityName: 'Irbid',
cityImage: 'assets/images/amman.png',
),
City(
cityId: 'city12',
cityName: 'Tafila',
cityImage: 'assets/images/amman.png',
),
];
List<City> get items {
return [..._items];
}
City findById(String cityId) {
return _items.firstWhere((cit) => cit.cityId == cityId);
}
}
我很抱歉添加了很多代码我试图添加所有需要的信息......
最佳答案
哇,那是你发布的相当多的代码。我必须承认我没有仔细研究它,但我想我明白了问题所在:正如错误消息指出的那样,您没有注入(inject)类型为 Cities
的 Provider在上下文树中 PropertiesGrid
的点上方建成。PropertiesGrid
中的这些行:
final propertiesData = Provider.of<Properties>(context);
final citiesData = Provider.of<Cities>(context);
Properties
的实例和
Cities
之一从上下文树中的点上方。如果您不满足此类要求,提供商将无情地对您进行崩溃。事实上,你得到了:
(22371): Error: Could not find the correct Provider<Cities> above this PropertiesGrid Widget
PropertiesGrid
小部件内置在您的主页中:
if (!snapshot.hasData) {
return const SizedBox();
} else {
return ChangeNotifierProvider(
create: (context) => Properties(),
child: PropertiesGrid(_showOnlyFavorites),
);
}
Properties
上面的实例
PropertiesGrid
,但没有人提供
Cities
的实例,因此您的小部件具有无法满足的依赖关系。
MultiProvider
注入(inject)两个依赖项。像这样
if (!snapshot.hasData) {
return const SizedBox();
} else {
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => Properties()),
ChangeNotifierProvider(create: (context) => Cities()),
],
child: PropertiesGrid(_showOnlyFavorites),
);
}
MultiProvider
不是强制性的:即使在 HomePage 树的不同高度,您也可以使用两个提供程序注入(inject)这两个实例。只要这两个提供程序构建在
PropertiesGrid
之上你很厉害。
关于flutter - 如何在同一个 `ChangeNotifierProvider` 小部件上返回多个 `Expanded`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62232360/
我有一个简单的 Card 组件,是从material-ui 的网站复制的。 我正在尝试在我的代码中实现它。当我单击 CardHeader 时,它不会展开。 这是我的组件: import React,
我已经使用延迟加载实现了一棵树。第一级节点是在树创建时创建的,其中只有当用户展开任何特定节点时才会创建子节点。 数据来自数据库,我们向数据库发出查询以填充子节点。实现了 TreeExpansionLi
假设我有 3 个向量(仅作为示例)。现在我想获取这 3 个所有可能组合的随机样本。通常,我会这样做: x <- 1:3 y <- 10:12 z <- 15:18 N <- length(x) * l
如果我使用 dabbrev-expand为了扩展,Emacs 搜索当前缓冲区,然后搜索其他具有相同模式的缓冲区。这是由 dabbrev-friend-buffer-function 处理的默认设置为
我想像这样切片主窗口 我的布局代码如下: QGridLayout *gLayout = new QGridLayout (); viewWidget->setStyleSheet("backgroun
我在 Android Studio Canary 1 上尝试 Jetpack Compose 并添加了 Column可组合到 ui。 Column有一个名为 modifier 的属性我们可以在其中传递
我正在努力让我们的 Accordion 可以使用 aria-expanded 等 aria 标签来访问。当单击 Accordion 触发器标题或按下键盘上的“返回”按钮时,我正确地更改了 aria-e
根据 http://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum ,设置小部件的大小策略具有以下效果: The sizeHint() is a sensibl
我将使用Live Actitions显示实时数据,并在一个应用程序中添加对Dynamic Island的支持,该应用程序具有现有的小部件扩展。然而,我也不能把它造出来。当我收到错误信息时。和。即使我提
我有一个设置,如下所示: //With dynamic content here. 我正在运行一个脚本,该脚本将 #nav 的大小调整为浏览器窗口的高度大小。但有时我的
我正在使用jquery checkboxtree plugin它效果很好,并且上面的链接中有很好的文档和示例。我现在遇到一种情况,我想以编程方式检查节点。使用以下语法支持此操作: $('#tabs-
我正在尝试以下实验: 我有两个QpushButtons,比如PushA 和PushB。现在 PushA 在 QHBoxLayout 中,PushB 也在它自己的 QHBoxLayout 中。这两个水平
我目前有一个 OData V4 服务,它具有以下模型。 “类别”——“代码” 对于每个类别,可以有许多代码。 我需要 $expand the Codes, $filter where Active =
我的目的是创建一个带有 QVBoxLayout 的可滚动控件,上面有各种控件(比如按钮)。该控件放在 *.ui 窗体上。在该控件的构造函数中,我编写了以下代码: MyScrollArea::M
你们如何解决以下 Flutter 布局? 我有一个屏幕,我必须在其中显示,如图所示:一个 Logo + 3 个 TextFormFields + 2 个按钮 + 一个容器。 问题: 我需要将所有小部件
我使用最新版本的 mvvm light 工具包,但是我不清楚如何将 EventToCommand 用于事件 TreeViewItem.Expanded。 这很有效......我做错了什么?
我是 LINQ 的新手。 我有以下查询,我不知道它代表什么。 var query = (from p in data.First
这里有一个小问题。我有一个表,当我想单击运行时,该表应该展开,而且同一行中有一个展开按钮,它也应该展开一个 div。 问题:当我单击该行时,一切正常,div 将滑入。当我单击按钮(位于表行中)时,会产
图片:
我的应用程序中有 Expander 设置 FlowDirection 正常工作,但标题文本显示在水平方向。我想显示标题文本垂直绘制。 最佳答案 使用 sl 工具包中的 LayoutTransforme
我是一名优秀的程序员,十分优秀!