Проблема провайдера флаттера - изменения не отражают - PullRequest
1 голос
/ 16 марта 2020

Может кто-нибудь, пожалуйста, дайте мне знать, почему этот код не работает? У меня есть один файл модели данных, один файл для страницы, где у меня есть текст поиска и просмотр списка для отображения имен и основного файла. Если я ввожу что-то в строку поиска, имена должны быть отфильтрованы. Пожалуйста, проверьте код и дайте мне знать, что я сделал неправильно.

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 Ответ

0 голосов
/ 19 марта 2020

Вы можете скопировать и вставить полный код ниже
Шаг 1: Вы можете поместить функцию фильтра в 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;

рабочая демонстрация

enter image description here

полный код

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