簡體   English   中英

如何使用 Provider 將數據從 TextFieldInput 傳遞到另一個頁面

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

單擊按鈕后,我想使用 Provider 將數據(字符串)從 TextField 傳遞到第二個頁面。

這是我的代碼

更新您的姓名_提供者 class

class NameProvider extends ChangeNotifier {
  String _name = "";

  String get getName => _name;

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

name 變量被設為私有,以避免在調用 function 時得到錯誤的結果。

現在對 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"),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

現在在 SecondPage 中獲取名稱:

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}'

讓我們知道此解決方案是否有效

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

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

然后在您要使用此Provider.of<NameProvider>(context).name;

如果您更願意為此目的使用提供商,請將您的提供商 saveName Function 編輯為:

  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 : ....

這是完整的工作代碼。

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),
              ),
            ],
          ),
        ),
      ),
    );
  }
}


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM