【问题标题】:Variable scope withing the Flutter StatefulWidgetFlutter StatefulWidget 的可变作用域
【发布时间】:2019-06-27 16:34:32
【问题描述】:

我正在尝试访问build() 中的moviesList,结果如下。如果有人能指出真正的问题,将不胜感激。提前致谢。

flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
flutter: The following NoSuchMethodError was thrown building MyListScreen(dirty, state:
flutter: _MyListScreenState#21007):                                     
flutter: The getter 'results' was called on null.                       
flutter: Receiver: null                                                 
flutter: Tried calling: results 

sn-p的代码如下:

class _MyListScreenState extends State<MyListScreen> {

  MoviesList moviesList;

  _getLatestMovies() {
    APIService.getMoviesNowPlaying().then((response) {
      setState(() {
        final jsonData = json.decode(response.body);
        moviesList = new MoviesList.fromJson(jsonData);
        // moviesList(new MoviesList.fromJson(jsonData));

        for (var i = 0; i < moviesList.results.length; i++) {
        print(moviesList.results[i].title);
        }
      });
    });
  }

  @override
  initState() {
    super.initState();
    _getLatestMovies();
  }

  @override
  Widget build(context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("View Title"),
        ),
        body: ListView.separated(
          padding: EdgeInsets.zero,
          itemCount: moviesList.results.length,
          itemBuilder: (context, index) {
            // return ListTile(title: Text(moviesList.results[index].title));
          },
          separatorBuilder: (context, index) {
            return Divider();
          },
        ));
  }
}

【问题讨论】:

    标签: flutter statefulwidget


    【解决方案1】:

    使用

    itemCount: moviesList != null ? moviesList.results.length : 0,
    

    你的build()moviesList被初始化之前被调用,所以在这里我们首先检查null,如果null使用0作为itemCount,否则使用它的长度。

    【讨论】:

    • 谢谢,它不能解决我的问题。我需要 build() 中的 moviesList.results 数据。有什么建议吗?
    • 我提供的解决方案正是您要寻找的,您能告诉我您在哪一行得到错误吗?
    • 发现问题出在数据流上。 APIService.getMoviesNowPlaying() 是异步的,使用 moviesList.results.length 在 itemCount 中删除异步结果的正确数据。
    • 请解释您的代码 sn-p 如何解决 OP 的问题。
    • @ifconfig OP 出现问题,因为在 moviesList 初始化之前调用了 build(),所以在这里我们检查 null,如果 null 使用 0 作为 itemCount 和如果不为空,请使用length
    【解决方案2】:

    解决方案(可能是一个):

    问题背后的真正原因不是变量范围,而是异步执行的方式完全错误,重新设计解决了这个问题。在 FutureBuilder 中移动了 _getLatestMovies();

    改进了下面粘贴的一个:

      @override
      Widget build(context) {
        var futureBuilder = FutureBuilder(
            future: _getLatestMovies(),
            builder: (context, snapshot) {
              if (snapshot.data != null) {
                return ListView.separated(
                    padding: EdgeInsets.zero,
    
    

    通过这一举措,FutureBuilder 等待方法的结果并作为快照传递到 ListView。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-28
      • 2021-11-15
      • 2020-04-11
      • 2021-06-24
      • 2020-10-13
      • 2020-04-06
      • 2020-06-11
      • 2019-08-25
      相关资源
      最近更新 更多