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;