Flutter:在ListView.builder中的第n行添加广告

时间:2019-02-06 07:02:38

标签: android flutter

在Android Studio中,我使用了带有getItemViewType()的RecyclerView.Adapter和RecyclerView.ViewHolder来确定RecyclerView中一行的位置,并在第10行放置广告。但是在颤振中,我不知道如何实现这一目标,并且在过去的两天里,我一直在网上寻找东西,或者也许我不知道它在颤振中叫什么。我可能不需要代码示例,我需要一些指导,以了解如何浏览或在网上浏览。 提示:我正在使用ListView.builder从API接收数据并将其显示在ListView.builder中。

编辑:我正在添加代码以使其更加清晰:

void main() {
  runApp(MaterialApp(
    debugShowCheckedModeBanner: false,
    home: HomePage(),
  ));
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

  Map data;
  List recentNews;
  var _textController = TextEditingController();

  Future getRecent() async {
    String url = 'https://example.com/api';
    http.Response response = await http.get(url, headers: {HttpHeaders.authorizationHeader: ApiKey});
    data = json.decode(response.body);
    setState(() {
      recentNews = data["data"];
    });
  }

  @override
  void initState() {
    super.initState();
    getRecent();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
        home: DefaultTabController(
        child: Scaffold(
      appBar: new AppBar(
        iconTheme: new IconThemeData(color: Colors.black),
        backgroundColor: Colors.white,
        title: Text("TEST", style: TextStyle(color: Colors.black),),
      ),
      body:
          ListView.builder(
            itemCount: recentNews == null ? 0 : recentNews.length,
            itemBuilder: (BuildContext context, int index) {
              String serverTime = "${recentNews[index]["createdAt"]["date"]}";
              DateTime time = DateTime.parse(serverTime);
              String agoTime = timeago.format(time);
              return Card(
                child: Padding(
                  padding: const EdgeInsets.all(10.0),
                  child: InkWell(
                    onTap: (){
                      var route = new MaterialPageRoute(
                        builder: (BuildContext context) =>
                        new WebView(slug: recentNews[index]["slug"], title: recentNews[index]["title"]),
                      );
                      Navigator.of(context).push(route);
                    },
                    child: Column(
                      children: <Widget>[
                        new Container(
                            child: new Image.network(recentNews[index]["image_url"])
                        ),
                        Padding(
                          padding: const EdgeInsets.all(10.0),
                          child: Text("${recentNews[index]["title"]}",
                            style: TextStyle(
                              fontSize: 20.0,
                              fontWeight: FontWeight.w700,
                            ),),
                        ),
                        new Row(
                          children: <Widget>[
                            Text("${recentNews[index]["source"]["name"]}"),
                            Text(" - "),
                            Text(agoTime),
                          ],
                        )
                      ],
                    ),
                  ),
                ),
              );
            },
          ),
    ),
        ),
    );
  }
}

2 个答案:

答案 0 :(得分:0)

尝试ListView.separated()

在septed()构造函数中,您将生成一个列表,并可以指定每个项目之间的分隔符。

ListView.separated(
      itemBuilder: (context, position) {
        return ListItem();
      },
      separatorBuilder: (context, position) {
        return SeparatorItem();
      },
      itemCount: itemCount,  //nth item as ads. 
),

这种类型的列表可让您动态定义分隔符,针对不同类型的项目使用不同类型的分隔符,在需要时添加或删除分隔符,等等。

此实现还可用于轻松插入其他类型的元素(例如广告),而无需对列表项中间的主列表进行任何修改。

答案 1 :(得分:0)

尝试使用ListView.separated()

在split()构造函数中,您将生成一个列表,并可以指定每个项目之间的分隔符。

ListView.separated( 
    itemBuilder: (context, position) { 
    return ListItem(); 
}, 
separatorBuilder: (context, position) { 
    return Container(child: (index != 0 && index % 5 == 0) ? 
    AdmobBanner(adUnitId: getBannerAdUnitId(), adSize: 
    AdmobBannerSize.BANNER, listener: (AdmobAdEvent event, Map args) 
    { //handleEvent(event, args, 'Banner'); },

):分频器(高度:2.0,)); },itemCount:itemCount,//第n个广告项。 )

祝你好运。