Flutter 在小部件之间传递数据
我有一个父窗口小部件Flutter 在小部件之间传递数据,flutter,Flutter,我有一个父窗口小部件\u CalendarPageState和两个子窗口小部件nameColumnContainer2和nameColumn2。我在int listLoc=list.indexOf(time)下有一个数据内部nameColumnContainer2我想传递给nameColumn2 import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'update_green_page.d
\u CalendarPageState
和两个子窗口小部件nameColumnContainer2
和nameColumn2
。我在int listLoc=list.indexOf(time)下有一个数据代码>内部nameColumnContainer2
我想传递给nameColumn2
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'update_green_page.dart';
import '../data/repository_service_addcash.dart';
import '../models/addcash.dart';
import 'widget_ui/choice_chip.dart';
class CalendarPage extends StatefulWidget {
@override
_CalendarPageState createState() => _CalendarPageState();
}
class _CalendarPageState extends State<CalendarPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
child: Row(
children: nameColumnContainer2(),
),
),
],
),
),
);
}
List<Widget> nameColumnContainer2() {
var list = <DateTime>[];
DateTime start = DateTime(2019, 12, 01);
final end = DateTime(2021, 12, 31);
while (start.isBefore(end)) {
list.add(start);
start = start.add(const Duration(days: 1));
}
var listDates = list.map((DateTime time) {
return DateFormat("MM-dd-yyyy").format(time);
}).toList();
return list.map((DateTime time) {
int listLoc = list.indexOf(time); //NEED TO PASS THIS DOWN TO nameColumn2
return Container(
decoration: BoxDecoration(border: Border.all(color: Colors.blue)),
width: 120,
child: ListView(
shrinkWrap: true,
children: <Widget>[
FutureBuilder<List<AddCash>>(
future: future,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Column(
children:
snapshot.data.map((todo) => nameColumn2(todo)).toList(),
);
} else {
return SizedBox();
}
},
),
],
),
);
}).toList();
}
Widget nameColumn2(AddCash addCash) {
return Container(
alignment: Alignment.center,
width: 120.0,
height: 60.0,
color: Colors.green,
margin: EdgeInsets.all(4.0),
child: Row(
children: <Widget>[
Text('${addCash.amount}'),
listLoc % 6 == 0
? Text('${addCash.amount}')
: listLoc % 2 == 0 ? Text('no') : Text('d')
],
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“包:intl/intl.dart”;
导入“更新绿色页面.dart”;
导入“../data/repository_service_addcash.dart”;
导入“../models/addcash.dart”;
导入“widget_ui/choice_chip.dart”;
类CalendarPage扩展StatefulWidget{
@凌驾
_CalendarPageState createState()=>\u CalendarPageState();
}
类_CalendarPageState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:SingleChildScrollView(
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
容器(
孩子:排(
子项:nameColumnContainer2(),
),
),
],
),
),
);
}
列表名称ColumnContainer2(){
var列表=[];
日期时间开始=日期时间(2019年12月1日);
最终结束=日期时间(2021、12、31);
while(start.isBefore(end)){
列表。添加(开始);
开始=开始.添加(常数持续时间(天:1));
}
var listDates=list.map((日期时间){
返回日期格式(“MM dd yyyy”)。格式(时间);
}).toList();
返回列表.map((日期时间){
int listLoc=list.indexOf(time);//需要将其传递给nameColumn2
返回容器(
装饰:框装饰(边框:border.all(颜色:Colors.blue)),
宽度:120,
子:ListView(
收缩膜:对,
儿童:[
未来建设者(
未来:未来,,
生成器:(上下文,快照){
if(snapshot.hasData){
返回列(
儿童:
snapshot.data.map((todo)=>nameColumn2(todo)).toList(),
);
}否则{
返回SizedBox();
}
},
),
],
),
);
}).toList();
}
小部件名称栏2(AddCash AddCash){
返回容器(
对齐:对齐.center,
宽度:120.0,
身高:60.0,
颜色:颜色。绿色,
边距:所有边集(4.0),
孩子:排(
儿童:[
文本(“${addCash.amount}”),
listLoc%6==0
?文本(“${addCash.amount}”)
:listLoc%2==0?文本('no'):文本('d'))
],
),
);
}
}
如何将数据传递到父窗口小部件,使其在两个窗口小部件中都可用?您应该在父窗口小部件中或直接在main.dart中使用BlocProvider窗口小部件
以下是一个例子:
- 首先申报您的BlocProvider
- BlocProvider内容
- 创建一个bloc(这样您就可以将您的逻辑与ui分离)并填充所需的数据
- 最后,恢复父/子系统中的数据
我只需将listLoc
传递到nameColumn2
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'update_green_page.dart';
import '../data/repository_service_addcash.dart';
import '../models/addcash.dart';
import 'widget_ui/choice_chip.dart';
class CalendarPage extends StatefulWidget {
@override
_CalendarPageState createState() => _CalendarPageState();
}
class _CalendarPageState extends State<CalendarPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
child: Row(
children: nameColumnContainer2(),
),
),
],
),
),
);
}
List<Widget> nameColumnContainer2() {
var list = <DateTime>[];
DateTime start = DateTime(2019, 12, 01);
final end = DateTime(2021, 12, 31);
while (start.isBefore(end)) {
list.add(start);
start = start.add(const Duration(days: 1));
}
var listDates = list.map((DateTime time) {
return DateFormat("MM-dd-yyyy").format(time);
}).toList();
return list.map((DateTime time) {
int listLoc = list.indexOf(time); //NEED TO PASS THIS DOWN TO nameColumn2
return Container(
decoration: BoxDecoration(border: Border.all(color: Colors.blue)),
width: 120,
child: ListView(
shrinkWrap: true,
children: <Widget>[
FutureBuilder<List<AddCash>>(
future: future,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Column(
children:
snapshot.data.map((todo) => nameColumn2(todo)).toList(),
);
} else {
return SizedBox();
}
},
),
],
),
);
}).toList();
}
Widget nameColumn2(AddCash addCash) {
return Container(
alignment: Alignment.center,
width: 120.0,
height: 60.0,
color: Colors.green,
margin: EdgeInsets.all(4.0),
child: Row(
children: <Widget>[
Text('${addCash.amount}'),
listLoc % 6 == 0
? Text('${addCash.amount}')
: listLoc % 2 == 0 ? Text('no') : Text('d')
],
),
);
}
}
class BlocProvider extends InheritedWidget {
final MainBloc bloc;
final Widget child;
BlocProvider({Key key, @required this.child, @required this.bloc}) : super(key: key);
static BlocProvider of(BuildContext context) {
return context.inheritFromWidgetOfExactType(BlocProvider);
}
@override
bool updateShouldNotify(InheritedWidget oldWidget) {
return null;
}
}
class MainBloc {
//Declare the data you need in your tree
}
your_data = BlocProvider.of(context).bloc.your_data;