代码错误,Flutter中的BuildContext

时间:2019-12-12 06:18:39

标签: flutter dart

我正在使用不同的构建方法制作一个应用程序,以便在单击“爱心”按钮时可以列出项目列表以将其保存在另一个屏幕上。但是我在代码中出现错误。我正在关注Flutter Codelabs app tutorial part 2。 我的代码:

import 'package:aioapp2/lists.dart';
import 'package:flutter/material.dart';

class _FavoriteListState extends State<FavoriteList> {
  final _suggestions = [];
  final Set<Widget> _saved = Set<Widget>();

Widget _buildList() {
return ListView.builder(
  itemCount: 53,
  itemBuilder: (BuildContext context, int index) {
    return _buildRow(_suggestions[index]);
  },
);
  }

Widget _buildRow(Widget website){
  final bool alreadySaved = _saved.contains(website);
  return Card(
    child: Container(
      child: ListTile(
        contentPadding: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
        subtitle: Row(
          children: <Widget>[
          // Image.asset('lib/images/${images[index]}'),
        ],
      ),
    ),
  ),
);
}

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: _buildList(),
  );
}
}

class FavoriteList extends StatefulWidget {
@override
_FavoriteListState createState() => _FavoriteListState();
}

我面临的错误是在 Image.asset()行中。在键入以下行时,其在“索引”下显示红线。但这不应该,这就是问题所在!有帮助吗?

3 个答案:

答案 0 :(得分:0)

您正在尝试从index方法中引用变量_buildRow,但该变量在那里不存在。看看这段代码摘录

Widget _buildList() {
  return ListView.builder(
    itemCount: 53,
    itemBuilder: (BuildContext context, int index) { // <-- index declared here
      return _buildRow(_suggestions[index]);
    },
  );
}

Widget _buildRow(Widget website){
  final bool alreadySaved = _saved.contains(website);
  return Card(
    child: Container(
      child: ListTile(
        contentPadding: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
        subtitle: Row(
          children: <Widget>[
            // Image.asset('lib/images/${images[index]}'), // <-- index has not been declared here
          ],
        ),
      ),
    ),
  );
}

这是范围的示例。变量index_buildList中的builder方法中定义。这意味着变量仅存在于此。您无法在该方法之外访问它,因此,当您尝试在_buildRow中访问它时,会收到错误消息。

如果要将索引的值传递给_buildRow,则需要将其作为参数传递给_buildRow方法:

Widget _buildList() {
  return ListView.builder(
    itemCount: 53,
    itemBuilder: (BuildContext context, int index) { // <-- index declared here
      return _buildRow(_suggestions[index], index); // Passing it as an argument
    },
  );
}

Widget _buildRow(Widget website, int index) {
  final bool alreadySaved = _saved.contains(website);
  return Card(
    child: Container(
      child: ListTile(
        contentPadding: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
        subtitle: Row(
          children: <Widget>[
            Image.asset('lib/images/${images[index]}'), // <-- index has been declared in the parameter list so everything is ok here
          ],
        ),
      ),
    ),
  );
}

(您的代码也未在任何地方声明images,但我假设您在未共享的代码中的其他地方声明了该代码,因为您没有在那里报告错误。)

答案 1 :(得分:0)

尝试这种简单的解决方法:

import 'package:flutter/material.dart';

void main() => runApp(
  MaterialApp(
    home: FavoriteList(),
  )
);


class _FavoriteListState extends State<FavoriteList> {
  final _suggestions = [{
      'image' : 'ic_play.png'
    },
    {
      'image' : 'ic_play.png'
    },
    {
      'image' : 'ic_play.png'
    },
    {
      'image' : 'ic_play.png'
    }
  ];

  final Set<Widget> _saved = Set<Widget>();

Widget _buildList() {
    return ListView.builder(
      itemCount: _suggestions.length,
      itemBuilder: (BuildContext context, int index) {
        return _buildRow(_suggestions[index]);
      },
    );
  }

Widget _buildRow(dynamic website){
  return Card(
    child: Container(
      child: ListTile(
        contentPadding: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
        subtitle: Row(
          children: <Widget>[
          Image.asset('assets/images/${website['image']}'),
        ],
      ),
    ),
  ),
);
}

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: _buildList(),
  );
}
}

class FavoriteList extends StatefulWidget {
@override
_FavoriteListState createState() => _FavoriteListState();
}



答案 2 :(得分:0)

应该

Image.asset('lib/images/${images[index]}'),

Image.asset('lib/images/${index}.png'), // Provide you have 0.png, 1.png .... in lib folder

或者您应该有一个String数组,将图像命名为

String[] images=["1.png","2.png"];

===== 我看不到任何要在注释代码中引用的可变图像。