从嵌套的窗口小部件类访问多提供者数据以进行搜索[基础库捕获到异常]

时间:2019-12-04 15:45:34

标签: flutter setstate flutter-provider statefulwidget statelesswidget

我希望能够搜索来自API的列表中的数据,并使用选择的值来显示详细信息页面。

我正在使用Provider package

我有一个更改通知程序,可以获取所需数据:

class NotifierClass with ChangeNotifier {
  List<Map> _contentList = <...some api call...>;
  List<Map> _filteredContent = _contentList;

  List<Map> get filteredContent => _filteredContent;

  void createFilterContent(String query) {
    _filteredContent = _contentList;
    if (query.isNotEmpty && query != null && query != '') {
      _filteredContent = _filteredContent 
          .where((i) => i.title.toLowerCase().contains(query.toLowerCase()))
          .toList();
    }
    notifyListeners();
  }
}

即如果查询为空,则返回完整列表。否则,什么都不做。

我将我的应用包装在一个多提供程序中,因为它将有其他提供程序:

void main() => runApp(
  MultiProvider(
    providers: [
      ChangeNotifierProvider(
        create: (_) => NotifierClass(),
      )
    ],
    child: MyApp(),
  ),
);

MyApp具有以下嵌套:

    |__Home (StatefulWidget)
    |  |__Screen 1 (StatelessWidget)
    |  |__Screen 2 (StatefulWidget)
    |     |__search (widget)
    |     |__content (widget)
    |__ContentDetail (StatelessWidget)
    ...

我希望search在键入内容时呼叫createFilterContent

我希望content成为Selector的开头{{1}更改时filteredContent的{​​{1}}

我尝试了很多事情。我唯一尝试过的方法是在MyApp中声明一个contentNotifier,然后将其向下推到小部件树中:

在MyApp版本中声明:

search

一直推到屏幕2:

NotifierClass contentNotifier = Provider.of<NotifierClass >(context);

这使我可以访问NotifierClass中的函数。然后,我定义了一个搜索控制器:

class ScreenTwoPage extends StatefulWidget { ScreenTwoPage (NotifierClass contentNotifier , {Key key}) : super(key: key); @override _ScreenTwoPageState createState() => _ScreenTwoPageState(); } class _ScreenTwoPageState extends State<ScreenTwoPage > { NotifierClass contentNotifier ; _ScreenTwoPageState(this.contentNotifier); ...

使用文本字段的final searchController = TextEditingController();方法调用onchanged函数,其中createFilterContentsearchController.text。这将重建整个窗口小部件树,为我提供一个新的query列表以构建我的filteredContent列表视图。

我使用content中的数据,

Screen 2

从我的Navigator.of(context) .pushNamed('/contentDetail', arguments: contentList[index]);内部进入详细信息页面

它可以满足我的要求,但是每次我与listview builder上的小部件进行交互时都会引发此错误:

Screen 2

此外,这似乎很混乱,通过将════════ Exception caught by foundation library ════════════════════════════════ setState() or markNeedsBuild() called during build. ════════════════════════════════════════════════════════════════════════════════ 推到小部件树下似乎违反了contentNotifier包的目的。

我是新手。非常感谢您提供任何帮助。

0 个答案:

没有答案