如何使用 Provider 将数据从文本字段输入传递到另一个页面

How can I pass data from a TextFieldInput to another Page with Provider

我想在单击按钮后使用 Provider 将数据(字符串)从 TextField 传递到第二个页面。

Here is my code

首先,在第 70 行的 main.dart 文件中,执行以下操作:

Provider.of<NameProvider>(context).saveName(name);

然后在第二页你要使用这个Provider.of<NameProvider>(context).name;

如果您更愿意为此目的使用提供程序, 将您的提供商 saveName 函数编辑为:

  saveName(String _name) {
    name = _name;
    notifyListeners();
  }

在SecondPage()中添加 你的构建方法的提供者是这样的:

class SecondPage extends StatelessWidget {
  const SecondPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
  final nameProvider = Provider.of< NameProvider>(context);

然后调用 :

获取字符串值
    Text(
      "Name: ${nameProvider.name}",
      style : ....

更新您的 name_provider class

class NameProvider extends ChangeNotifier {
  String _name = "";

  String get getName => _name;

  saveName(String name) {
    _name = name;
    notifyListeners();
  }
}

name 变量被设为私有,以避免在调用函数时得到错误的结果。

现在对 main.dart 文件进行了此编辑

class _MyHomePageState extends State<MyHomePage> {
  String name = "";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Padding(
        padding: const EdgeInsets.all(20),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              const Text(
                'Please enter your name',
              ),
              TextField(
                onSubmitted: (value) {
                  setState(() {
Provider.of<NameProvider>(context).saveName(value);
                  });
                },
                onChanged: (value) {
                  setState(() {
                    name = value;
                  });
                },
              ),
              Text("Name: $name"),
              TextButton(
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => const SecondPage(),
                    ),
                  );
                },
                child: const Text("To Second Page"),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

现在在第二页中获取名称:

class SecondPage extends StatelessWidget {
  const SecondPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Second Page"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(20),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: const [
              Text(
                "Name:",
                style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
              ),
              Text(
                
                Provider.of<NameProvider>(context).getName,
                style: TextStyle(fontSize: 32),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

如果有某种预期的字符串但出现...错误,请将 getName 替换为 '${Provider.of<NameProvider>(context).getName}'

让我们知道此解决方案是否有效

这是完整的工作代码。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class ProviderCheck extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => NameProvider(),
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: const MyHomePage(title: 'Provider Problem'),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String name = "";
//it will store data in typed in textfield
  final TextEditingController _textEditingController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Padding(
        padding: const EdgeInsets.all(20),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              const Text(
                'Please enter your name',
              ),
              TextField(
                controller: _textEditingController,//texteditingcontroller set to textfield
                onSubmitted: (value) {
                  setState(() {
                    name = value;
                  });
                },
                onChanged: (value) {
                  setState(() {
                    name = value;
                  });
                },
              ),
              Text("Name: $name"),
              TextButton(
                onPressed: () {
                  //saveName method called using provider and name saved.
                  Provider.of<NameProvider>(context, listen: false)
                      .saveName(_textEditingController.text);
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => const SecondPage(),
                    ),
                  );
                },
                child: const Text("To Second Page"),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class NameProvider extends ChangeNotifier {
  String name = "";

  String get getName => name;
//name1 value will set to name variable
  saveName(String name1) {
    name = name1;
    notifyListeners();
  }
}

class SecondPage extends StatelessWidget {
  const SecondPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Second Page"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(20),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              //using provider, we can access the saved name
              Text(
                "Name:${Provider.of<NameProvider>(context, listen: false).getName}",
                style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
              ),
              Text(
                //TODO: Name should be displayed here
                "Name",
                style: TextStyle(fontSize: 32),
              ),
            ],
          ),
        ),
      ),
    );
  }
}