在不使用导航器的情况下在小部件之间传递数据?

时间:2019-05-31 01:35:00

标签: flutter state

我有些扑朔迷离。 我有两个小部件“详细信息”屏幕,因此在第一个“详细信息”中,我有一个列表,我想不使用导航器将其发送到第二个“屏幕”。

所以,如果有人可以帮助我,我将非常感激。

详细信息:

 List<String> _instructions = [];

class Details extends StatefulWidget {
  @override
  _DetailsState createState() => new _DetailsState();
}

class _DetailsState extends State<Details> {
              Expanded(
                child: Container(
                  margin: EdgeInsets.all(3),
                  child: OutlineButton(
                    highlightElevation: 21,
                    color: Colors.white,
                    shape: StadiumBorder(),
                    textColor: Colors.lightBlue,
                    child: Text(
                      'ENVOYER',
                      style: TextStyle(
                        fontSize: 16,
                        fontWeight: FontWeight.bold,
                        fontStyle: FontStyle.normal,
                        color: Colors.lightBlue,
                      ),
                    ),
                    borderSide: BorderSide(
                        color: Colors.lightBlue,
                        style: BorderStyle.solid,
                        width: 1),
                    onPressed: () {

                    },
                  ),
                ),
              ),
}}

所以我想要的是,当我按下按钮时,我会将列表发送到下一个小部件,而无需使用导航器。

3 个答案:

答案 0 :(得分:0)

您可以使用sharedpreferance,这是属于应用程序的简单xml。这就是您可以设置的方式

Future<bool> setStringList(String key, List<String> value) =>
_setValue('StringList', key, value);

Future<bool> setStringList (
 String key, 
 List<String> value
) 

有关更多信息,这里是link 您可以通过以下方式获取列表

List<String> getStringList(String key) {
  List<Object> list = _preferenceCache[key];
    if (list != null && list is! List<String>) {
      list = list.cast<String>().toList();
      _preferenceCache[key] = list;
    }
    return list;
}

您还可以使用sqflite

答案 1 :(得分:0)

我认为更合适的方法应该类似于使用片段模式或主从流程将android片段彼此连接的方式。 我创建了an example repository来展示完整的概念。 简而言之,想法是创建一个内部带有StreamController的类。这两个小部件都将引用bloc实例。当第一个小部件要向第二个发送数据时,它将一个新项添加到Stream中。第二个监听流并相应地更新其内容。

内部集团:

  StreamController<String> _selectedItemController = new BehaviorSubject();

  Stream<String> get selectedItem => _selectedItemController.stream;

  void setSelected(String item) {
    _selectedItemController.add(item);
  }

第一个片段:

class FragmentList extends StatelessWidget {
  final Bloc bloc;

  const FragmentList(
    this.bloc, {
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: bloc.selectedItem,
      initialData: "",
      builder: (BuildContext context, AsyncSnapshot<String> screenType) {
        return ListView.builder(
          itemBuilder: (context, index) {
            return ListTile(
              selected: bloc.items[index] == screenType.data,
              title: Text(bloc.items[index]),
              onTap: () {
                bloc.setSelected(bloc.items[index]);
              },
            );
          },
          itemCount: bloc.items.length,
        );
      },
    );
  }
}

第二个片段:

class FragmentDetails extends StatelessWidget {
  final Bloc bloc;

  const FragmentDetails(
    this.bloc, {
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(
      child: StreamBuilder(
        initialData: "Nothing selected",
        stream: bloc.selectedItem,
        builder: (BuildContext context, AsyncSnapshot<String> screenType) {
          final info = screenType.data;
          return Text(info);
        },
      ),
    );
  }
}

答案 2 :(得分:0)

假设您有两个页面,即“ page1.dart”和“ page2.dart”,都希望访问同一列表:

  1. 创建另一个dart文件'GlobalVariables.dart',在该文件内,创建一个类gv。

  2. 在此类gv内,使用以下方法创建静态列表:

static List <String> listAnyList = [];
  1. 在需要访问此列表的2个页面中导入“ GlobalVariables.dart”。

  2. 现在,在page1.dart和page2.dart中, 您可以使用gv.listAnyList访问“全局列表”。

如果许多dart文件中需要变量,请使用“全局静态变量”。 “用户ID”,那么您只需使用gv.strUserID即可在所需的任何页面中访问它。