'তালিকা <উইন্ডোজ> টাইপ' তালিকা <উইজেট> 'টাইপের উপপ্রকার নয়


94

আমার কাছে কোডের স্নিপেট রয়েছে যা আমি ফায়ারস্টোর উদাহরণ থেকে অনুলিপি করেছি:

Widget _buildBody(BuildContext context) {
    return new StreamBuilder(
      stream: _getEventStream(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) return new Text('Loading...');
        return new ListView(
          children: snapshot.data.documents.map((document) {
            return new ListTile(
              title: new Text(document['name']),
              subtitle: new Text("Class"),
            );
          }).toList(),
        );
      },
    );
  }

তবে আমি এই ত্রুটি পেয়েছি

type 'List<dynamic>' is not a subtype of type 'List<Widget>'

এখানে কি ভুল হয়?

উত্তর:


211

এখানে সমস্যাটি হ'ল ধরণের অনুমানটি অপ্রত্যাশিতভাবে ব্যর্থ হয়। সমাধানটি হল mapপদ্ধতিটিতে একটি ধরণের আর্গুমেন্ট সরবরাহ করা ।

snapshot.data.documents.map<Widget>((document) {
  return new ListTile(
    title: new Text(document['name']),
    subtitle: new Text("Class"),
  );
}).toList()

আরো জটিল উত্তর যে প্রকার childrenহয় List<Widget>, তখন সেই তথ্যটি প্রতি ফিরে প্রবাহ নেই mapআবাহন। এটি হতে পারে কারণ mapঅনুসরণ করা হয় toListএবং কারণ কোনও বন্ধের প্রত্যাবর্তন এ্যানোটেট টাইপ করার কোনও উপায় নেই।


4
ডার্ট ২ ব্যবহার করে স্ট্রং-মোড বা
ফ্লটারের

এই নির্দিষ্ট পরিবর্তনটি সম্ভবত ডায়ামিকের সাথে তলদেশের উরফ "ফাজি তীর" হিসাবে সম্পর্কিত - পূর্বে এটি একটি তালিকা </ translation> একটি তালিকা <X> </ em> তে নির্ধারণ করা ঠিক ছিল। এটি প্রচুর অনুমানের ফাঁকগুলি coveredাকা দিয়েছে।
জোনাহ উইলিয়ামস

4
টিবিএইচ আমি তার বাগ পুনরুত্পাদন করতে সক্ষম হইনি। যেহেতু তার কোডটি List<ListTile>এটি নির্দিষ্ট না করে এমনকি একটি হিসাবে অনুমান করা হয়েছে map
রুমি রসসলেট

4
ওয়েল যে সমস্যা সমাধান। তবে এটি কিছুটা আশ্চর্যজনক, আমি ডার্টে নতুন, তাই আমি সত্যিই বলতে পারি না যে আমি এটি বুঝতে পেরেছি।
আরশ

আমি একই সমস্যার মুখোমুখি হয়েছি (তবে আমার দৃশ্যপটটি আলাদা ছিল)। আমি মনে করি ডার্ট 2 শক্তিশালী ধরণের কারণে এটি ঘটছে। একবার আমি পরিবর্তনশীল ঘোষণাটি তালিকাতে পরিবর্তন করে <উইজেট> এটি কাজ শুরু করে।
মনীষ কুমার

15

আপনি নির্দিষ্ট প্রকারের সাথে তালিকায় গতিশীল তালিকা কাস্ট করতে পারেন:

List<'YourModel'>.from(_list.where((i) => i.flag == true));


4

আমি মনে করি যে আপনি _buildBody ব্যবহার শিশুদের কিছু উইজেট বৈশিষ্ট্য, তাই শিশুদের আশা একটি তালিকা উইজেট (উইজেট অ্যারে) এবং _buildBody একটি ফেরৎ তালিকায় গতিশীল '

খুব সহজ উপায়ে, আপনি এটি পরিবর্তন করতে একটি পরিবর্তনশীল ব্যবহার করতে পারেন:

// you can build your List of Widget's like you need
List<Widget> widgets = [
  Text('Line 1'),
  Text('Line 2'),
  Text('Line 3'),
];

// you can use it like this
Column(
  children: widgets
)

উদাহরণ ( ঝাপটানি পাচ্ছেন test1 তৈরি ; সিডি পাচ্ছেন test1 ; সম্পাদন করা lib / অনুপস্থিত main.dart ; ঝাপটানি রান ):

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<Widget> widgets = [
    Text('Line 1'),
    Text('Line 2'),
    Text('Line 3'),
  ];

  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("List of Widgets Example")),
        body: Column(
          children: widgets
        )
      )
    );
  }

}

উইজেটগুলির একটি তালিকার (অ্যারেঅফ উইজেট ) মধ্যে উইজেট (ওয়ান উইজেট ) ব্যবহার করে অন্য একটি উদাহরণ । আমি দেখিয়েছি কীভাবে কোনও উইজেটকে (মাইবাটন) কোনও উইজেটকে ব্যক্তিগতকৃত করতে এবং কোডের আকার হ্রাস করতে হয়:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<Widget> arrayOfWidgets = [
    Text('My Buttons'),
    MyButton('Button 1'),
    MyButton('Button 2'),
    MyButton('Button 3'),
  ];

  Widget oneWidget(List<Widget> _lw) { return Column(children: _lw); }

  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Widget with a List of Widget's Example")),
        body: oneWidget(arrayOfWidgets)
      )
    );
  }

}

class MyButton extends StatelessWidget {
  final String text;

  MyButton(this.text);

  @override
  Widget build(BuildContext context) {
    return FlatButton(
      color: Colors.red,
      child: Text(text),
      onPressed: (){print("Pressed button '$text'.");},
    );
  }
}

আমি একটি সম্পূর্ণ উদাহরণ তৈরি করেছি যে আমি স্ক্রিনে উইজেটগুলি দেখানোর জন্য এবং লুকানোর জন্য ডায়নামিক উইজেট ব্যবহার করি , আপনি এটি ডার্ট ফ্রিডলেও অনলাইনে চলতে দেখতে পাচ্ছেন ।

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List item = [
    {"title": "Button One", "color": 50},
    {"title": "Button Two", "color": 100},
    {"title": "Button Three", "color": 200},
    {"title": "No show", "color": 0, "hide": '1'},
  ];

  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Dynamic Widget - List<Widget>"),backgroundColor: Colors.blue),
        body: Column(
          children: <Widget>[
            Center(child: buttonBar()),
            Text('Click the buttons to hide it'),
          ]
        )
      )
    );
  }

  Widget buttonBar() {
    return Column(
      children: item.where((e) => e['hide'] != '1').map<Widget>((document) {
        return new FlatButton(
          child: new Text(document['title']),
          color: Color.fromARGB(document['color'], 0, 100, 0),
          onPressed: () {
            setState(() {
              print("click on ${document['title']} lets hide it");
              final tile = item.firstWhere((e) => e['title'] == document['title']);
              tile['hide'] = '1';
            });
          },
        );
      }
    ).toList());
  }
}

হতে পারে এটি কাউকে সাহায্য করে। যদি এটি আপনার পক্ষে কার্যকর হয় তবে দয়া করে আপ তীরটিতে ক্লিক করতে আমাকে জানান। ধন্যবাদ

https://dartpad.dev/b37b08cc25e0ccdba680090e9ef4b3c1


4
এটি আর কাজ করে না বলে মনে হচ্ছে। যেমন হস্তান্তর করা যাবে না Text('My Buttons')বা List<Widget>অ্যারে। পথ The element type 'Text' can't be assigned to the list type 'Widget'। এটির জন্য কী হবে?
শাইমো

পাঠ্য একটি উইজেট এবং <উইজেট> তালিকার তালিকার একটি উপাদান হতে পারে। এই প্যাডটি https://dartpad.dev/6a908fe99f604474fd052731d59d059c দেখুন এবং এটি আপনার পক্ষে কাজ করে কিনা তা আমাকে বলুন।
lynx_74

"তালিকা <উইজেট> উপাদান উপাদান টাইপ 'উইজেট' তালিকার জন্য নির্ধারিত হতে পারে না।" আপনার প্রথম উদাহরণ থেকে আর কাজ করছে বলে মনে হচ্ছে না
পেট্রো


0

প্রতিটি আইটেমকে একটি উইজেটে রূপান্তর করতে, তালিকা-ভিউ.বিল্ডার () নির্মাতা ব্যবহার করুন।

সাধারণভাবে, একটি বিল্ডার ফাংশন সরবরাহ করুন যা আপনি কোন ধরণের আইটেমের সাথে কাজ করছেন তা যাচাই করে এবং সেই ধরণের আইটেমটির জন্য উপযুক্ত উইজেট প্রদান করে।

ListView.builder(
  // Let the ListView know how many items it needs to build.
  itemCount: items.length,
  // Provide a builder function. This is where the magic happens.
  // Convert each item into a widget based on the type of item it is.
  itemBuilder: (context, index) {
    final item = items[index];

    return ListTile(
      title: item.buildTitle(context),
      subtitle: item.buildSubtitle(context),
    );
  },
);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.