Dart 颤振:将数据从有状态类传递到另一个类
我需要将数据(Dart 颤振:将数据从有状态类传递到另一个类,dart,flutter,Dart,Flutter,我需要将数据(basketCount)从Stateful类(DashboardState)传递到另一个不支持状态的类(TestTabBarDelegate)。两个类都在同一个文件中。我怎样才能做到 我尝试了mixins,但是mixins不能使用Stateful类 import 'dart:convert'; import 'package:benyaghlane/widgets/default_aap_bar_row.dart'; import 'package:flutter/materia
basketCount
)从Stateful
类(DashboardState
)传递到另一个不支持状态的类(TestTabBarDelegate
)。两个类都在同一个文件中。我怎样才能做到
我尝试了mixins
,但是mixins
不能使用Stateful
类
import 'dart:convert';
import 'package:benyaghlane/widgets/default_aap_bar_row.dart';
import 'package:flutter/material.dart';
import 'package:benyaghlane/pages/liste_panier.dart';
import 'package:benyaghlane/pages/produit_sauvegarde.dart';
import 'package:benyaghlane/widgets/grid_categories.dart';
import 'package:benyaghlane/widgets/grid_meilleurs_ventes.dart';
import 'package:benyaghlane/widgets/grid_produits_fards.dart';
import 'package:benyaghlane/widgets/side_drawer.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:carousel_slider/carousel_slider.dart';
class TestTabBarDelegate extends SliverPersistentHeaderDelegate {
TestTabBarDelegate({this.controller});
final TabController controller;
@override
double get minExtent => 85.0;
@override
double get maxExtent => 85.0;
@override
Widget build(
BuildContext context, double shrinkOffset, bool overlapsContent) {
return new Container(
height: 200.0,
child: new TabBar(
controller: controller,
key: new PageStorageKey<Type>(TabBar),
labelColor: Colors.black,
labelStyle: TextStyle(color: Colors.black, fontSize: 12.0),
indicatorColor: Color(0xff93b800),
tabs: [
Tab(
icon: Icon(
Icons.home,
color: Color(0xff93b800),
),
text: "ACCUEIL",
),
Tab(
icon: Icon(Icons.favorite_border, color: Colors.red),
text: "SAUVEGARDER",
),
Tab(
text: "PANIER",
icon: Stack(
overflow: Overflow.visible,
children: <Widget>[
Icon(Icons.shopping_cart, color: Color(0xffda9a25)),
Positioned(
left: 16.0,
bottom: 12.0,
child: Container(
padding: EdgeInsets.all(4.0),
decoration: BoxDecoration(
color: Color(0xff93b800), shape: BoxShape.circle),
child: Center(
child: Text(
"$basketCount",
style: TextStyle(color: Colors.white),
),
),
),
)
],
)),
],
),
);
}
@override
bool shouldRebuild(covariant TestTabBarDelegate oldDelegate) {
return oldDelegate.controller != controller;
}
}
class Dashboard extends StatefulWidget {
@override
DashboardState createState() => new DashboardState();
int index;
Dashboard(int index) {
this.index = index;
}
}
class DashboardState extends State<Dashboard> with TickerProviderStateMixin {
ScrollController _scrollController = new ScrollController();
TabController _tabController;
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
int basketCount = 0;
Future _getBasket() async {
final SharedPreferences prefs = await _prefs;
var b = prefs.getString('basket') ?? '';
if (b != '' && b != '[]') {
var basket = json.decode(b);
// this.basketCount = basket.length;
print(basket.length);
return basket.length;
}
}
@override
void initState() {
super.initState();
_scrollController = new ScrollController();
_tabController =
new TabController(length: 3, vsync: this, initialIndex: widget.index);
}
@override
void dispose() {
_scrollController.dispose();
_tabController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new PreferredSize(
preferredSize: new Size(MediaQuery.of(context).size.width, 60.0),
child: new DefaultAppBar()),
body: Container(
margin: EdgeInsets.only(top: 30.0),
child: new NestedScrollView(
controller: _scrollController,
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
new SliverPersistentHeader(
pinned: false,
delegate: new TestTabBarDelegate(controller: _tabController),
),
];
},
body: new TestHomePageBody(
tabController: _tabController,
scrollController: _scrollController,
),
),
),
drawer: SideDrawer(),
);
}
}
final List<String> imgList = [
'https://images.unsplash.com/photo-1522205408450-add114ad53fe?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=368f45b0888aeb0b7b08e3a1084d3ede&auto=format&fit=crop&w=1950&q=80',
'https://images.unsplash.com/photo-1519125323398-675f0ddb6308?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=94a1e718d89ca60a6337a6008341ca50&auto=format&fit=crop&w=1950&q=80',
'https://images.unsplash.com/photo-1523205771623-e0faa4d2813d?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=89719a0d55dd05e2deae4120227e6efc&auto=format&fit=crop&w=1953&q=80',
'https://images.unsplash.com/photo-1508704019882-f9cf40e475b4?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=8c6e5e3aba713b17aa1fe71ab4f0ae5b&auto=format&fit=crop&w=1352&q=80',
'https://images.unsplash.com/photo-1519985176271-adb1088fa94c?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=a0c8d632e977f94e5d312d9893258f59&auto=format&fit=crop&w=1355&q=80'
];
final List child = map<Widget>(
imgList,
(index, i) {
return Container(
margin: EdgeInsets.all(5.0),
child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(5.0)),
child: Stack(children: <Widget>[
Image.network(i, fit: BoxFit.fill, width: 1000.0),
Positioned(
bottom: 0.0,
left: 0.0,
right: 0.0,
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
Color.fromARGB(200, 0, 0, 0),
Color.fromARGB(0, 0, 0, 0)
],
begin: Alignment.bottomCenter,
end: Alignment.topCenter,
),
),
padding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0),
child: Text(
'No. $index image',
style: TextStyle(
color: Colors.white,
fontSize: 20.0,
fontWeight: FontWeight.bold,
),
),
),
),
]),
),
);
},
).toList();
List<T> map<T>(List list, Function handler) {
List<T> result = [];
for (var i = 0; i < list.length; i++) {
result.add(handler(i, list[i]));
}
return result;
}
class TestHomePageBody extends StatefulWidget {
TestHomePageBody({this.scrollController, this.tabController});
final ScrollController scrollController;
final TabController tabController;
TestHomePageBodyState createState() => new TestHomePageBodyState();
}
class TestHomePageBodyState extends State<TestHomePageBody> {
Key _key = new PageStorageKey({});
bool _innerListIsScrolled = false;
void _updateScrollPosition() {
if (!_innerListIsScrolled &&
widget.scrollController.position.extentAfter == 0.0) {
setState(() {
_innerListIsScrolled = true;
});
} else if (_innerListIsScrolled &&
widget.scrollController.position.extentAfter > 0.0) {
setState(() {
_innerListIsScrolled = false;
// Reset scroll positions of the TabBarView pages
_key = new PageStorageKey({});
});
}
}
@override
void initState() {
widget.scrollController.addListener(_updateScrollPosition);
super.initState();
}
@override
void dispose() {
widget.scrollController.removeListener(_updateScrollPosition);
super.dispose();
}
@override
Widget build(BuildContext context) {
return new TabBarView(
controller: widget.tabController,
key: _key,
children: <Widget>[
SingleChildScrollView(
child: Column(
children: <Widget>[
CarouselSlider(
viewportFraction: 1.0,
aspectRatio: 2.0,
autoPlay: true,
enlargeCenterPage: false,
items: map<Widget>(
imgList,
(index, i) {
return Container(
decoration: BoxDecoration(
image: DecorationImage(
image: NetworkImage(i), fit: BoxFit.cover),
),
);
},
),
),
Container(
margin: EdgeInsets.only(top: 20.0, bottom: 20.0),
child: new Column(
children: <Widget>[
GridCategories(),
SizedBox(
height: 20.0,
),
CarouselSlider(
viewportFraction: 1.0,
aspectRatio: 2.0,
autoPlay: true,
enlargeCenterPage: false,
items: map<Widget>(
imgList,
(index, i) {
return Container(
decoration: BoxDecoration(
image: DecorationImage(
image: NetworkImage(i), fit: BoxFit.cover),
),
);
},
),
),
Container(
margin: EdgeInsets.only(top: 20.0),
child: Text('Meilleurs ventes',
style: TextStyle(fontSize: 25.0)),
),
GridMeilleurVente(),
SizedBox(
height: 20.0,
),
CarouselSlider(
viewportFraction: 1.0,
aspectRatio: 2.0,
autoPlay: true,
enlargeCenterPage: false,
items: map<Widget>(
imgList,
(index, i) {
return Container(
decoration: BoxDecoration(
image: DecorationImage(
image: NetworkImage(i), fit: BoxFit.cover),
),
);
},
),
),
Container(
margin: EdgeInsets.only(top: 20.0),
child: Text('Produits Phare',
style: TextStyle(fontSize: 25.0)),
),
GridProduitsFards(),
],
),
),
],
),
),
ProduitSauvegarder(),
ListPanier(),
],
);
}
}
导入'dart:convert';
导入“package:benyaghlane/widgets/default_aap_bar_row.dart”;
进口“包装:颤振/材料.省道”;
导入“package:benyaghlane/pages/liste_panier.dart”;
进口“包装:benyaghlane/pages/produit_sauvegarde.dart”;
导入“package:benyaghlane/widgets/grid_categories.dart”;
导入“包:benyaghlane/widgets/grid_meilleurs_ventes.dart”;
导入“包:benyaghlane/widgets/grid_produits_fards.dart”;
导入“package:benyaghlane/widgets/side_drawer.dart”;
导入“package:shared_preferences/shared_preferences.dart”;
导入“package:carousel_slider/carousel_slider.dart”;
类TestTabBarDelegate扩展SliverPersistentHeaderDelegate{
TestTabBarDelegate({this.controller});
最终选项卡控制器;
@凌驾
double-get-minExtent=>85.0;
@凌驾
double get maxExtent=>85.0;
@凌驾
小部件构建(
BuildContext上下文、双收缩偏移、布尔重叠内容){
退回新货柜(
高度:200.0,
孩子:新的TabBar(
控制器:控制器,
键:新页面存储键(TabBar),
labelColor:Colors.black,
标签样式:文本样式(颜色:Colors.black,字体大小:12.0),
指示颜色:颜色(0xff93b800),
选项卡:[
标签(
图标:图标(
我的家,
颜色:颜色(0xff93b800),
),
文本:“ACCUEIL”,
),
标签(
图标:图标(Icons.favorite_边框,颜色:Colors.red),
文字:“SAUVEGARDER”,
),
标签(
文本:“窗格”,
图标:堆栈(
溢出:溢出。可见,
儿童:[
图标(Icons.shopping_cart,颜色:color(0xffda9a25)),
定位(
左:16.0,
底部:12.0,
子:容器(
填充:所有边缘设置(4.0),
装饰:盒子装饰(
颜色:颜色(0xff93b800),形状:BoxShape.circle),
儿童:中心(
子:文本(
“$basketCount”,
样式:TextStyle(颜色:Colors.white),
),
),
),
)
],
)),
],
),
);
}
@凌驾
布尔应重建(协变测试选项卡Baldelegate oldDelegate){
返回oldDelegate.controller!=控制器;
}
}
类Dashboard扩展StatefulWidget{
@凌驾
DashboardState createState()=>新建DashboardState();
整数指数;
仪表板(int索引){
这个指数=指数;
}
}
类DashboardState使用TickerProviderStateMixin扩展状态{
ScrollController_ScrollController=新的ScrollController();
TabController\u TabController;
Future_prefs=SharedReferences.getInstance();
int basketCount=0;
Future\u getBasket()异步{
最终共享优先权=等待优先权;
var b=prefs.getString('basket')??“”;
如果(b!=''&&b!='[]'){
var basket=json.decode(b);
//this.basketCount=basket.length;
打印(篮子长度);
返回篮长度;
}
}
@凌驾
void initState(){
super.initState();
_scrollController=新的scrollController();
_选项卡控制器=
新的TabController(长度:3,vsync:this,initialIndex:widget.index);
}
@凌驾
无效处置(){
_scrollController.dispose();
_tabController.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的PreferredSize(
preferredSize:新大小(MediaQuery.of(context).Size.width,60.0),
子项:新建DefaultAppBar()),
主体:容器(
边距:仅限边缘集(顶部:30.0),
子项:新嵌套滚动视图(
控制器:\ u滚动控制器,
headerSliverBuilder:(BuildContext上下文,boolInnerBoxIsCrolled){
返回[
新型滑片导板(
错,,
代表:新的TestTabBarDelegate(控制器:_TabbController),
),
];
},
正文:新的TestHomePageBody(
tabController:\u tabController,
scrollController:\u scrollController,
),
),
),
抽屉:侧抽屉(),
);
}
}
最终列表imgList=[
'https://images.unsplash.com/photo-1522205408450-add114ad53fe?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=368F45B088AEB0B7B08E3A1084D3EDE&auto=format&fit=crop&w=1950&q=80',
'https://images.unsplash.com/photo-1519125323398-675f0ddb6308?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=94a1e718d89ca60a6337a6008341ca50&auto=format&fit=crop&w=1950&q=80',
'https://images.unsplash.com/photo-1523205771623-e0faa4d2813d?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=89719a0d55dd05e2deae4120227e6efc&auto=format&fit=crop&w=1953&q=80',
'https://images.unsplash.com/photo-1508704019882-f9cf40e475b4?ixlib=rb-0.3.5&ixid=eyjhcbfawqiojeymdd9&s=8c6e5e3aba713b17aa1fe71ab4f0ae5b&auto=format&fit=crop&w=1352&q=80',
'https://images.unsplash.com/photo-1519985176271-adb1088fa94c?ixlib=rb-0.3.5&ixid=eyjhcbfawqiojeymdd9&s=a0c8d632e977f94e5d312d9893258f59&auto=format&fit=crop&w=1355&q=80'
];
最终列表子项=映射(
英格利特,
(索引一){
返回容器(
边距:所有边缘集(5.0),
孩子:ClipRRect(
borderRadius:borderRadius.all(半径.圆形(5.0)),
子:堆栈(子:[
Image.net