Flutter 无法使用Flatter上的平面按钮中的提供程序将数据添加到列表中

Flutter 无法使用Flatter上的平面按钮中的提供程序将数据添加到列表中,flutter,flutter-provider,Flutter,Flutter Provider,我在这个颤振代码中使用了Provider4.3.2,这是一个简单的颤振应用程序,它有一个文本字段、平面按钮和一个包含文本小部件的列表视图生成器。我创建了一个类ListData,该类包含列表,并使用提供程序显示在列表视图生成器中。问题是,我在ListData类中创建了一个addData方法。我使用此方法在onPressed方法中使用提供程序将数据添加到列表中的平面按钮添加它是抛出错误的,无法找到。这个问题的解决方案。这也是我的主应用程序的一个简短形式 您可以复制粘贴运行下面的完整代码 你需要建设者

我在这个颤振代码中使用了Provider4.3.2,这是一个简单的颤振应用程序,它有一个文本字段、平面按钮和一个包含文本小部件的列表视图生成器。我创建了一个类ListData,该类包含列表,并使用提供程序显示在列表视图生成器中。问题是,我在ListData类中创建了一个addData方法。我使用此方法在onPressed方法中使用提供程序将数据添加到列表中的平面按钮添加它是抛出错误的,无法找到。这个问题的解决方案。这也是我的主应用程序的一个简短形式


您可以复制粘贴运行下面的完整代码 你需要建设者和倾听:错误 代码片段

Builder(builder: (BuildContext context) {
        return FlatButton(
          child: Text("Add"),
          color: Colors.blue,
          onPressed: () {
            Provider.of<ListData>(context, listen: false).addData(data);
          },
        );
      }),
工作演示

完整代码

import 'dart:collection';

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    String data;
    return ChangeNotifierProvider(
      create: (context) => ListData(),
      child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text("list"),
          ),
          body: Column(
            children: [
              TextField(
                onChanged: (value) => data = value,
              ),
              Builder(builder: (BuildContext context) {
                return FlatButton(
                  child: Text("Add"),
                  color: Colors.blue,
                  onPressed: () {
                    Provider.of<ListData>(context, listen: false).addData(data);
                  },
                );
              }),
              Expanded(
                child: MyListView(),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class MyListView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemBuilder: (context, index) {
        return Text(Provider.of<ListData>(context).listData[index]);
      },
      itemCount: Provider.of<ListData>(context).listCount,
    );
  }
}

class ListData extends ChangeNotifier {
  List _listData = [
    'Hello',
    "hi",
  ];

  UnmodifiableListView get listData {
    return UnmodifiableListView(_listData);
  }

  int get listCount {
    return _listData.length;
  }

  void addData(String data) {
    _listData.add(data);
    notifyListeners();
  }
}

您可以复制粘贴运行下面的完整代码 你需要建设者和倾听:错误 代码片段

Builder(builder: (BuildContext context) {
        return FlatButton(
          child: Text("Add"),
          color: Colors.blue,
          onPressed: () {
            Provider.of<ListData>(context, listen: false).addData(data);
          },
        );
      }),
工作演示

完整代码

import 'dart:collection';

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    String data;
    return ChangeNotifierProvider(
      create: (context) => ListData(),
      child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text("list"),
          ),
          body: Column(
            children: [
              TextField(
                onChanged: (value) => data = value,
              ),
              Builder(builder: (BuildContext context) {
                return FlatButton(
                  child: Text("Add"),
                  color: Colors.blue,
                  onPressed: () {
                    Provider.of<ListData>(context, listen: false).addData(data);
                  },
                );
              }),
              Expanded(
                child: MyListView(),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class MyListView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemBuilder: (context, index) {
        return Text(Provider.of<ListData>(context).listData[index]);
      },
      itemCount: Provider.of<ListData>(context).listCount,
    );
  }
}

class ListData extends ChangeNotifier {
  List _listData = [
    'Hello',
    "hi",
  ];

  UnmodifiableListView get listData {
    return UnmodifiableListView(_listData);
  }

  int get listCount {
    return _listData.length;
  }

  void addData(String data) {
    _listData.add(data);
    notifyListeners();
  }
}
您需要将FlatButton包装到消费者小部件中,因为Provider.of是使用作为提供者祖先的BuildContext调用的

返回ChangeNotifierProvider create:=>ListData, 儿童:消费者 生成器:=>listData,listData,=>FlatButtonNoPressed:=>listData.addDatadata, }, ; 查看本文,通过简单的示例了解更多信息,帮助您理解为什么会出现错误以及如何使用错误

您需要将FlatButton包装到消费者小部件中,因为Provider.of是使用作为提供者祖先的BuildContext调用的

返回ChangeNotifierProvider create:=>ListData, 儿童:消费者 生成器:=>listData,listData,=>FlatButtonNoPressed:=>listData.addDatadata, }, ; 查看本文,通过简单的示例了解更多信息,帮助您理解为什么会出现错误以及如何使用错误