Flutter Provider 问题 - 更改未反映出来

Flutter Provider Issue - Changes are not reflecting

任何人都可以告诉我为什么这段代码不起作用吗?我有一个数据模型文件,一个页面文件,我有一个搜索文本和列表视图来显示名称和主文件。如果我在搜索栏上输入内容,名称应该被过滤。请检查代码并让我知道我做错了什么。

import 'package:flutter/widgets.dart';
import 'package:flutter/cupertino.dart';

import './class.dart';`enter code here`

class NameList with ChangeNotifier {
  List<NameDetails> names = [
    NameDetails('2', 'Mahesh'),
    NameDetails('1', 'Ganesh'),
    NameDetails('3', 'Suresh'),
    NameDetails('4', 'Girish'),
  ];

  List<NameDetails> get getNames {
    return names;
  }

  void filterNames(String fil) {
    List<NameDetails> names1;
    names1 = names.where((n) => n.name.contains(fil));
    names=names1;
    notifyListeners();
  }
}
import 'package:flutter/material.dart';
import 'package:practice/class.dart';
import 'package:provider/provider.dart';
import './data.dart';

class MainScreen extends StatefulWidget {
  @override
  _MainScreenState createState() => _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {
  NameList namesList;
  String filterValue;

  @override
  Widget build(BuildContext context) {
    final namesList = Provider.of<NameList>(context);
    List<NameDetails> names = namesList.names;
    return Scaffold(
        appBar: AppBar(
          title: TextField(
            onChanged: (text) {
              namesList.filterNames(text);
            },
          ),
        ),
        body: Column(
          children: <Widget>[
            Container(
              height: 200,
              child: Container(
                height: 200,
                child: ListView.builder(
                  itemBuilder: (ctx, index) {
                    return Card(
                      child: Text('${names[index].name}'),
                    );
                  },
                  itemCount: names.length,
                ),
              ),
            ),
          ],
        ));
  }
}
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import './mainScreen.dart';
import './data.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
        create: (context) => NameList(),
        child: MaterialApp(
          title: 'Test',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MainScreen(),
        ));
  }
}

您可以复制粘贴 运行 下面的完整代码
第1步:可以把filter函数放在getNames里,用List<NameDetails> names = namesList.getNames;
第 2 步:filterNames 函数仅更新 _searchString 并执行 notifyListeners()

代码片段

class NameList with ChangeNotifier {
  List<NameDetails> names = ...

  String _searchString = "";

  UnmodifiableListView<NameDetails> get getNames => _searchString.isEmpty
      ? UnmodifiableListView(names)
      : UnmodifiableListView(
          names.where((n) => n.name.contains(_searchString)));

  void filterNames(String fil) {
    _searchString = fil;
    print(_searchString);
    notifyListeners();
  }
}

...
Widget build(BuildContext context) {
    final namesList = Provider.of<NameList>(context);
    List<NameDetails> names = namesList.getNames;

工作演示

完整代码

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

class NameDetails {
  String id;
  String name;

  NameDetails(this.id, this.name);
}

class NameList with ChangeNotifier {
  List<NameDetails> names = [
    NameDetails('2', 'Mahesh'),
    NameDetails('1', 'Ganesh'),
    NameDetails('3', 'Suresh'),
    NameDetails('4', 'Girish'),
  ];

  String _searchString = "";

  UnmodifiableListView<NameDetails> get getNames => _searchString.isEmpty
      ? UnmodifiableListView(names)
      : UnmodifiableListView(
          names.where((n) => n.name.contains(_searchString)));

  void filterNames(String fil) {
    _searchString = fil;
    print(_searchString);
    notifyListeners();
  }
}

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
        create: (context) => NameList(),
        child: MaterialApp(
          title: 'Test',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MainScreen(),
        ));
  }
}

class MainScreen extends StatefulWidget {
  @override
  _MainScreenState createState() => _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {
  NameList namesList;
  String filterValue;

  @override
  Widget build(BuildContext context) {
    final namesList = Provider.of<NameList>(context);
    List<NameDetails> names = namesList.getNames;
    return Scaffold(
        appBar: AppBar(
          title: TextField(
            onChanged: (text) {
              namesList.filterNames(text);
            },
          ),
        ),
        body: Column(
          children: <Widget>[
            Container(
              height: 200,
              child: Container(
                height: 200,
                child: ListView.builder(
                  itemBuilder: (ctx, index) {
                    return Card(
                      child: Text('${names[index].name}'),
                    );
                  },
                  itemCount: names.length,
                ),
              ),
            ),
          ],
        ));
  }
}